From df840047ce37fa5e7da119046faf1de70092cfac Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 19 May 2012 17:38:52 +0400 Subject: [PATCH] IDEA-86196 Groovy: Create method quickfix uses generationInfo for insertion --- .../generation/PsiGenerationInfo.java | 3 +- .../generate/GroovyGenerationInfo.java | 19 +++++----- .../intentions/CreateMethodFromUsageFix.java | 36 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/PsiGenerationInfo.java b/java/java-impl/src/com/intellij/codeInsight/generation/PsiGenerationInfo.java index 221b87d426f1..4637d362d019 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/PsiGenerationInfo.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/PsiGenerationInfo.java @@ -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 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); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyGenerationInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyGenerationInfo.java index 42b64d6af462..3d874ee370b7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyGenerationInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyGenerationInfo.java @@ -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 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 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; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateMethodFromUsageFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateMethodFromUsageFix.java index d56c45f07514..a7760c671a32 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateMethodFromUsageFix.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/CreateMethodFromUsageFix.java @@ -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 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 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();