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