IDEA-86196 Groovy: Create method quickfix uses generationInfo for insertion

This commit is contained in:
Maxim.Medvedev
2012-05-21 11:44:22 +04:00
parent c8d582d406
commit df840047ce
3 changed files with 29 additions and 29 deletions
@@ -20,6 +20,7 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author peter
@@ -43,7 +44,7 @@ public class PsiGenerationInfo<T extends PsiMember> extends GenerationInfoBase i
return myMember;
}
public void insert(final PsiClass aClass, PsiElement anchor, boolean before) throws IncorrectOperationException {
public void insert(@NotNull final PsiClass aClass, @Nullable PsiElement anchor, boolean before) throws IncorrectOperationException {
final PsiMember existingMember;
if (myMember instanceof PsiField) {
existingMember = aClass.findFieldByName(myMember.getName(), false);
@@ -23,8 +23,10 @@ import com.intellij.openapi.editor.ScrollType;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMember;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.GrReferenceAdjuster;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
@@ -34,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
import static org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil.isWhiteSpace;
@@ -52,7 +55,7 @@ public class GroovyGenerationInfo<T extends PsiMember> extends PsiGenerationInfo
}
@Override
public void insert(PsiClass aClass, PsiElement anchor, boolean before) throws IncorrectOperationException {
public void insert(@NotNull PsiClass aClass, @Nullable PsiElement anchor, boolean before) throws IncorrectOperationException {
super.insert(aClass, anchor, before);
final T member = getPsiMember();
@@ -76,20 +79,16 @@ public class GroovyGenerationInfo<T extends PsiMember> extends PsiGenerationInfo
@Override
public PsiElement findInsertionAnchor(@NotNull PsiClass aClass, @NotNull PsiElement leaf) {
PsiElement element = leaf;
if (element.getParent() != aClass) {
while (element.getParent().getParent() != aClass) {
element = element.getParent();
}
}
PsiElement parent = aClass instanceof GroovyScriptClass ? aClass.getContainingFile() : ((GrTypeDefinition)aClass).getBody();
final GrTypeDefinition typeDefinition = (GrTypeDefinition)aClass;
PsiElement lBrace = typeDefinition.getLBrace();
PsiElement element = PsiTreeUtil.findPrevParent(parent, leaf);
PsiElement lBrace = aClass.getLBrace();
if (lBrace == null) {
return null;
}
else {
PsiElement rBrace = typeDefinition.getRBrace();
PsiElement rBrace = aClass.getRBrace();
if (!GenerateMembersUtil.isChildInRange(element, lBrace.getNextSibling(), rBrace)) {
return null;
}
@@ -15,6 +15,8 @@
*/
package org.jetbrains.plugins.groovy.annotator.intentions;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.codeInsight.generation.PsiGenerationInfo;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -22,11 +24,11 @@ import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
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.GroovyFileType;
import org.jetbrains.plugins.groovy.intentions.base.IntentionUtils;
import org.jetbrains.plugins.groovy.lang.editor.template.expressions.ChooseTypeExpression;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider;
@@ -75,28 +77,26 @@ public class CreateMethodFromUsageFix implements IntentionAction {
ChooseTypeExpression[] paramTypesExpressions = setupParams(method, argTypes, factory);
TypeConstraint[] constraints = GroovyExpectedTypesProvider.calculateTypeConstraints((GrExpression)myRefExpression.getParent());
PsiElement parent = myTargetClass instanceof GroovyScriptClass
? ((GroovyScriptClass)myTargetClass).getContainingFile()
: myTargetClass;
if (PsiTreeUtil.isAncestor(parent, myRefExpression, false)) {
PsiElement prevParent = PsiTreeUtil.findPrevParent(parent, myRefExpression);
PsiElement sibling = PsiUtil.skipWhitespaces(prevParent.getNextSibling(), true);
if (sibling != null && GroovyTokenTypes.mSEMI.equals(sibling.getNode().getElementType())) {
sibling = sibling.getNextSibling();
}
else {
sibling = prevParent.getNextSibling();
}
method = (PsiMethod)myTargetClass.addAfter(method, sibling);
}
else {
method = (PsiMethod)myTargetClass.add(method);
}
final PsiGenerationInfo<PsiMethod> info = OverrideImplementUtil.createGenerationInfo(method);
info.insert(myTargetClass, findInsertionAnchor(info), true);
method = info.getPsiMember();
final PsiElement context = PsiTreeUtil.getParentOfType(myRefExpression, PsiClass.class, PsiMethod.class);
IntentionUtils.createTemplateForMethod(argTypes, paramTypesExpressions, method, myTargetClass, constraints, false, context);
}
@Nullable
private PsiElement findInsertionAnchor(PsiGenerationInfo<PsiMethod> info) {
PsiElement parent = myTargetClass instanceof GroovyScriptClass ? ((GroovyScriptClass)myTargetClass).getContainingFile() : myTargetClass;
if (PsiTreeUtil.isAncestor(parent, myRefExpression, false)) {
return info.findInsertionAnchor(myTargetClass, myRefExpression);
}
else {
return null;
}
}
private ChooseTypeExpression[] setupParams(PsiMethod method, PsiType[] argTypes, JVMElementFactory factory) {
final PsiParameterList parameterList = method.getParameterList();