start live template if enum constant needs params (IDEA-19205)

This commit is contained in:
anna
2010-11-15 13:56:03 +03:00
parent 8341fac929
commit f79288c1eb
3 changed files with 82 additions and 3 deletions

View File

@@ -15,11 +15,21 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.ExpectedTypeUtil;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateBuilderImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -38,9 +48,40 @@ public class CreateEnumConstantFromUsageFix extends CreateVarFromUsageFix {
LOG.assertTrue(targetClass.isEnum());
final String name = myReferenceExpression.getReferenceName();
LOG.assertTrue(name != null);
final PsiEnumConstant enumConstant =
JavaPsiFacade.getInstance(myReferenceExpression.getProject()).getElementFactory().createEnumConstantFromText(name, null);
targetClass.add(enumConstant);
final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(myReferenceExpression.getProject()).getElementFactory();
PsiEnumConstant enumConstant = elementFactory.createEnumConstantFromText(name, null);
enumConstant = (PsiEnumConstant)targetClass.add(enumConstant);
final PsiMethod[] constructors = targetClass.getConstructors();
if (constructors.length > 0) {
final PsiMethod constructor = constructors[0];
final PsiParameter[] parameters = constructor.getParameterList().getParameters();
if (parameters.length > 0) {
final String params = StringUtil.join(parameters, new Function<PsiParameter, String>() {
@Override
public String fun(PsiParameter psiParameter) {
return psiParameter.getName();
}
}, ",");
enumConstant = (PsiEnumConstant)enumConstant.replace(elementFactory.createEnumConstantFromText(name + "(" + params + ")", null));
final TemplateBuilderImpl builder = new TemplateBuilderImpl(enumConstant);
final PsiExpressionList argumentList = enumConstant.getArgumentList();
LOG.assertTrue(argumentList != null);
for (PsiExpression expression : argumentList.getExpressions()) {
builder.replaceElement(expression, new EmptyExpression());
}
enumConstant = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(enumConstant);
final Template template = builder.buildTemplate();
final Project project = targetClass.getProject();
final Editor newEditor = positionCursor(project, targetClass.getContainingFile(), enumConstant);
final TextRange range = enumConstant.getTextRange();
newEditor.getDocument().deleteString(range.getStartOffset(), range.getEndOffset());
startTemplate(newEditor, template, project);
}
}
}

View File

@@ -0,0 +1,19 @@
// "Create Enum Constant 'D3'" "true"
public enum Demo {
D1("foo"),
D2("bar"), D3()<caret>;
private String name;
Demo(String name) {
this.name = name;
}
}
class Show {
public void doSomething() {
Demo.D3
}
}

View File

@@ -0,0 +1,19 @@
// "Create Enum Constant 'D3'" "true"
public enum Demo {
D1("foo"),
D2("bar");
private String name;
Demo(String name) {
this.name = name;
}
}
class Show {
public void doSomething() {
Demo.D<caret>3
}
}