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/29 17:35:58 UTC

[groovy] branch GROOVY_3_0_X updated: 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_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new f745b82  GROOVY-9974: extract generics connections: Closure<T> vs SAM return type
f745b82 is described below

commit f745b826d75c451f0bf3ed8084320cbe1f491b35
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     | 13 ++++++++++---
 src/test/groovy/transform/stc/MethodReferenceTest.groovy    | 12 ++++++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)

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 2c3db53..ba2de6b 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -20,7 +20,6 @@ package org.codehaus.groovy.transform.stc;
 
 import org.apache.groovy.util.Maps;
 import org.codehaus.groovy.GroovyBugError;
-import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.GenericsType;
 import org.codehaus.groovy.ast.GenericsType.GenericsTypeName;
@@ -95,6 +94,7 @@ import static org.codehaus.groovy.ast.ClassHelper.boolean_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.byte_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.findSAM;
 import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.getUnwrapper;
 import static org.codehaus.groovy.ast.ClassHelper.getWrapper;
@@ -915,7 +915,7 @@ public abstract class StaticTypeCheckingSupport {
             return dist;
         }
 
-        ClassNode ref = isPrimitiveType(receiver) && !isPrimitiveType(compare) ? ClassHelper.getWrapper(receiver) : receiver;
+        ClassNode ref = isPrimitiveType(receiver) && !isPrimitiveType(compare) ? getWrapper(receiver) : receiver;
         while (ref != null) {
             if (compare.equals(ref)) {
                 break;
@@ -1689,12 +1689,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 7e2ebbd..4e00072 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -96,6 +96,18 @@ class MethodReferenceTest extends GroovyTestCase {
         '''
     }
 
+    // class::instanceMethod -- GROOVY-9974
+    void testPredicateCI() {
+        assertScript '''
+            @groovy.transform.CompileStatic
+            void test(List<String> strings = ['']) {
+                strings.removeIf(String::isEmpty)
+                assert strings.isEmpty()
+            }
+            test()
+        '''
+    }
+
     // class::instanceMethod
     void testBinaryOperatorCI() {
         assertScript '''