Skip to content

Commit

Permalink
Fix for #1422: type parameter provenance
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Dec 12, 2022
1 parent 312ed11 commit d150170
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,9 @@ protected void innerInterfaceDef(AST classDef) {
classNode.setGenericsTypes(genericsType);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down Expand Up @@ -885,6 +888,9 @@ protected void innerClassDef(AST classDef) {
classNode.setSyntheticPublic(syntheticPublic);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,9 @@ protected boolean resolve(ClassNode type, boolean testModuleImports, boolean tes

GenericsType genericsType = genericParameterNames.get(new GenericsTypeName(typeName));
if (genericsType != null) {
type.setRedirect(genericsType.getType());
type.setDeclaringClass(genericsType.getType().getDeclaringClass());
type.setGenericsTypes(new GenericsType[]{ genericsType });
type.setRedirect(genericsType.getType());
type.setGenericsPlaceHolder(true);
return true;
}
Expand Down Expand Up @@ -1841,7 +1842,7 @@ private void resolveGenericsHeader(GenericsType[] types, GenericsType rootType,
GenericsTypeName gtn = new GenericsTypeName(name);
ClassNode[] bounds = type.getUpperBounds();
boolean isWild = QUESTION_MARK.equals(name);
boolean toDealWithGenerics = 0 == level || (level > 0 && null != genericParameterNames.get(gtn));
boolean toDealWithGenerics = 0 == level || (level > 0 && genericParameterNames.containsKey(gtn));

if (bounds != null) {
boolean nameAdded = false;
Expand Down Expand Up @@ -1912,6 +1913,9 @@ private boolean resolveGenericsType(GenericsType genericsType) {
} else {
GenericsType gt = genericParameterNames.get(name);
type.setRedirect(gt.getType());
// GRECLIPSE add -- indicate provenance
type.setDeclaringClass(gt.getType().getDeclaringClass());
// GRECLIPSE end
genericsType.setPlaceholder(true);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,10 @@ public ClassNode visitClassDeclaration(final ClassDeclarationContext ctx) {
classNode.setSyntheticPublic(syntheticPublic);
classNode.setGenericsTypes(this.visitTypeParameters(ctx.typeParameters()));
boolean isInterfaceWithDefaultMethods = (isInterface && this.containsDefaultMethods(ctx));
// GRECLIPSE add
if (classNode.getGenericsTypes() != null)
for (GenericsType tp : classNode.getGenericsTypes()) tp.getType().setDeclaringClass(classNode);
// GRECLIPSE end

if (isInterfaceWithDefaultMethods || asBoolean(ctx.TRAIT())) {
/* GRECLIPSE edit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,9 @@ protected void innerInterfaceDef(AST classDef) {
classNode.setGenericsTypes(genericsType);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down Expand Up @@ -975,6 +978,9 @@ protected void innerClassDef(AST classDef) {
classNode.setSyntheticPublic(syntheticPublic);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -540,8 +540,9 @@ protected boolean resolve(final ClassNode type, final boolean testModuleImports,

GenericsType genericsType = genericParameterNames.get(new GenericsTypeName(typeName));
if (genericsType != null) {
type.setRedirect(genericsType.getType());
type.setDeclaringClass(genericsType.getType().getDeclaringClass());
type.setGenericsTypes(new GenericsType[]{genericsType});
type.setRedirect(genericsType.getType());
type.setGenericsPlaceHolder(true);
return true;
}
Expand Down Expand Up @@ -1822,7 +1823,7 @@ private void resolveGenericsHeader(final GenericsType[] types, final GenericsTyp
GenericsTypeName gtn = new GenericsTypeName(name);
ClassNode[] bounds = type.getUpperBounds();
boolean isWild = QUESTION_MARK.equals(name);
boolean toDealWithGenerics = 0 == level || (level > 0 && null != genericParameterNames.get(gtn));
boolean toDealWithGenerics = 0 == level || (level > 0 && genericParameterNames.containsKey(gtn));

if (bounds != null) {
boolean nameAdded = false;
Expand Down Expand Up @@ -1905,6 +1906,9 @@ private boolean resolveGenericsType(final GenericsType genericsType) {
} else {
GenericsType gt = genericParameterNames.get(name);
type.setRedirect(gt.getType());
// GRECLIPSE add -- indicate provenance
type.setDeclaringClass(gt.getType().getDeclaringClass());
// GRECLIPSE end
genericsType.setPlaceholder(true);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1556,6 +1556,10 @@ public ClassNode visitClassDeclaration(final ClassDeclarationContext ctx) {
classNode.setSyntheticPublic(syntheticPublic);
classNode.setGenericsTypes(this.visitTypeParameters(ctx.typeParameters()));
boolean isInterfaceWithDefaultMethods = (isInterface && this.containsDefaultMethods(ctx));
// GRECLIPSE add
if (classNode.getGenericsTypes() != null)
for (GenericsType tp : classNode.getGenericsTypes()) tp.getType().setDeclaringClass(classNode);
// GRECLIPSE end

if (isSealed) {
AnnotationNode sealedAnnotationNode = makeAnnotationNode(Sealed.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,9 @@ protected void innerInterfaceDef(AST classDef) {
classNode.setGenericsTypes(genericsType);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down Expand Up @@ -975,6 +978,9 @@ protected void innerClassDef(AST classDef) {
classNode.setSyntheticPublic(syntheticPublic);
configureAST(classNode, classDef);
// GRECLIPSE add
if (genericsType != null)
for (GenericsType tp: genericsType)
tp.getType().setDeclaringClass(classNode);
classNode.setNameStart(nameStart);
classNode.setNameEnd(nameEnd - 1);
// GRECLIPSE end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,8 +450,9 @@ protected boolean resolve(final ClassNode type, final boolean testModuleImports,

GenericsType typeParameter = genericParameterNames.get(new GenericsTypeName(typeName));
if (typeParameter != null) {
type.setRedirect(typeParameter.getType());
type.setDeclaringClass(typeParameter.getType().getDeclaringClass());
type.setGenericsTypes(new GenericsType[]{typeParameter});
type.setRedirect(typeParameter.getType());
type.setGenericsPlaceHolder(true);
return true;
}
Expand Down Expand Up @@ -1593,7 +1594,7 @@ private void resolveGenericsHeader(final GenericsType[] types, final GenericsTyp
ClassNode typeType = type.getType();
GenericsTypeName gtn = new GenericsTypeName(name);
boolean isWildcardGT = QUESTION_MARK.equals(name);
boolean dealWithGenerics = (level == 0 || (level > 0 && genericParameterNames.get(gtn) != null));
boolean dealWithGenerics = (level == 0 || (level > 0 && genericParameterNames.containsKey(gtn)));

if (type.getUpperBounds() != null) {
boolean nameAdded = false;
Expand Down Expand Up @@ -1646,6 +1647,9 @@ private boolean resolveGenericsType(final GenericsType genericsType) {
visitTypeAnnotations(type); // JSR-308 support
GenericsType tp = genericParameterNames.get(new GenericsTypeName(type.getName()));
if (tp != null) {
// GRECLIPSE add -- indicate provenance
type.setDeclaringClass(tp.getType().getDeclaringClass());
// GRECLIPSE end
ClassNode[] bounds = tp.getUpperBounds();
if (bounds != null && (bounds.length > 1 || (bounds[0].isRedirectNode()
&& bounds[0].redirect().getGenericsTypes() != null))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,9 +293,12 @@ public static String getTypeSignatureWithoutGenerics(ClassNode node, boolean qua

final int pos = builder.length();
builder.append(Signature.createTypeSignature(name, resolved));
if (resolved && node.isGenericsPlaceHolder())
builder.setCharAt(pos, Signature.C_TYPE_VARIABLE);

if (resolved && node.isGenericsPlaceHolder()) {
if (node.getDeclaringClass() != null) // type parameter provenance
return getTypeSignatureWithoutGenerics(node.getDeclaringClass(),qualified,true) +
Signature.C_COLON + Signature.C_TYPE_VARIABLE + builder.substring(1);
builder.setCharAt(pos, Signature.C_TYPE_VARIABLE); // replace the "L" or "Q" with "T"
}
return builder.toString();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2009-2020 the original author or authors.
* Copyright 2009-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -51,6 +51,19 @@ final class CodeSelectFieldsTests extends BrowsingTestSuite {
assertCodeSelect(['class Foo { static def x = 9\n }', 'class Bar { def y() { Foo.x++\n }\n }'], 'x')
}

@Test // https://github.com/groovy/groovy-eclipse/issues/1422
void testCodeSelectFieldInParameterizedClass() {
def elem = assertCodeSelect(['''\
|class Foo<Item extends Number> {
| private List<Item> items
| void test() {
| items
| }
|}'''.stripMargin()
], 'items')
assert elem.key == 'LFoo<LFoo;:TItem;>;.items)Ljava/util/List<LFoo;:TItem;>;'
}

@Test
void testCodeSelectLazyFieldInClass() {
assertCodeSelect(['class Foo {\n @Lazy def x = 9\n}'], 'x')
Expand Down

0 comments on commit d150170

Please sign in to comment.