Skip to content

Commit 040a09c

Browse files
committed
GROOVY-10052
1 parent 0eb2a0f commit 040a09c

File tree

4 files changed

+35
-14
lines changed

4 files changed

+35
-14
lines changed

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

+21
Original file line numberDiff line numberDiff line change
@@ -2289,4 +2289,25 @@ public void testTypeChecked10051() {
22892289

22902290
runConformTest(sources, "[]");
22912291
}
2292+
2293+
@Test
2294+
public void testTypeChecked10052() {
2295+
//@formatter:off
2296+
String[] sources = {
2297+
"Main.groovy",
2298+
"@groovy.transform.TypeChecked\n" +
2299+
"void test() {\n" +
2300+
" String x = Optional.of('x').orElseThrow({ new Exception() })\n" +
2301+
" def f = { ->\n" +
2302+
" String y = Optional.of('y').orElseThrow({ new Exception() })\n" +
2303+
" }\n" +
2304+
" print x\n" +
2305+
" print f()\n" +
2306+
"}\n" +
2307+
"test()\n",
2308+
};
2309+
//@formatter:on
2310+
2311+
runConformTest(sources, "xy");
2312+
}
22922313
}

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -1896,8 +1896,12 @@ static void extractGenericsConnections(Map<GenericsTypeName, GenericsType> conne
18961896
// GRECLIPSE add
18971897
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
18981898
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1899-
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1900-
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1899+
ClassNode returnType = sam.getReturnType();
1900+
if (returnType.isGenericsPlaceHolder()) { // GROOVY-10052
1901+
returnType = GenericsUtils.findActualTypeByGenericsPlaceholderName(returnType.getUnresolvedName(),
1902+
GenericsUtils.makeDeclaringAndActualGenericsTypeMapOfExactType(sam.getDeclaringClass(), target));
1903+
}
1904+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {StaticTypeCheckingVisitor.wrapTypeIfNecessary(returnType).asGenericsType()});
19011905
// GRECLIPSE end
19021906
} else if (target.isGenericsPlaceHolder() || type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
19031907
// structural match route

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

+4-6
Original file line numberDiff line numberDiff line change
@@ -1806,18 +1806,16 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
18061806
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
18071807
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
18081808

1809-
MethodNode sam;
1810-
18111809
if (target.isGenericsPlaceHolder()) {
18121810
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
18131811

18141812
} else if (type.isArray() && target.isArray()) {
18151813
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
18161814

1817-
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
1818-
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1819-
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1820-
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1815+
} else if (type.equals(CLOSURE_TYPE) && isSAMType(target)) {
1816+
// GROOVY-9974, GROOVY-10052: Lambda, Closure, Pointer or Reference for SAM-type receiver
1817+
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(GenericsUtils.parameterizeSAM(target).getV2());
1818+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {returnType.asGenericsType()});
18211819

18221820
} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
18231821
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());

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

+4-6
Original file line numberDiff line numberDiff line change
@@ -1748,18 +1748,16 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
17481748
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
17491749
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
17501750

1751-
MethodNode sam;
1752-
17531751
if (target.isGenericsPlaceHolder()) {
17541752
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
17551753

17561754
} else if (type.isArray() && target.isArray()) {
17571755
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
17581756

1759-
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
1760-
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1761-
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1762-
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1757+
} else if (type.equals(CLOSURE_TYPE) && isSAMType(target)) {
1758+
// GROOVY-9974, GROOVY-10052: Lambda, Closure, Pointer or Reference for SAM-type receiver
1759+
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(GenericsUtils.parameterizeSAM(target).getV2());
1760+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {returnType.asGenericsType()});
17631761

17641762
} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
17651763
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());

0 commit comments

Comments
 (0)