IDEA-61541 Alt-enter interface creation feature request

This commit is contained in:
peter
2011-03-29 20:06:47 +02:00
parent 866e810fbe
commit 91c92dacdc
4 changed files with 20 additions and 11 deletions
@@ -36,6 +36,11 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefini
import org.jetbrains.plugins.groovy.util.LibrariesUtil;
public class NewGroovyClassAction extends JavaCreateTemplateInPackageAction<GrTypeDefinition> implements DumbAware {
public static final String GROOVY_CLASS = "GroovyClass.groovy";
public static final String GROOVY_INTERFACE = "GroovyInterface.groovy";
public static final String GROOVY_ENUM = "GroovyEnum.groovy";
public static final String GROOVY_ANNOTATION = "GroovyAnnotation.groovy";
public NewGroovyClassAction() {
super(GroovyBundle.message("newclass.menu.action.text"), GroovyBundle.message("newclass.menu.action.description"), GroovyIcons.CLASS, true);
}
@@ -44,10 +49,10 @@ public class NewGroovyClassAction extends JavaCreateTemplateInPackageAction<GrTy
protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
builder
.setTitle(GroovyBundle.message("newclass.dlg.title"))
.addKind("Class", GroovyIcons.CLASS, "GroovyClass.groovy")
.addKind("Interface", GroovyIcons.INTERFACE, "GroovyInterface.groovy")
.addKind("Enum", GroovyIcons.ENUM, "GroovyEnum.groovy")
.addKind("Annotation", GroovyIcons.ANNOTATION_TYPE, "GroovyAnnotation.groovy");
.addKind("Class", GroovyIcons.CLASS, GROOVY_CLASS)
.addKind("Interface", GroovyIcons.INTERFACE, GROOVY_INTERFACE)
.addKind("Enum", GroovyIcons.ENUM, GROOVY_ENUM)
.addKind("Annotation", GroovyIcons.ANNOTATION_TYPE, GROOVY_ANNOTATION);
}
@Override
@@ -64,16 +64,16 @@ public abstract class CreateClassActionBase implements IntentionAction {
}
public static PsiClass createClassByType(final PsiDirectory directory,
final String name,
final PsiManager manager,
final PsiElement contextElement) {
final String name,
final PsiManager manager,
final PsiElement contextElement, final String templateName) {
return ApplicationManager.getApplication().runWriteAction(
new Computable<PsiClass>() {
public PsiClass compute() {
try {
PsiClass targetClass = null;
try {
PsiFile file = GroovyTemplatesFactory.createFromTemplate(directory, name, name + ".groovy", "GroovyClass.groovy");
PsiFile file = GroovyTemplatesFactory.createFromTemplate(directory, name, name + ".groovy", templateName);
for (PsiElement element : file.getChildren()) {
if (element instanceof PsiClass) {
targetClass = ((PsiClass) element);
@@ -26,6 +26,7 @@ import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyBundle;
import org.jetbrains.plugins.groovy.actions.NewGroovyClassAction;
import org.jetbrains.plugins.groovy.intentions.base.IntentionUtils;
import org.jetbrains.plugins.groovy.lang.editor.template.expressions.ChooseTypeExpression;
import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
@@ -34,6 +35,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrImplementsClause;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrMemberOwner;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SupertypeConstraint;
@@ -61,7 +63,7 @@ public abstract class CreateClassFix {
PsiDirectory targetDirectory = getTargetDirectory(project, qualifier, name, module);
if (targetDirectory == null) return;
PsiClass targetClass = createClassByType(targetDirectory, name, manager, myRefElement);
PsiClass targetClass = createClassByType(targetDirectory, name, manager, myRefElement, NewGroovyClassAction.GROOVY_CLASS);
GrArgumentList argList = expression.getArgumentList();
if (argList != null &&
@@ -109,7 +111,8 @@ public abstract class CreateClassFix {
PsiDirectory targetDirectory = getTargetDirectory(project, qualifier, name, module);
if (targetDirectory == null) return;
PsiClass targetClass = createClassByType(targetDirectory, name, manager, myRefElement);
String templateName = myRefElement.getParent() instanceof GrImplementsClause ? NewGroovyClassAction.GROOVY_INTERFACE : NewGroovyClassAction.GROOVY_CLASS;
PsiClass targetClass = createClassByType(targetDirectory, name, manager, myRefElement, templateName);
if (targetClass != null) {
addImportForClass(groovyFile, qualifier, targetClass);
putCursor(project, targetClass.getContainingFile(), targetClass);
@@ -32,6 +32,7 @@ import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyBundle;
import org.jetbrains.plugins.groovy.actions.NewGroovyClassAction;
import org.jetbrains.plugins.groovy.annotator.intentions.CreateClassActionBase;
import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils;
import org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle;
@@ -93,7 +94,7 @@ public class ConvertMapToClassIntention extends Intention {
final GrTypeDefinition typeDefinition = createClass(project, namedArguments, selectedPackageName, shortName);
final PsiClass generatedClass = CreateClassActionBase.createClassByType(
dialog.getTargetDirectory(), typeDefinition.getName(), PsiManager.getInstance(project), map);
dialog.getTargetDirectory(), typeDefinition.getName(), PsiManager.getInstance(project), map, NewGroovyClassAction.GROOVY_CLASS);
final PsiClass replaced = (PsiClass)generatedClass.replace(typeDefinition);
replaceMapWithClass(project, map, replaced, replaceReturnType, variableDeclaration, methodParameter);
}