From 151e8f52c2dcef17741a4a22da22bf647c584f3d Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 18 Feb 2015 19:25:17 +0300 Subject: [PATCH] IDEA-134978 type parameters added to GrLightMethodBuilder (used from Java) --- .../impl/synthetic/GrLightMethodBuilder.java | 64 ++++++++++--------- .../psi/impl/synthetic/GrMethodWrapper.java | 9 ++- ...est.groovy => Gr23HighlightingTest.groovy} | 31 ++++++++- 3 files changed, 68 insertions(+), 36 deletions(-) rename plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/{Gr2_3HighlightingTest.groovy => Gr23HighlightingTest.groovy} (91%) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java index 309f7f43a1f1..e6e92cb5f352 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightMethodBuilder.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.PsiSuperMethodImplUtil; import com.intellij.psi.impl.light.LightElement; import com.intellij.psi.impl.light.LightIdentifier; import com.intellij.psi.impl.light.LightReferenceListBuilder; +import com.intellij.psi.impl.light.LightTypeParameterListBuilder; import com.intellij.psi.presentation.java.JavaPresentationUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; @@ -55,7 +56,7 @@ import java.util.Map; /** * @author Sergey Evdokimov */ -public class GrLightMethodBuilder extends LightElement implements GrMethod, OriginInfoAwareElement { +public class GrLightMethodBuilder extends LightElement implements GrMethod, OriginInfoAwareElement { public static final Key KIND_KEY = Key.create("GrLightMethodBuilder.Key"); @@ -63,27 +64,28 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori private PsiType myReturnType = PsiType.VOID; private final GrLightModifierList myModifierList; private final GrLightParameterListBuilder myParameterList; - private Icon myBaseIcon; + private final LightTypeParameterListBuilder myTypeParameterList; + private final LightReferenceListBuilder myThrowsList; + private boolean myConstructor = false; private PsiClass myContainingClass; - private Object myMethodKind; private Map myNamedParameters = Collections.emptyMap(); - private final PsiReferenceList myThrowsList; - + + private Icon myBaseIcon; + private Object myMethodKind; private Object myData; - private boolean myConstructor; private String myOriginInfo; public GrLightMethodBuilder(PsiManager manager, String name) { super(manager, GroovyLanguage.INSTANCE); myName = name; - myParameterList = new GrLightParameterListBuilder(manager, GroovyLanguage.INSTANCE); myModifierList = new GrLightModifierList(this); - myConstructor = false; + myParameterList = new GrLightParameterListBuilder(manager, GroovyLanguage.INSTANCE); + myTypeParameterList = new LightTypeParameterListBuilder(manager, GroovyLanguage.INSTANCE); myThrowsList = new LightReferenceListBuilder(manager, GroovyLanguage.INSTANCE, PsiReferenceList.Role.THROWS_LIST); } public GrLightMethodBuilder setNamedParameters(@NotNull Map namedParameters) { - this.myNamedParameters = namedParameters; + myNamedParameters = namedParameters; return this; } @@ -100,12 +102,13 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Override @NotNull public PsiTypeParameter[] getTypeParameters() { - return PsiTypeParameter.EMPTY_ARRAY; + return getTypeParameterList().getTypeParameters(); } @Override - public PsiTypeParameterList getTypeParameterList() { - return null; + @NotNull + public LightTypeParameterListBuilder getTypeParameterList() { + return myTypeParameterList; } @Override @@ -163,28 +166,29 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori return CachedValuesManager.getCachedValue(this, new CachedValueProvider() { @Override public Result compute() { - return Result.create(GrReflectedMethodImpl.createReflectedMethods(GrLightMethodBuilder.this), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); + return Result.create(GrReflectedMethodImpl.createReflectedMethods(GrLightMethodBuilder.this), + PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); } }); } public GrLightMethodBuilder addModifier(String modifier) { - myModifierList.addModifier(modifier); + getModifierList().addModifier(modifier); return this; } public GrLightMethodBuilder addModifier(int modifier) { - myModifierList.addModifier(modifier); + getModifierList().addModifier(modifier); return this; } public GrLightMethodBuilder setModifiers(String[] modifiers) { - myModifierList.setModifiers(modifiers); + getModifierList().setModifiers(modifiers); return this; } public GrLightMethodBuilder setModifiers(int modifiers) { - myModifierList.setModifiers(modifiers); + getModifierList().setModifiers(modifiers); return this; } @@ -236,7 +240,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Override public GrParameter[] getParameters() { - return myParameterList.getParameters(); + return getParameterList().getParameters(); } @Override @@ -246,7 +250,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori } public GrLightMethodBuilder addParameter(@NotNull GrParameter parameter) { - myParameterList.addParameter(parameter); + getParameterList().addParameter(parameter); return this; } @@ -261,7 +265,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Override @NotNull - public PsiReferenceList getThrowsList() { + public LightReferenceListBuilder getThrowsList() { return myThrowsList; } @@ -282,7 +286,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Override public boolean isVarArgs() { - GrParameter[] parameters = myParameterList.getParameters(); + GrParameter[] parameters = getParameterList().getParameters(); if (parameters.length == 0) return false; return parameters[parameters.length - 1].isVarArgs(); } @@ -394,7 +398,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Override public String toString() { - return myMethodKind + ":" + getName(); + return (myMethodKind == null ? "" : myMethodKind + ":") + getName(); } @Override @@ -449,20 +453,20 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori } protected void copyData(GrLightMethodBuilder dst) { - dst.setMethodKind(myMethodKind); - dst.setData(myData); - dst.setNamedParameters(myNamedParameters); + dst.setMethodKind(getMethodKind()); + dst.setData(getData()); + dst.setNamedParameters(getNamedParameters()); if (getNavigationElement() != this) { dst.setNavigationElement(getNavigationElement()); } dst.setBaseIcon(myBaseIcon); - dst.setReturnType(myReturnType); - dst.setContainingClass(myContainingClass); + dst.setReturnType(getReturnType()); + dst.setContainingClass(getContainingClass()); dst.getModifierList().copyModifiers(this); dst.getParameterList().clear(); - for (GrParameter parameter : myParameterList.getParameters()) { + for (GrParameter parameter : getParameterList().getParameters()) { dst.addParameter(parameter); } } @@ -482,7 +486,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori @Nullable public static T getData(@Nullable PsiElement method, @NotNull Object kind) { if (method instanceof GrLightMethodBuilder) { - if (kind.equals(((GrLightMethodBuilder)method).myMethodKind)) { + if (kind.equals(((GrLightMethodBuilder)method).getMethodKind())) { return ((GrLightMethodBuilder)method).getData(); } } @@ -495,7 +499,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod, Ori } public GrLightMethodBuilder addException(PsiClassType type) { - ((LightReferenceListBuilder)myThrowsList).addReference(type); + getThrowsList().addReference(type); return this; } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrMethodWrapper.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrMethodWrapper.java index 90605135e261..8fc92bc15a7a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrMethodWrapper.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrMethodWrapper.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic; import com.intellij.psi.*; +import com.intellij.psi.impl.light.LightTypeParameter; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.impl.GrPsiTypeStub; @@ -36,15 +37,13 @@ public class GrMethodWrapper extends GrLightMethodBuilder implements PsiMirrorEl protected GrMethodWrapper(PsiMethod method, PsiSubstitutor substitutor) { super(method.getManager(), method.getName()); - myWrappedMethod = method; - setContainingClass(method.getContainingClass()); - getModifierList().copyModifiers(method); - getParameterList().copyParameters(method, substitutor, this); - + for (PsiTypeParameter parameter : method.getTypeParameters()) { + getTypeParameterList().addParameter(new LightTypeParameter(parameter)); + } if (method instanceof OriginInfoAwareElement) { setOriginInfo(((OriginInfoAwareElement)method).getOriginInfo()); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr2_3HighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr23HighlightingTest.groovy similarity index 91% rename from plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr2_3HighlightingTest.groovy rename to plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr23HighlightingTest.groovy index e0e878d54de7..af114c2eb513 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr2_3HighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/Gr23HighlightingTest.groovy @@ -24,7 +24,7 @@ import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GrUnr /** * Created by Max Medvedev on 27/02/14 */ -class Gr2_3HighlightingTest extends GrHighlightingTestBase { +class Gr23HighlightingTest extends GrHighlightingTestBase { @Override protected LightProjectDescriptor getProjectDescriptor() { return GroovyLightProjectDescriptor.GROOVY_2_3 @@ -380,6 +380,35 @@ trait E implements A {} trait F extends A implements B {} trait G implements A, B {} +''') + } + + void 'test trait with generic method no errors'() { + testHighlighting(''' +trait TraitGenericMethod { + def X bar(X x) { x } +} +class ConcreteClassOfTraitGenericMethod implements TraitGenericMethod {} +''') + } + + void 'test generic trait with generic method no errors'() { + testHighlighting(''' +trait GenericTraitGenericMethod { + public T bar(T a) { a } +} +class ConcreteClassGenericTraitGenericMethod implements GenericTraitGenericMethod {} +class GenericClassGenericTraitGenericMethod implements GenericTraitGenericMethod {} +''') + } + + void 'test generic trait no errors'() { + testHighlighting(''' +trait GenericTrait { + def X bar(X a) { a } +} +class GenericClassGenericTrait implements GenericTrait {} +class ConcreteClassGenericTrait implements GenericTrait {} ''') } }