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 2022/05/28 22:59:43 UTC

[groovy] branch master updated: GROOVY-9813: add test cases

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

emilles 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 02d1a3b4f7 GROOVY-9813: add test cases
02d1a3b4f7 is described below

commit 02d1a3b4f76f1311eb2286188b224cfbbf0324db
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat May 28 17:44:17 2022 -0500

    GROOVY-9813: add test cases
---
 .../java/org/codehaus/groovy/ast/MethodNode.java   |  1 +
 ...StaticTypesMethodReferenceExpressionWriter.java |  9 +--
 .../transform/stc/MethodReferenceTest.groovy       | 76 ++++++++++++++++++++++
 3 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/MethodNode.java b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
index 34f941918e..331742c46d 100644
--- a/src/main/java/org/codehaus/groovy/ast/MethodNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
@@ -110,6 +110,7 @@ public class MethodNode extends AnnotatedNode {
     public void setModifiers(int modifiers) {
         invalidateCachedData();
         this.modifiers = modifiers;
+        getVariableScope().setInStaticContext(isStatic());
     }
 
     public String getName() {
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 8a13ac663d..c16229448d 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
@@ -211,7 +211,7 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
 
     private MethodNode addSyntheticMethodForVariadicReference(final MethodNode mn, final int samParameters, final boolean isStaticTarget) {
         Parameter[] parameters = new Parameter[samParameters];
-        Expression arguments = null, receiver = null;
+        Expression arguments, receiver;
         if (mn.isStatic()) {
             for (int i = 0, j = mn.getParameters().length-1; i < samParameters; i += 1) {
                 ClassNode t = mn.getParameters()[Math.min(i, j)].getType();
@@ -222,11 +222,11 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
             receiver = classX(mn.getDeclaringClass());
         } else {
             int p = 0;
-            if (isStaticTarget) parameters[p++] = new Parameter(mn.getDeclaringClass(), "o");
-            for (int i = 0, j = mn.getParameters().length-1; i < samParameters - p; i += 1) {
+            if (isStaticTarget) parameters[p++] = new Parameter(mn.getDeclaringClass(), "target");
+            for (int i = 0, j = mn.getParameters().length-1, n = samParameters-p; i < n; i += 1) {
                 ClassNode t = mn.getParameters()[Math.min(i, j)].getType();
                 if (i >= j) t = t.getComponentType(); // targets the array
-                parameters[p++] = new Parameter(t, "p" + p);
+                parameters[p] = new Parameter(t, "p" + p); p += 1;
             }
             if (isStaticTarget) {
                 arguments = new ArgumentListExpression(removeFirstParameter(parameters));
@@ -247,6 +247,7 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
         MethodNode delegateMethod = addSyntheticMethod(methodName, mn.getReturnType(), methodCall, parameters, mn.getExceptions());
         if (!isStaticTarget && !mn.isStatic()) delegateMethod.setModifiers(delegateMethod.getModifiers() & ~Opcodes.ACC_STATIC);
         delegateMethod.putNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE, Boolean.TRUE);
+        delegateMethod.setGenericsTypes(mn.getGenericsTypes());
         return delegateMethod;
     }
 
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index f1188942e7..e3b5f894cb 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -240,6 +240,82 @@ final class MethodReferenceTest {
         '''
     }
 
+    @Test // instance::instanceMethod -- GROOVY-9813
+    void testFunctionII() {
+        String asList = '''
+            def <T> List<T> asList(T... a) {
+                return Arrays.asList(a)
+            }
+        '''
+
+        assertScript shell, asList + '''
+            @CompileStatic
+            void test() {
+                Supplier<List> zero = this::asList
+                def list = zero.get()
+                assert list.isEmpty()
+            }
+            test()
+        '''
+
+        assertScript shell, asList + '''
+            @CompileStatic
+            void test() {
+                Function<Integer, List> one = this::asList
+                def list = one.apply(1)
+                assert list.size() == 1
+                assert list[0] == 1
+            }
+            test()
+        '''
+
+        assertScript shell, asList + '''
+            @CompileStatic
+            void test() {
+                BiFunction<Integer, Integer, List> two = this::asList
+                def list = two.apply(2,3)
+                assert list.size() == 2
+                assert list[0] == 2
+                assert list[1] == 3
+            }
+            test()
+        '''
+
+        assertScript shell, asList + '''
+            @CompileStatic
+            void test() { def that = this
+                BiFunction<Integer, Integer, List> two = that::asList
+                def list = two.apply(2,3)
+                assert list.size() == 2
+                assert list[0] == 2
+                assert list[1] == 3
+            }
+            test()
+        '''
+    }
+
+    @Test // instance::instanceMethod
+    @groovy.test.NotYetImplemented
+    void testFunctionII2() {
+        assertScript shell, """
+            class C {
+                def m(... args) {
+                    [this, *args]
+                }
+            }
+            @CompileStatic
+            void test(C c) {
+                BiFunction<Integer, Integer, List> two = c::m
+                def list = two.apply(1,2)
+                assert list.size() == 3
+                assert list[0] == c
+                assert list[1] == 1
+                assert list[2] == 2
+            }
+            test(new C())
+        """
+    }
+
     @Test // instance::instanceMethod -- GROOVY-10057
     void testPredicateII() {
         assertScript shell, '''