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 2019/04/08 12:58:58 UTC

[groovy] 06/20: Create parameters of dynamic type for constructed lambda expression

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

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit c3f4fd8288ffe7662fdf87de3beeef13058f4e41
Author: Daniel Sun <su...@apache.org>
AuthorDate: Wed Mar 6 22:39:47 2019 +0800

    Create parameters of dynamic type for constructed lambda expression
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 30 ++++++++++++++--------
 .../transform/stc/MethodReferenceTest.groovy       |  1 -
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index adf1466..5534ebc 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -181,7 +181,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.binX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.block;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.castX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.cloneParams;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.findActualTypeByGenericsPlaceholderName;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.makeDeclaringAndActualGenericsTypeMap;
@@ -3634,18 +3633,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
 
             Parameter param = parameters[i];
             ClassNode paramType = param.getType();
-            MethodNode abstractMethodNode = ClassHelper.findSAM(paramType);
 
-            Parameter[] abstractMethodNodeParameters = abstractMethodNode.getParameters();
-            if (null == abstractMethodNodeParameters) {
-                abstractMethodNodeParameters = Parameter.EMPTY_ARRAY;
+            if (!ClassHelper.isFunctionalInterface(paramType.redirect())) {
+                addError("The argument is a method reference, but the parameter type is not a functional interface", argumentExpression);
+                newArgumentExpressionList.add(argumentExpression);
+                continue;
             }
 
-            LambdaExpression lambdaExpression =
-                    new LambdaExpression(
-                            cloneParams(abstractMethodNodeParameters),
-                            block()
-                    );
+            Parameter[] newParameters = createParametersForLambdaExpression(paramType);
+            LambdaExpression lambdaExpression = new LambdaExpression(newParameters, block());
 
             newArgumentExpressionList.add(lambdaExpression);
             methodReferenceParamIndexList.add(i);
@@ -3662,6 +3658,20 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         }
     }
 
+    private Parameter[] createParametersForLambdaExpression(ClassNode functionalInterfaceType) {
+        MethodNode abstractMethodNode = ClassHelper.findSAM(functionalInterfaceType);
+        Parameter[] abstractMethodNodeParameters = abstractMethodNode.getParameters();
+        if (null == abstractMethodNodeParameters) {
+            abstractMethodNodeParameters = Parameter.EMPTY_ARRAY;
+        }
+
+        Parameter[] newParameters = new Parameter[abstractMethodNodeParameters.length];
+        for (int j = 0; j < newParameters.length; j++) {
+            newParameters[j] = new Parameter(DYNAMIC_TYPE, "p" + System.nanoTime());
+        }
+        return newParameters;
+    }
+
     // adjust data to handle cases like nested .with since we didn't have enough information earlier
     // TODO see if we can make the earlier detection smarter and then remove this adjustment
     private static String adjustData(String data, ClassNode type, DelegationMetadata dmd) {
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 29856d2..3985f62 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -20,7 +20,6 @@ package groovy.transform.stc
 
 class MethodReferenceTest extends GroovyTestCase {
     void testMethodReferenceFunction() {
-
         assertScript '''
             import java.util.stream.Collectors