You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/03/09 22:44:36 UTC
[groovy] 01/01: GROOVY-9974: extract generics connections:
Closure vs SAM return type
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-9974
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 8d1bb64ba3ae8da2764972a69a60787c24bff853
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Mar 9 16:44:21 2021 -0600
GROOVY-9974: extract generics connections: Closure<T> vs SAM return type
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 9 ++++++++-
src/test/groovy/transform/stc/MethodReferenceTest.groovy | 12 ++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index db1031a..875777a 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1690,12 +1690,19 @@ public abstract class StaticTypeCheckingSupport {
if (target == null || target == type || !isUsingGenericsOrIsArrayUsingGenerics(target)) return;
if (type == null || type == UNKNOWN_PARAMETER_TYPE) return;
+ MethodNode sam;
+
if (target.isGenericsPlaceHolder()) {
- connections.put(new GenericsTypeName(target.getGenericsTypes()[0].getName()), new GenericsType(type));
+ connections.put(new GenericsTypeName(target.getUnresolvedName()), new GenericsType(type));
} else if (type.isArray() && target.isArray()) {
extractGenericsConnections(connections, type.getComponentType(), target.getComponentType());
+ } else if (type.equals(CLOSURE_TYPE) && (sam = findSAM(target)) != null) {
+ // GROOVY-9974: Lambda, Closure, Pointer or Reference for SAM-type receiver
+ ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(sam.getReturnType());
+ extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {new GenericsType(returnType)});
+
} else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 095e7ae..0825849 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -98,6 +98,18 @@ final class MethodReferenceTest {
'''
}
+ @Test // class::instanceMethod -- GROOVY-9974
+ void testPredicateCI() {
+ assertScript shell, '''
+ @CompileStatic
+ void test(List<String> strings = ['']) {
+ strings.removeIf(String::isEmpty)
+ assert strings.isEmpty()
+ }
+ test()
+ '''
+ }
+
@Test // class::instanceMethod
void testBinaryOperatorCI() {
assertScript shell, '''