You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2023/04/11 22:00:58 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-10994: SC: method reference in parameterized context

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

emilles 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 0647afad5a GROOVY-10994: SC: method reference in parameterized context
0647afad5a is described below

commit 0647afad5a3170d94892254211ef95058980ddaf
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Apr 11 15:56:30 2023 -0500

    GROOVY-10994: SC: method reference in parameterized context
    
    3_0_X backport
---
 .../asm/sc/StaticTypesMethodReferenceExpressionWriter.java   |  7 +++++++
 src/test/groovy/transform/stc/MethodReferenceTest.groovy     | 12 ++++++++++++
 2 files changed, 19 insertions(+)

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 9ce154ce64..7d5aff41cf 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
@@ -21,6 +21,7 @@ package org.codehaus.groovy.classgen.asm.sc;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.ast.GenericsType;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
@@ -42,6 +43,7 @@ import org.objectweb.asm.Opcodes;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import static java.util.Comparator.comparingInt;
 import static java.util.stream.Collectors.joining;
@@ -258,6 +260,11 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
 
                 parameters = plusOne;
             }
+            if (parameters.length > 0 && !method.isStatic() && !isExtensionMethod(method)
+                    && typeOrTargetRefType.redirect().getGenericsTypes() != null) { // GROOVY-10994
+                Map<GenericsType.GenericsTypeName, GenericsType> spec = extractPlaceholders(typeOrTargetRefType);
+                parameters = Arrays.stream(parameters).map(p -> new Parameter(resolveClassNodeGenerics(spec, null, p.getType()), p.getName())).toArray(Parameter[]::new);
+            }
             return !parametersCompatible(samParameters, parameters);
         });
 
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 4bbaa4311a..c358459357 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -419,6 +419,18 @@ final class MethodReferenceTest {
         '''
     }
 
+    @Test // instance::instanceMethod -- GROOVY-10994
+    void testPredicateII2() {
+        assertScript imports + '''
+            @CompileStatic
+            def <T> void test(List<T> list) {
+                Predicate<? super T> p = list::add
+            }
+
+            test([])
+        '''
+    }
+
     @Test // instance::instanceMethod
     void testBinaryOperatorII() {
         assertScript imports + '''