IDEA-134978 type parameters added to GrLightMethodBuilder (used from Java)

This commit is contained in:
Daniil Ovchinnikov
2015-02-18 19:26:48 +03:00
parent 106ba612ce
commit 151e8f52c2
3 changed files with 68 additions and 36 deletions
@@ -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<String> 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<String, NamedArgumentDescriptor> 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<String, NamedArgumentDescriptor> 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<GrReflectedMethod[]>() {
@Override
public Result<GrReflectedMethod[]> 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> 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).<T>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;
}
@@ -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());
}
@@ -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> X bar(X x) { x }
}
class ConcreteClassOfTraitGenericMethod implements TraitGenericMethod {}
''')
}
void 'test generic trait with generic method no errors'() {
testHighlighting('''
trait GenericTraitGenericMethod<X> {
public <T> T bar(T a) { a }
}
class ConcreteClassGenericTraitGenericMethod implements GenericTraitGenericMethod<String> {}
class GenericClassGenericTraitGenericMethod<Y> implements GenericTraitGenericMethod<Y> {}
''')
}
void 'test generic trait no errors'() {
testHighlighting('''
trait GenericTrait<X> {
def X bar(X a) { a }
}
class GenericClassGenericTrait<Y> implements GenericTrait<Y> {}
class ConcreteClassGenericTrait implements GenericTrait<String> {}
''')
}
}