Skip to content

Commit 8a5c8ff

Browse files
committed
GROOVY-8034
1 parent 202b94e commit 8a5c8ff

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,41 @@ public void testTypeChecked7945() {
437437
"----------\n");
438438
}
439439

440+
@Test
441+
public void testTypeChecked8034() {
442+
//@formatter:off
443+
String[] sources = {
444+
"Test.groovy",
445+
"class A<I, O> {\n" +
446+
" def <IO extends A<? super O, ?>> IO andThen(IO next) {\n" +
447+
" next\n" +
448+
" }\n" +
449+
"}\n" +
450+
"@groovy.transform.TypeChecked\n" +
451+
"void test() {\n" +
452+
" def a1 = new A<String , Integer>()\n" +
453+
" def a2 = new A<Integer, Double >()\n" +
454+
" def a3 = new A<Double , String >()\n" +
455+
" def a4 = new A<String , Double >()\n" +
456+
" def a5 = new A<Number , Object >()\n" +
457+
" \n" +
458+
" a1.andThen(a2)\n" +
459+
" a2.andThen(a3)\n" +
460+
" a3.andThen(a4)\n" +
461+
" a4.andThen(a5)\n" +
462+
" \n" +
463+
" a1.andThen(a2)\n" +
464+
" .andThen(a3)\n" +
465+
" .andThen(a4)\n" +
466+
" .andThen(a5)\n" +
467+
"}\n" +
468+
"test()\n",
469+
};
470+
//@formatter:on
471+
472+
runNegativeTest(sources, "");
473+
}
474+
440475
@Test
441476
public void testTypeChecked8103() {
442477
//@formatter:off
@@ -468,7 +503,7 @@ public void testTypeChecked8103() {
468503
" Ours isSimilarTo(String json) { return this }\n" +
469504
" }\n" +
470505
" static Ours factory(String json) { new Ours() }\n" +
471-
"}",
506+
"}\n",
472507
};
473508
//@formatter:on
474509

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,9 +1456,18 @@ protected static boolean typeCheckMethodArgumentWithGenerics(ClassNode parameter
14561456
}
14571457

14581458
static void addMethodLevelDeclaredGenerics(MethodNode method, Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
1459+
/* GRECLIPSE edit
14591460
ClassNode dummy = OBJECT_TYPE.getPlainNodeReference();
14601461
dummy.setGenericsTypes(method.getGenericsTypes());
14611462
GenericsUtils.extractPlaceholders(dummy, resolvedPlaceholders);
1463+
*/
1464+
GenericsType[] generics = method.getGenericsTypes();
1465+
if (!method.isStatic() && !resolvedPlaceholders.isEmpty()) {
1466+
// GROOVY-8034: non-static method may use class generics
1467+
generics = applyGenericsContext(resolvedPlaceholders, generics);
1468+
}
1469+
GenericsUtils.extractPlaceholders(GenericsUtils.makeClassSafe0(OBJECT_TYPE, generics), resolvedPlaceholders);
1470+
// GRECLIPSE end
14621471
}
14631472

14641473
protected static boolean typeCheckMethodsWithGenerics(ClassNode receiver, ClassNode[] arguments, MethodNode candidateMethod) {

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,9 +1387,18 @@ protected static boolean typeCheckMethodArgumentWithGenerics(final ClassNode par
13871387
}
13881388

13891389
static void addMethodLevelDeclaredGenerics(final MethodNode method, final Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
1390+
/* GRECLIPSE edit
13901391
ClassNode dummy = OBJECT_TYPE.getPlainNodeReference();
13911392
dummy.setGenericsTypes(method.getGenericsTypes());
13921393
GenericsUtils.extractPlaceholders(dummy, resolvedPlaceholders);
1394+
*/
1395+
GenericsType[] generics = method.getGenericsTypes();
1396+
if (!method.isStatic() && !resolvedPlaceholders.isEmpty()) {
1397+
// GROOVY-8034: non-static method may use class generics
1398+
generics = applyGenericsContext(resolvedPlaceholders, generics);
1399+
}
1400+
GenericsUtils.extractPlaceholders(GenericsUtils.makeClassSafe0(OBJECT_TYPE, generics), resolvedPlaceholders);
1401+
// GRECLIPSE end
13931402
}
13941403

13951404
protected static boolean typeCheckMethodsWithGenerics(final ClassNode receiver, final ClassNode[] argumentTypes, final MethodNode candidateMethod) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,7 +1386,16 @@ protected static boolean typeCheckMethodArgumentWithGenerics(final ClassNode par
13861386
}
13871387

13881388
static void addMethodLevelDeclaredGenerics(final MethodNode method, final Map<GenericsTypeName, GenericsType> placeholders) {
1389+
/* GRECLIPSE edit
13891390
ClassNode dummy = GenericsUtils.makeClassSafe0(OBJECT_TYPE, method.getGenericsTypes());
1391+
*/
1392+
GenericsType[] generics = method.getGenericsTypes();
1393+
if (!method.isStatic() && !placeholders.isEmpty()) {
1394+
// GROOVY-8034: non-static method may use class generics
1395+
generics = applyGenericsContext(placeholders, generics);
1396+
}
1397+
ClassNode dummy = GenericsUtils.makeClassSafe0(OBJECT_TYPE, generics);
1398+
// GRECLIPSE end
13901399
GenericsUtils.extractPlaceholders(dummy, placeholders);
13911400
}
13921401

0 commit comments

Comments
 (0)