Skip to content

Commit bff147b

Browse files
committed
GROOVY-8202, GROOVY-9971, GROOVY-10080
1 parent ca900fb commit bff147b

File tree

4 files changed

+56
-26
lines changed

4 files changed

+56
-26
lines changed

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

+28
Original file line numberDiff line numberDiff line change
@@ -2656,6 +2656,34 @@ public void testTypeChecked10067() {
26562656
runConformTest(sources);
26572657
}
26582658

2659+
@Test
2660+
public void testTypeChecked10080() {
2661+
//@formatter:off
2662+
String[] sources = {
2663+
"Main.groovy",
2664+
"@groovy.transform.TupleConstructor(defaults=false)\n" +
2665+
"class C<T> {\n" +
2666+
" T p\n" +
2667+
"}\n" +
2668+
"class D {\n" +
2669+
" int m(Object[] objects) {\n" +
2670+
" 42\n" +
2671+
" }\n" +
2672+
"}\n" +
2673+
"@groovy.transform.TypeChecked\n" +
2674+
"void test() {\n" +
2675+
" def closure = { ->\n" +
2676+
" new C<>(new D())\n" +
2677+
" }\n" +
2678+
" print(closure().p.m(new BigDecimal[0]))\n" + // Cannot find matching method Object#m(...)
2679+
"}\n" +
2680+
"test()\n",
2681+
};
2682+
//@formatter:on
2683+
2684+
runConformTest(sources, "42");
2685+
}
2686+
26592687
@Test
26602688
public void testTypeChecked10088() {
26612689
//@formatter:off

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -2639,7 +2639,7 @@ private ClassNode infer(ClassNode target, ClassNode source) {
26392639

26402640
protected ClassNode checkReturnType(final ReturnStatement statement) {
26412641
Expression expression = statement.getExpression();
2642-
/* GRECLIPSE edit -- GROOVY-9907, GROOVY-9995
2642+
/* GRECLIPSE edit -- GROOVY-9907, GROOVY-9971, GROOVY-9995, GROOVY-10080
26432643
ClassNode type = getType(expression);
26442644
26452645
if (typeCheckingContext.getEnclosingClosure() != null) {
@@ -2657,9 +2657,12 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
26572657
type = getType(expression);
26582658
}
26592659
if (typeCheckingContext.getEnclosingClosure() != null) {
2660+
ClassNode inferredReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
26602661
if (expression instanceof ConstructorCallExpression) {
2661-
ClassNode inferredClosureReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
2662-
if (inferredClosureReturnType != null) inferDiamondType((ConstructorCallExpression) expression, inferredClosureReturnType);
2662+
inferDiamondType((ConstructorCallExpression) expression, inferredReturnType != null ? inferredReturnType : DYNAMIC_TYPE);
2663+
}
2664+
if (STRING_TYPE.equals(inferredReturnType) && StaticTypeCheckingSupport.isGStringOrGStringStringLUB(type)) {
2665+
type = STRING_TYPE; // implicit "toString()" before return
26632666
}
26642667
return type;
26652668
}
@@ -2697,11 +2700,8 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
26972700
}
26982701

26992702
protected void addClosureReturnType(ClassNode returnType) {
2700-
// GRECLIPSE add -- GROOVY-8202, GROOVY-9971
2701-
if (StaticTypeCheckingSupport.isGStringOrGStringStringLUB(returnType) && STRING_TYPE.equals(
2702-
getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression()))) {
2703-
typeCheckingContext.getEnclosingClosure().addReturnType(STRING_TYPE);
2704-
} else if (!VOID_TYPE.equals(returnType))
2703+
// GRECLIPSE add -- GROOVY-8202
2704+
if (returnType != null && !returnType.equals(VOID_TYPE))
27052705
// GRECLIPSE end
27062706
typeCheckingContext.getEnclosingClosure().addReturnType(returnType);
27072707
}

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -2392,10 +2392,13 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
23922392
type = getType(expression);
23932393
}
23942394
if (typeCheckingContext.getEnclosingClosure() != null) {
2395-
// GRECLIPSE add -- GROOVY-9995
2395+
// GRECLIPSE add -- GROOVY-9971, GROOVY-9995, GROOVY-10080
2396+
ClassNode inferredReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
23962397
if (expression instanceof ConstructorCallExpression) {
2397-
ClassNode inferredClosureReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
2398-
if (inferredClosureReturnType != null) inferDiamondType((ConstructorCallExpression) expression, inferredClosureReturnType);
2398+
inferDiamondType((ConstructorCallExpression) expression, inferredReturnType != null ? inferredReturnType : DYNAMIC_TYPE);
2399+
}
2400+
if (STRING_TYPE.equals(inferredReturnType) && StaticTypeCheckingSupport.isGStringOrGStringStringLUB(type)) {
2401+
type = STRING_TYPE; // implicit "toString()" before return
23992402
}
24002403
// GRECLIPSE end
24012404
return type;
@@ -2430,11 +2433,8 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
24302433
}
24312434

24322435
protected void addClosureReturnType(final ClassNode returnType) {
2433-
// GRECLIPSE add -- GROOVY-8202, GROOVY-9971
2434-
if (StaticTypeCheckingSupport.isGStringOrGStringStringLUB(returnType) && STRING_TYPE.equals(
2435-
getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression()))) {
2436-
typeCheckingContext.getEnclosingClosure().addReturnType(STRING_TYPE);
2437-
} else if (!VOID_TYPE.equals(returnType))
2436+
// GRECLIPSE add -- GROOVY-8202
2437+
if (returnType != null && !returnType.equals(VOID_TYPE))
24382438
// GRECLIPSE end
24392439
typeCheckingContext.getEnclosingClosure().addReturnType(returnType);
24402440
}

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

+12-10
Original file line numberDiff line numberDiff line change
@@ -2305,11 +2305,20 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
23052305
type = getType(expression);
23062306
}
23072307
if (typeCheckingContext.getEnclosingClosure() != null) {
2308-
// GROOVY-9995: return ctor call with diamond operator
2308+
/* GRECLIPSE edit -- GROOVY-9971, GROOVY-9995, GROOVY-10080
23092309
if (expression instanceof ConstructorCallExpression) {
23102310
ClassNode inferredClosureReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
23112311
if (inferredClosureReturnType != null) inferDiamondType((ConstructorCallExpression) expression, inferredClosureReturnType);
23122312
}
2313+
*/
2314+
ClassNode inferredReturnType = getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression());
2315+
if (expression instanceof ConstructorCallExpression) {
2316+
inferDiamondType((ConstructorCallExpression) expression, inferredReturnType != null ? inferredReturnType : DYNAMIC_TYPE);
2317+
}
2318+
if (STRING_TYPE.equals(inferredReturnType) && isGStringOrGStringStringLUB(type)) {
2319+
type = STRING_TYPE; // convert GString to String at the point of return
2320+
}
2321+
// GRECLIPSE end
23132322
return type;
23142323
}
23152324
MethodNode enclosingMethod = typeCheckingContext.getEnclosingMethod();
@@ -2342,17 +2351,10 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
23422351
}
23432352

23442353
protected void addClosureReturnType(final ClassNode returnType) {
2345-
TypeCheckingContext.EnclosingClosure enclosingClosure = typeCheckingContext.getEnclosingClosure();
2346-
if (isGStringOrGStringStringLUB(returnType)
2347-
&& STRING_TYPE.equals(getInferredReturnType(enclosingClosure.getClosureExpression()))) {
2348-
// GROOVY-9971: convert GString to String at the point of return
2349-
enclosingClosure.addReturnType(STRING_TYPE);
23502354
// GRECLIPSE add -- GROOVY-8202
2351-
} else if (VOID_TYPE.equals(returnType)) {
2355+
if (returnType != null && !returnType.equals(VOID_TYPE))
23522356
// GRECLIPSE end
2353-
} else {
2354-
enclosingClosure.addReturnType(returnType);
2355-
}
2357+
typeCheckingContext.getEnclosingClosure().addReturnType(returnType);
23562358
}
23572359

23582360
@Override

0 commit comments

Comments
 (0)