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/24 13:42:22 UTC

[groovy] branch master updated: Refine the error message for invalid receiver type(closes #931)

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 dcf3bcb  Refine the error message for invalid receiver type(closes #931)
dcf3bcb is described below

commit dcf3bcbc65e71ad47bffaca904ab8a58195bb17a
Author: Daniel Sun <su...@apache.org>
AuthorDate: Fri May 24 21:41:06 2019 +0800

    Refine the error message for invalid receiver type(closes #931)
---
 ...StaticTypesMethodReferenceExpressionWriter.java | 22 ++++++++++++++--------
 .../transform/stc/MethodReferenceTest.groovy       |  2 +-
 2 files changed, 15 insertions(+), 9 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 a89e7a3..110d41f 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
@@ -110,6 +110,15 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
                             .map(e -> e.getType().getName())
                             .collect(Collectors.joining(","))
                     + ")] in the type[" + typeOrTargetRefType.getName() + "]", methodReferenceExpression);
+        } else {
+            if (parametersWithExactType.length > 0 && isTypeReferingInstanceMethod(typeOrTargetRef, methodRefMethod)) {
+                Parameter firstParameter = parametersWithExactType[0];
+                Class<?> typeOrTargetClass = typeOrTargetRef.getType().getTypeClass();
+                Class<?> firstParameterClass = firstParameter.getType().getTypeClass();
+                if (!typeOrTargetClass.isAssignableFrom(firstParameterClass)) {
+                    throw new RuntimeParserException("Invalid receiver type: " + firstParameterClass + " is not compatible with " + typeOrTargetClass, typeOrTargetRef);
+                }
+            }
         }
 
         methodRefMethod.putNodeMetaData(ORIGINAL_PARAMETERS_WITH_EXACT_TYPE, parametersWithExactType);
@@ -241,18 +250,11 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
         List<MethodNode> candidates = new LinkedList<>();
         for (MethodNode mn : filterMethodsByVisibility(methodNodeList, classNode)) {
             Parameter[] parameters = abstractMethodParameters;
-            if (!mn.isStatic() && isClassExpr(typeOrTargetRef)) { // class::instanceMethod
+            if (isTypeReferingInstanceMethod(typeOrTargetRef, mn)) {
                 if (0 == abstractMethodParameters.length) {
                     continue;
                 }
 
-                Parameter firstParameter = abstractMethodParameters[0];
-                Class<?> typeOrTargetClass = typeOrTargetRef.getType().getTypeClass();
-                Class<?> firstParameterClass = firstParameter.getType().getTypeClass();
-                if (!typeOrTargetClass.isAssignableFrom(firstParameterClass)) {
-                    continue;
-                }
-
                 parameters =
                         new ArrayList<>(Arrays.asList(abstractMethodParameters))
                                 .subList(1, abstractMethodParameters.length)
@@ -268,6 +270,10 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
         return chooseMethodRefMethodCandidate(typeOrTargetRef, candidates);
     }
 
+    private static boolean isTypeReferingInstanceMethod(Expression typeOrTargetRef, MethodNode mn) {  // class::instanceMethod
+        return !mn.isStatic() && isClassExpr(typeOrTargetRef);
+    }
+
     /**
      * Choose the best method node for method reference.
      */
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 0fe07ca..8f932d8 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -411,6 +411,6 @@ class MethodReferenceTest extends GroovyTestCase {
             p()
         '''
 
-        assert errMsg.contains('Failed to find the expected method[toString(java.lang.Integer)] in the type[java.lang.String]')
+        assert errMsg.contains('Invalid receiver type: class java.lang.Integer is not compatible with class java.lang.String')
     }
 }