Skip to content

Commit 236d191

Browse files
committed
GROOVY-10102
1 parent 02b40ca commit 236d191

File tree

4 files changed

+97
-0
lines changed
  • base
    • org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait
    • org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait
    • org.codehaus.groovy40/src/org/codehaus/groovy/transform/trait
  • base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic

4 files changed

+97
-0
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/TraitsTests.java

+37
Original file line numberDiff line numberDiff line change
@@ -2767,6 +2767,43 @@ public void testTraits9938() {
27672767
runConformTest(sources, "works");
27682768
}
27692769

2770+
@Test
2771+
public void testTraits10102() {
2772+
//@formatter:off
2773+
String[] sources = {
2774+
"Script.groovy",
2775+
"import groovy.transform.*\n" +
2776+
"trait A {\n" +
2777+
" String foo = 'foo'\n" +
2778+
" String m(String s, Closure x) {\n" +
2779+
" s + x()\n" +
2780+
" }\n" +
2781+
"}\n" +
2782+
"@SelfType(A)\n" +
2783+
"trait B {\n" +
2784+
"}\n" +
2785+
"@SelfType(B)\n" +
2786+
"trait C {\n" +
2787+
"}\n" +
2788+
"@CompileStatic\n" +
2789+
"@SelfType(C)\n" +
2790+
"trait D {\n" +
2791+
" void test() {\n" +
2792+
" String s = foo\n" +
2793+
" print(m(s) {\n" +
2794+
" s.toUpperCase()\n" +
2795+
" })\n" +
2796+
" }\n" +
2797+
"}\n" +
2798+
"class X implements A, B, C, D {\n" +
2799+
"}\n" +
2800+
"new X().test()\n",
2801+
};
2802+
//@formatter:on
2803+
2804+
runConformTest(sources, "fooFOO");
2805+
}
2806+
27702807
@Test
27712808
public void testTraits10106() {
27722809
//@formatter:off

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/trait/Traits.java

+20
Original file line numberDiff line numberDiff line change
@@ -345,12 +345,26 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
345345
for (AnnotationNode annotation : annotations) {
346346
Expression value = annotation.getMember("value");
347347
if (value instanceof ClassExpression) {
348+
/* GRECLIPSE add -- GROOVY-10102
348349
selfTypes.add(value.getType());
350+
*/
351+
ClassNode selfType = value.getType();
352+
if (selfTypes.add(selfType)) {
353+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
354+
}
355+
// GRECLIPSE end
349356
} else if (value instanceof ListExpression) {
350357
List<Expression> expressions = ((ListExpression) value).getExpressions();
351358
for (Expression expression : expressions) {
352359
if (expression instanceof ClassExpression) {
360+
/* GRECLIPSE add -- GROOVY-10102
353361
selfTypes.add(expression.getType());
362+
*/
363+
ClassNode selfType = expression.getType();
364+
if (selfTypes.add(selfType)) {
365+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
366+
}
367+
// GRECLIPSE end
354368
}
355369
}
356370
}
@@ -359,13 +373,19 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
359373
if (checkInterfaces) {
360374
ClassNode[] interfaces = receiver.getInterfaces();
361375
for (ClassNode anInterface : interfaces) {
376+
// GRECLIPSE add
377+
if (!selfTypes.contains(anInterface))
378+
// GRECLIPSE end
362379
collectSelfTypes(anInterface, selfTypes, true, checkSuper);
363380
}
364381
}
365382

366383
if (checkSuper) {
367384
ClassNode superClass = receiver.getSuperClass();
368385
if (superClass != null) {
386+
// GRECLIPSE add
387+
if (!superClass.equals(ClassHelper.OBJECT_TYPE))
388+
// GRECLIPSE end
369389
collectSelfTypes(superClass, selfTypes, checkInterfaces, true);
370390
}
371391
}

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/trait/Traits.java

+20
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,26 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
338338
for (AnnotationNode annotation : annotations) {
339339
Expression value = annotation.getMember("value");
340340
if (value instanceof ClassExpression) {
341+
/* GRECLIPSE add -- GROOVY-10102
341342
selfTypes.add(value.getType());
343+
*/
344+
ClassNode selfType = value.getType();
345+
if (selfTypes.add(selfType)) {
346+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
347+
}
348+
// GRECLIPSE end
342349
} else if (value instanceof ListExpression) {
343350
List<Expression> expressions = ((ListExpression) value).getExpressions();
344351
for (Expression expression : expressions) {
345352
if (expression instanceof ClassExpression) {
353+
/* GRECLIPSE add -- GROOVY-10102
346354
selfTypes.add(expression.getType());
355+
*/
356+
ClassNode selfType = expression.getType();
357+
if (selfTypes.add(selfType)) {
358+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
359+
}
360+
// GRECLIPSE end
347361
}
348362
}
349363
}
@@ -352,13 +366,19 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
352366
if (checkInterfaces) {
353367
ClassNode[] interfaces = receiver.getInterfaces();
354368
for (ClassNode anInterface : interfaces) {
369+
// GRECLIPSE add
370+
if (!selfTypes.contains(anInterface))
371+
// GRECLIPSE end
355372
collectSelfTypes(anInterface, selfTypes, true, checkSuper);
356373
}
357374
}
358375

359376
if (checkSuper) {
360377
ClassNode superClass = receiver.getSuperClass();
361378
if (superClass != null) {
379+
// GRECLIPSE add
380+
if (!superClass.equals(ClassHelper.OBJECT_TYPE))
381+
// GRECLIPSE end
362382
collectSelfTypes(superClass, selfTypes, checkInterfaces, true);
363383
}
364384
}

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/trait/Traits.java

+20
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,26 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
338338
for (AnnotationNode annotation : annotations) {
339339
Expression value = annotation.getMember("value");
340340
if (value instanceof ClassExpression) {
341+
/* GRECLIPSE add -- GROOVY-10102
341342
selfTypes.add(value.getType());
343+
*/
344+
ClassNode selfType = value.getType();
345+
if (selfTypes.add(selfType)) {
346+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
347+
}
348+
// GRECLIPSE end
342349
} else if (value instanceof ListExpression) {
343350
List<Expression> expressions = ((ListExpression) value).getExpressions();
344351
for (Expression expression : expressions) {
345352
if (expression instanceof ClassExpression) {
353+
/* GRECLIPSE add -- GROOVY-10102
346354
selfTypes.add(expression.getType());
355+
*/
356+
ClassNode selfType = expression.getType();
357+
if (selfTypes.add(selfType)) {
358+
collectSelfTypes(selfType, selfTypes, checkInterfaces, checkSuper);
359+
}
360+
// GRECLIPSE end
347361
}
348362
}
349363
}
@@ -352,13 +366,19 @@ public static LinkedHashSet<ClassNode> collectSelfTypes(
352366
if (checkInterfaces) {
353367
ClassNode[] interfaces = receiver.getInterfaces();
354368
for (ClassNode anInterface : interfaces) {
369+
// GRECLIPSE add
370+
if (!selfTypes.contains(anInterface))
371+
// GRECLIPSE end
355372
collectSelfTypes(anInterface, selfTypes, true, checkSuper);
356373
}
357374
}
358375

359376
if (checkSuper) {
360377
ClassNode superClass = receiver.getSuperClass();
361378
if (superClass != null) {
379+
// GRECLIPSE add
380+
if (!superClass.equals(ClassHelper.OBJECT_TYPE))
381+
// GRECLIPSE end
362382
collectSelfTypes(superClass, selfTypes, checkInterfaces, true);
363383
}
364384
}

0 commit comments

Comments
 (0)