mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-86196 Groovy: Create method quickfix uses generationInfo for insertion
This commit is contained in:
@@ -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);
|
||||
|
||||
+9
-10
@@ -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;
|
||||
}
|
||||
|
||||
+18
-18
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user