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