Skip to content

Commit d58fda3

Browse files
committed
GROOVY-9971
1 parent f863d7e commit d58fda3

File tree

10 files changed

+1322
-1
lines changed

10 files changed

+1322
-1
lines changed

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

+23
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,29 @@ public void testTypeChecked9970() {
16241624
runConformTest(sources, "");
16251625
}
16261626

1627+
@Test
1628+
public void testTypeChecked9971() {
1629+
//@formatter:off
1630+
String[] sources = {
1631+
"Main.groovy",
1632+
"def m(Closure<String> block) {\n" +
1633+
" block.call()\n" +
1634+
"}\n" +
1635+
"@groovy.transform.TypeChecked\n" +
1636+
"void test() {\n" +
1637+
" final x = 123\n" +
1638+
" Closure<String> c = { \"x=$x\" }\n" +
1639+
" print c.call().class.name\n" +
1640+
" print((m { \"x=$x\" }).class.name)\n" +
1641+
" assert m { -> \"x=$x\" } == 'x=123'\n" +
1642+
"}\n" +
1643+
"test()\n",
1644+
};
1645+
//@formatter:on
1646+
1647+
runConformTest(sources, "java.lang.Stringjava.lang.String");
1648+
}
1649+
16271650
@Test
16281651
public void testTypeChecked9972() {
16291652
//@formatter:off

base/org.codehaus.groovy25/.checkstyle

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<file-match-pattern match-pattern="groovy/classgen/asm/BinaryExpressionHelper.java" include-pattern="false" />
4848
<file-match-pattern match-pattern="groovy/classgen/asm/BytecodeHelper.java" include-pattern="false" />
4949
<file-match-pattern match-pattern="groovy/classgen/asm/CallSiteWriter.java" include-pattern="false" />
50+
<file-match-pattern match-pattern="groovy/classgen/asm/ClosureWriter.java" include-pattern="false" />
5051
<file-match-pattern match-pattern="groovy/classgen/asm/CompileStack.java" include-pattern="false" />
5152
<file-match-pattern match-pattern="groovy/classgen/asm/InvocationWriter.java" include-pattern="false" />
5253
<file-match-pattern match-pattern="groovy/classgen/asm/StatementMetaTypeChooser.java" include-pattern="false" />

base/org.codehaus.groovy25/src/org/codehaus/groovy/classgen/asm/ClosureWriter.java

+402
Large diffs are not rendered by default.

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

+14-1
Original file line numberDiff line numberDiff line change
@@ -1063,7 +1063,7 @@ private static boolean isFunctionalInterface(final ClassNode type) {
10631063

10641064
private void processFunctionalInterfaceAssignment(final ClassNode lhsType, final Expression rhsExpression) {
10651065
if (rhsExpression instanceof ClosureExpression) {
1066-
MethodNode abstractMethod = ClassHelper.findSAM(lhsType);
1066+
MethodNode abstractMethod = findSAM(lhsType);
10671067
Map<GenericsType, GenericsType> mappings = GenericsUtils.makeDeclaringAndActualGenericsTypeMapOfExactType(abstractMethod.getDeclaringClass(), lhsType);
10681068
Function<ClassNode, ClassNode> resolver = t -> t.isGenericsPlaceHolder() ? GenericsUtils.findActualTypeByGenericsPlaceholderName(t.getUnresolvedName(), mappings) : t;
10691069

@@ -2581,6 +2581,11 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
25812581
}
25822582

25832583
protected void addClosureReturnType(ClassNode returnType) {
2584+
// GRECLIPSE add -- GROOVY-9971
2585+
if (StaticTypeCheckingSupport.isGStringOrGStringStringLUB(returnType) && STRING_TYPE.equals(
2586+
getInferredReturnType(typeCheckingContext.getEnclosingClosure().getClosureExpression())))
2587+
returnType = STRING_TYPE;
2588+
// GRECLIPSE end
25842589
typeCheckingContext.getEnclosingClosure().addReturnType(returnType);
25852590
}
25862591

@@ -3153,6 +3158,14 @@ protected void visitMethodCallArguments(final ClassNode receiver, ArgumentListEx
31533158
} else {
31543159
inferClosureParameterTypes(receiver, newArgs, (ClosureExpression) expression, param, selectedMethod);
31553160
}
3161+
// GRECLIPSE add -- GROOVY-9971
3162+
ClassNode targetType = param.getType();
3163+
if (isFunctionalInterface(targetType)) {
3164+
processFunctionalInterfaceAssignment(targetType, expression);
3165+
} else if (isClosureWithType(targetType)) {
3166+
storeInferredReturnType(expression, getCombinedBoundType(targetType.getGenericsTypes()[0]));
3167+
}
3168+
// GRECLIPSE end
31563169
}
31573170
expression.visit(this);
31583171
if (expression.getNodeMetaData(StaticTypesMarker.DELEGATION_METADATA) != null) {

base/org.codehaus.groovy30/.checkstyle

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<file-match-pattern match-pattern="groovy/classgen/ReturnAdder.java" include-pattern="false" />
4747
<file-match-pattern match-pattern="groovy/classgen/Verifier.java" include-pattern="false" />
4848
<file-match-pattern match-pattern="groovy/classgen/asm/CallSiteWriter.java" include-pattern="false" />
49+
<file-match-pattern match-pattern="groovy/classgen/asm/ClosureWriter.java" include-pattern="false" />
4950
<file-match-pattern match-pattern="groovy/classgen/asm/CompileStack.java" include-pattern="false" />
5051
<file-match-pattern match-pattern="groovy/classgen/asm/InvocationWriter.java" include-pattern="false" />
5152
<file-match-pattern match-pattern="groovy/classgen/asm/StatementMetaTypeChooser.java" include-pattern="false" />

0 commit comments

Comments
 (0)