Skip to content

Commit 878d269

Browse files
committed
GROOVY-7789
1 parent 3c720d9 commit 878d269

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

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

+33
Original file line numberDiff line numberDiff line change
@@ -1578,6 +1578,39 @@ public void testTypeChecked7753() {
15781578
runConformTest(sources, "[X]");
15791579
}
15801580

1581+
@Test
1582+
public void testTypeChecked7789() {
1583+
//@formatter:off
1584+
String[] sources = {
1585+
"Main.groovy",
1586+
"import groovy.transform.stc.*\n" +
1587+
"@groovy.transform.TypeChecked\n" +
1588+
"void test() {\n" +
1589+
" def list_size = this.<List>wrap({ list -> list.size() })\n" +
1590+
" print list_size([])\n" +
1591+
"}\n" +
1592+
"def <U> Monad<U> wrap(@ClosureParams(value=FromString, options='U') Closure c) {\n" +
1593+
" new Monad<>(c)\n" +
1594+
"}\n" +
1595+
"test()\n",
1596+
1597+
"Monad.groovy",
1598+
"import groovy.transform.stc.*\n" +
1599+
"class Monad<T> {\n" +
1600+
" private final Closure c\n" +
1601+
" Monad(@ClosureParams(value=FromString, options='T') Closure c) {\n" +
1602+
" this.c = c\n" +
1603+
" }\n" +
1604+
" def call(T t) {\n" +
1605+
" c.call(t)\n" +
1606+
" }\n" +
1607+
"}\n",
1608+
};
1609+
//@formatter:on
1610+
1611+
runConformTest(sources, "0");
1612+
}
1613+
15811614
@Test
15821615
public void testTypeChecked7804() {
15831616
//@formatter:off

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -3702,7 +3702,13 @@ private ClassNode[] resolveGenericsFromTypeHint(final ClassNode receiver, final
37023702
dummyMN.setDeclaringClass(orig.getDeclaringClass());
37033703
dummyMN.setGenericsTypes(orig.getGenericsTypes());
37043704
}
3705-
ClassNode returnType = inferReturnTypeGenerics(receiver, dummyMN, arguments);
3705+
GenericsType[] typeArguments = null; // GROOVY-7789
3706+
Expression emc = typeCheckingContext.getEnclosingMethodCall();
3707+
if (emc instanceof MethodCallExpression) {
3708+
MethodCallExpression call = (MethodCallExpression) emc;
3709+
if (arguments == call.getArguments()) typeArguments = call.getGenericsTypes();
3710+
}
3711+
ClassNode returnType = inferReturnTypeGenerics(receiver, dummyMN, arguments, typeArguments);
37063712
GenericsType[] returnTypeGenerics = returnType.getGenericsTypes();
37073713
ClassNode[] inferred = new ClassNode[returnTypeGenerics.length];
37083714
for (int i = 0, n = returnTypeGenerics.length; i < n; i += 1) {

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -3459,7 +3459,13 @@ private ClassNode[] resolveGenericsFromTypeHint(final ClassNode receiver, final
34593459
dummyMN.setDeclaringClass(orig.getDeclaringClass());
34603460
dummyMN.setGenericsTypes(orig.getGenericsTypes());
34613461
}
3462-
ClassNode returnType = inferReturnTypeGenerics(receiver, dummyMN, arguments);
3462+
GenericsType[] typeArguments = null; // GROOVY-7789
3463+
Expression emc = typeCheckingContext.getEnclosingMethodCall();
3464+
if (emc instanceof MethodCallExpression) {
3465+
MethodCallExpression call = (MethodCallExpression) emc;
3466+
if (arguments == call.getArguments()) typeArguments = call.getGenericsTypes();
3467+
}
3468+
ClassNode returnType = inferReturnTypeGenerics(receiver, dummyMN, arguments, typeArguments);
34633469
GenericsType[] returnTypeGenerics = returnType.getGenericsTypes();
34643470
ClassNode[] inferred = new ClassNode[returnTypeGenerics.length];
34653471
for (int i = 0, n = returnTypeGenerics.length; i < n; i += 1) {

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -3194,7 +3194,14 @@ private void resolveGenericsFromTypeHint(final ClassNode receiver, final Express
31943194
methodNode.setGenericsTypes(selectedMethod.getGenericsTypes());
31953195
}
31963196

3197-
returnType = inferReturnTypeGenerics(receiver, methodNode, arguments);
3197+
GenericsType[] typeArguments = null; // GROOVY-7789
3198+
Expression emc = typeCheckingContext.getEnclosingMethodCall();
3199+
if (emc instanceof MethodCallExpression) {
3200+
MethodCallExpression call = (MethodCallExpression) emc;
3201+
if (arguments == call.getArguments()) typeArguments = call.getGenericsTypes();
3202+
}
3203+
3204+
returnType = inferReturnTypeGenerics(receiver, methodNode, arguments, typeArguments);
31983205
GenericsType[] returnTypeGenerics = returnType.getGenericsTypes();
31993206
for (int i = 0, n = returnTypeGenerics.length; i < n; i += 1) {
32003207
GenericsType gt = returnTypeGenerics[i];

0 commit comments

Comments
 (0)