Skip to content

Commit a8c2423

Browse files
committed
GROOVY-9974
1 parent 009ed38 commit a8c2423

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

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

+19
Original file line numberDiff line numberDiff line change
@@ -1243,4 +1243,23 @@ public void testTypeChecked9972c() {
12431243

12441244
runConformTest(sources, "");
12451245
}
1246+
1247+
@Test
1248+
public void testTypeChecked9974() {
1249+
//@formatter:off
1250+
String[] sources = {
1251+
"Main.groovy",
1252+
"boolean isBlank(String s) {\n" +
1253+
" s.isAllWhitespace()\n" +
1254+
"}\n" +
1255+
"@groovy.transform.TypeChecked\n" +
1256+
"void test() {\n" +
1257+
" print([''].removeIf(this.&isBlank))\n" +
1258+
"}\n" +
1259+
"test()\n",
1260+
};
1261+
//@formatter:on
1262+
1263+
runConformTest(sources, "true");
1264+
}
12461265
}

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -1790,12 +1790,21 @@ private static boolean equalIncludingGenerics(ClassNode orig, ClassNode copy) {
17901790
static void extractGenericsConnections(Map<GenericsTypeName, GenericsType> connections, ClassNode type, ClassNode target) {
17911791
if (target == null || type == target || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
17921792
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
1793+
1794+
MethodNode sam;
1795+
17931796
if (type.isArray() && target.isArray()) {
17941797
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
1798+
// GRECLIPSE add
1799+
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
1800+
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1801+
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1802+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1803+
// GRECLIPSE end
17951804
} else if (target.isGenericsPlaceHolder() || type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
17961805
// structural match route
17971806
if (target.isGenericsPlaceHolder()) {
1798-
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
1807+
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
17991808
} else {
18001809
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
18011810
}

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -1715,12 +1715,21 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
17151715
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
17161716
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
17171717

1718+
MethodNode sam;
1719+
17181720
if (target.isGenericsPlaceHolder()) {
1719-
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
1721+
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
17201722

17211723
} else if (type.isArray() && target.isArray()) {
17221724
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
17231725

1726+
// GRECLIPSE add
1727+
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
1728+
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1729+
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1730+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1731+
// GRECLIPSE end
1732+
17241733
} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
17251734
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
17261735

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -1713,12 +1713,21 @@ static void extractGenericsConnections(final Map<GenericsTypeName, GenericsType>
17131713
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
17141714
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
17151715

1716+
MethodNode sam;
1717+
17161718
if (target.isGenericsPlaceHolder()) {
1717-
connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
1719+
connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
17181720

17191721
} else if (type.isArray() && target.isArray()) {
17201722
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
17211723

1724+
// GRECLIPSE add
1725+
} else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
1726+
// GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
1727+
ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
1728+
extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
1729+
// GRECLIPSE end
1730+
17221731
} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
17231732
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
17241733

0 commit comments

Comments
 (0)