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, '''