You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/05/19 13:12:12 UTC

[groovy] branch master updated: Validate parameter types of method reference(class::instanceMethod)(closes #930)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 11c6aab  Validate parameter types of method reference(class::instanceMethod)(closes #930)
11c6aab is described below

commit 11c6aaba3a8f2ab4bfbececf7af21e733bf71ae8
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun May 19 21:10:06 2019 +0800

    Validate parameter types of method reference(class::instanceMethod)(closes #930)
---
 ...StaticTypesMethodReferenceExpressionWriter.java | 34 +++++++++++-----------
 .../transform/stc/MethodReferenceTest.groovy       | 18 ++++++++++++
 2 files changed, 35 insertions(+), 17 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 1fe3772..a89e7a3 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
@@ -240,28 +240,28 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
 
         List<MethodNode> candidates = new LinkedList<>();
         for (MethodNode mn : filterMethodsByVisibility(methodNodeList, classNode)) {
-            if (mn.isStatic()) {
-                if (ParameterUtils.parametersCompatible(abstractMethodParameters, mn.getParameters())) {
-                    candidates.add(mn);
-                }
-            } else {
+            Parameter[] parameters = abstractMethodParameters;
+            if (!mn.isStatic() && isClassExpr(typeOrTargetRef)) { // class::instanceMethod
                 if (0 == abstractMethodParameters.length) {
-                    break;
+                    continue;
                 }
 
-                Parameter[] parameters;
-                if (isClassExpr(typeOrTargetRef)) {
-                    parameters =
-                            new ArrayList<>(Arrays.asList(abstractMethodParameters))
-                                    .subList(1, abstractMethodParameters.length)
-                                    .toArray(Parameter.EMPTY_ARRAY);
-                } else {
-                    parameters = abstractMethodParameters;
+                Parameter firstParameter = abstractMethodParameters[0];
+                Class<?> typeOrTargetClass = typeOrTargetRef.getType().getTypeClass();
+                Class<?> firstParameterClass = firstParameter.getType().getTypeClass();
+                if (!typeOrTargetClass.isAssignableFrom(firstParameterClass)) {
+                    continue;
                 }
 
-                if (ParameterUtils.parametersCompatible(parameters, mn.getParameters())) {
-                    candidates.add(mn);
-                }
+                parameters =
+                        new ArrayList<>(Arrays.asList(abstractMethodParameters))
+                                .subList(1, abstractMethodParameters.length)
+                                .toArray(Parameter.EMPTY_ARRAY);
+
+            }
+
+            if (ParameterUtils.parametersCompatible(parameters, mn.getParameters())) {
+                candidates.add(mn);
             }
         }
 
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 1680ea4..0fe07ca 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -395,4 +395,22 @@ class MethodReferenceTest extends GroovyTestCase {
 
         assert errMsg.contains('Failed to find the expected method[addx(java.math.BigDecimal,java.math.BigDecimal)] in the type[java.math.BigDecimal]')
     }
+
+    // class::instanceMethod
+    void testFunctionCI_WRONGTYPE() {
+        def errMsg = shouldFail '''
+            import java.util.stream.Collectors
+            
+            @groovy.transform.CompileStatic
+            void p() {
+                def result = [1, 2, 3].stream().map(String::toString).collect(Collectors.toList())
+                assert 3 == result.size()
+                assert ['1', '2', '3'] == result
+            }
+            
+            p()
+        '''
+
+        assert errMsg.contains('Failed to find the expected method[toString(java.lang.Integer)] in the type[java.lang.String]')
+    }
 }