You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/10/09 05:18:22 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-9762: if not ClassExpression, use TypeChooser to find target type (port to 3_0_X)

This is an automated email from the ASF dual-hosted git repository.

paulk 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 5c32d23  GROOVY-9762: if not ClassExpression, use TypeChooser to find target type (port to 3_0_X)
5c32d23 is described below

commit 5c32d23cfd43498f696b8bef66828638764389d3
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Oct 6 11:11:06 2020 -0500

    GROOVY-9762: if not ClassExpression, use TypeChooser to find target type (port to 3_0_X)
---
 .../sc/StaticTypesMethodReferenceExpressionWriter.java  | 12 +++++++-----
 src/test/groovy/transform/stc/GenericsSTCTest.groovy    | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
index 1b9bb99..9e758bc 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
@@ -98,12 +98,14 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
         boolean isInterface = classNode.isInterface();
 
         Expression typeOrTargetRef = methodReferenceExpression.getExpression();
-        ClassNode typeOrTargetRefType = typeOrTargetRef.getType();
-        String methodRefName = methodReferenceExpression.getMethodName().getText();
+        boolean isClassExpression = (typeOrTargetRef instanceof ClassExpression);
+        ClassNode typeOrTargetRefType = isClassExpression ? typeOrTargetRef.getType()
+                : controller.getTypeChooser().resolveType(typeOrTargetRef, classNode);
 
         ClassNode[] methodReferenceParamTypes = methodReferenceExpression.getNodeMetaData(CLOSURE_ARGUMENTS);
         Parameter[] parametersWithExactType = createParametersWithExactType(abstractMethodNode, methodReferenceParamTypes);
 
+        String methodRefName = methodReferenceExpression.getMethodName().getText();
         boolean isConstructorReference = isConstructorReference(methodRefName);
 
         MethodNode methodRefMethod;
@@ -263,9 +265,9 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
     private String createAbstractMethodDesc(ClassNode functionalInterfaceType, Expression methodRef) {
         List<Parameter> methodReferenceSharedVariableList = new LinkedList<>();
 
-        if (!(isClassExpr(methodRef))) {
-            ClassNode methodRefTargetType = methodRef.getType();
-            prependParameter(methodReferenceSharedVariableList, METHODREF_EXPR_INSTANCE, methodRefTargetType);
+        if (!(methodRef instanceof ClassExpression)) {
+            prependParameter(methodReferenceSharedVariableList, METHODREF_EXPR_INSTANCE,
+                controller.getTypeChooser().resolveType(methodRef, controller.getClassNode()));
         }
 
         return BytecodeHelper.getMethodDescriptor(functionalInterfaceType.redirect(), methodReferenceSharedVariableList.toArray(Parameter.EMPTY_ARRAY));
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index a46a355..72b5272 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -626,6 +626,23 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-9762
+    void testShouldUseMethodGenericType7() {
+        for (toList in ['{ list(it) }', 'o -> list(o)', 'this.&list', 'this::list']) {
+            assertScript """
+                def <T> List<T> list(T item) {
+                    return [item]
+                }
+                def test() {
+                    Optional<Integer> opt = Optional.ofNullable(1)
+                    List<Integer> ret = opt.map($toList).get()
+                    return ret
+                }
+                assert test() == [1]
+            """
+        }
+    }
+
     // GROOVY-5516
     void testAddAllWithCollectionShouldBeAllowed() {
         assertScript '''import org.codehaus.groovy.transform.stc.ExtensionMethodNode