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/04/01 17:50:10 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-10558: no spread for one argument in inner class `methodMissing`

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

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


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 946510e  GROOVY-10558: no spread for one argument in inner class `methodMissing`
946510e is described below

commit 946510eff5043a66e178a6876759531aa0f477c6
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Apr 1 10:56:34 2022 -0500

    GROOVY-10558: no spread for one argument in inner class `methodMissing`
    
    2_5_X backport
---
 .../groovy/classgen/InnerClassVisitorHelper.java   | 41 ++++++++++++++--------
 src/test/gls/innerClass/InnerClassTest.groovy      | 21 +++++++++++
 2 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
index 0fc0707..34d961a 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
@@ -24,12 +24,10 @@ import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.Parameter;
-import org.codehaus.groovy.ast.expr.ArgumentListExpression;
 import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.GStringExpression;
-import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.SpreadExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
@@ -44,11 +42,23 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
+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.constX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.eqX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.indexX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.isInstanceOfX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.notX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 
 public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
 
+    private static final ClassNode OBJECT_ARRAY = ClassHelper.OBJECT_TYPE.makeArray();
+
     protected static void setPropertyGetterDispatcher(BlockStatement block, Expression thiz, Parameter[] parameters) {
         List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
         gStringStrings.add(new ConstantExpression(""));
@@ -90,18 +100,21 @@ public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
         gStringStrings.add(new ConstantExpression(""));
         gStringStrings.add(new ConstantExpression(""));
         List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
-        block.addStatement(
-                new ReturnStatement(
-                        new MethodCallExpression(
-                                thiz,
-                                new GStringExpression("$name", gStringStrings, gStringValues),
-                                new ArgumentListExpression(
-                                        new SpreadExpression(new VariableExpression(parameters[1]))
-                                )
-                        )
-                )
-        );
+        gStringValues.add(varX(parameters[0]));
+        Expression name = new GStringExpression("$name", gStringStrings, gStringValues);
+
+        // if (!(args instanceof Object[])) return thiz."$name"(args)
+        block.addStatement(ifS(
+            notX(isInstanceOfX(varX(parameters[1]), OBJECT_ARRAY)),
+            returnS(callX(thiz, name, varX(parameters[1])))));
+
+        // if (((Object[])args).length == 1) return thiz."$name"(args[0])
+        block.addStatement(ifS(
+            eqX(propX(castX(OBJECT_ARRAY, varX(parameters[1])), "length"), constX(1, true)),
+            returnS(callX(thiz, name, indexX(castX(OBJECT_ARRAY, varX(parameters[1])), constX(0, true))))));
+
+        // return thiz."$name"(*args)
+        block.addStatement(returnS(callX(thiz, name, new SpreadExpression(varX(parameters[1])))));
     }
 
     protected static boolean isStatic(InnerClassNode node) {
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index af46d2c..af8a5f9 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -850,6 +850,27 @@ final class InnerClassTest {
         '''
     }
 
+    @Test // GROOVY-10558
+    void testUsageOfOuterMethod6() {
+        assertScript '''
+            class Outer {
+                static byte[] hash(byte[] bytes) {
+                    bytes
+                }
+                static class Inner {
+                    def test(byte[] bytes) {
+                        hash(bytes)
+                    }
+                }
+            }
+
+            Object result = new Outer.Inner().test(new byte[1])
+            assert result instanceof byte[]
+            assert result.length == 1
+            assert result[0] == 0
+        '''
+    }
+
     @Test
     void testUsageOfOuterMethodOverridden() {
         assertScript '''