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/08/22 21:02:48 UTC

[groovy] branch master updated: GROOVY-10521: plain array parameter descriptor

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 286c9192ae GROOVY-10521: plain array parameter descriptor
286c9192ae is described below

commit 286c9192aec61c27362afe07b2ac776ce12c32ad
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Aug 22 15:55:43 2022 -0500

    GROOVY-10521: plain array parameter descriptor
---
 .../apache/groovy/ast/tools/MethodNodeUtils.java   | 68 +++++++++++-----------
 .../org/codehaus/groovy/ast/MethodNodeTest.groovy  |  2 +-
 .../traitx/TraitASTTransformationTest.groovy       | 15 ++++-
 3 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java b/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java
index 2f3029ed58..1a74e013a2 100644
--- a/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java
@@ -18,7 +18,6 @@
  */
 package org.apache.groovy.ast.tools;
 
-import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
@@ -26,7 +25,6 @@ import org.codehaus.groovy.ast.stmt.Statement;
 
 import static org.apache.groovy.util.BeanUtils.decapitalize;
 import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveVoid;
 
 /**
  * Utility class for working with MethodNodes
@@ -70,21 +68,24 @@ public class MethodNodeUtils {
      * @param pretty whether to quote a name with spaces
      * @return the method node's descriptor
      */
-    public static String methodDescriptor(final MethodNode mNode, final boolean pretty) {
+    public static String methodDescriptor(final MethodNode mNode, boolean pretty) {
+        String name = mNode.getName();
+        if (pretty) pretty = name.contains(" ");
         Parameter[] parameters = mNode.getParameters();
         int nParameters = parameters == null ? 0 : parameters.length;
-        String name = mNode.getName();
-        String prettyName = name.contains(" ") && pretty ? "\"" + name + "\"" : name;
-        StringBuilder sb = new StringBuilder(mNode.getName().length() * 2 + nParameters * 10);
-        sb.append(mNode.getReturnType().getName());
+
+        StringBuilder sb = new StringBuilder(name.length() * 2 + nParameters * 10);
+        sb.append(ClassNodeUtils.formatTypeName(mNode.getReturnType()));
         sb.append(' ');
-        sb.append(prettyName);
+        if (pretty) sb.append('"');
+        sb.append(name);
+        if (pretty) sb.append('"');
         sb.append('(');
         for (int i = 0; i < nParameters; i += 1) {
             if (i > 0) {
                 sb.append(", ");
             }
-            sb.append(parameters[i].getType().getName());
+            sb.append(ClassNodeUtils.formatTypeName(parameters[i].getType()));
         }
         sb.append(')');
         return sb.toString();
@@ -101,21 +102,21 @@ public class MethodNodeUtils {
         final int nameLength = name.length();
         if (nameLength > 2) {
             switch (name.charAt(0)) {
-                case 'g':
-                    if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) == 't' && mNode.getParameters().length == 0 && !isPrimitiveVoid(mNode.getReturnType())) {
-                        return decapitalize(name.substring(3));
-                    }
-                    break;
-                case 's':
-                    if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) == 't' && mNode.getParameters().length == 1 /*&& isPrimitiveVoid(mNode.getReturnType())*/) {
-                        return decapitalize(name.substring(3));
-                    }
-                    break;
-                case 'i':
-                    if (name.charAt(1) == 's' && mNode.getParameters().length == 0 && (isPrimitiveBoolean(mNode.getReturnType()) /*|| isWrapperBoolean(mNode.getReturnType())*/)) {
-                        return decapitalize(name.substring(2));
-                    }
-                    break;
+              case 'g':
+                if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) == 't' && mNode.getParameters().length == 0 && !mNode.isVoidMethod()) {
+                    return decapitalize(name.substring(3));
+                }
+                break;
+              case 's':
+                if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) == 't' && mNode.getParameters().length == 1 /*&& mNode.isVoidMethod()*/) {
+                    return decapitalize(name.substring(3));
+                }
+                break;
+              case 'i':
+                if (name.charAt(1) == 's' && mNode.getParameters().length == 0 && (isPrimitiveBoolean(mNode.getReturnType()) /*|| isWrapperBoolean(mNode.getReturnType())*/)) {
+                    return decapitalize(name.substring(2));
+                }
+                break;
             }
         }
         return null;
@@ -128,11 +129,11 @@ public class MethodNodeUtils {
      * Otherwise the existing block statement will be returned.
      * The original {@code node} is not modified.
      *
-     * @param node the method (or constructor) node
+     * @param mNode the method (or constructor) node
      * @return the found or created block statement
      */
-    public static BlockStatement getCodeAsBlock(final MethodNode node) {
-        Statement code = node.getCode();
+    public static BlockStatement getCodeAsBlock(final MethodNode mNode) {
+        Statement code = mNode.getCode();
         BlockStatement block;
         if (code == null) {
             block = new BlockStatement();
@@ -146,16 +147,13 @@ public class MethodNodeUtils {
     }
 
     /**
-     * Check if the {@link MethodNode} instance is getter candidate
+     * Determines if given method is a getter candidate.
      *
-     * @param m the {@link MethodNode} instance
-     * @return {@code true} if the instance is getter candidate
      * @since 4.0.0
      */
-    public static boolean isGetterCandidate(MethodNode m) {
-        Parameter[] parameters = m.getParameters();
-        return m.isPublic() && !m.isStatic() && !m.isAbstract()
-                && (parameters == null || parameters.length == 0)
-                && !ClassHelper.VOID_TYPE.equals(m.getReturnType());
+    public static boolean isGetterCandidate(final MethodNode mNode) {
+        Parameter[] parameters = mNode.getParameters();
+        return (parameters == null || parameters.length == 0)
+                && mNode.isPublic() && !mNode.isStatic() && !mNode.isAbstract() && !mNode.isVoidMethod();
     }
 }
diff --git a/src/test/org/codehaus/groovy/ast/MethodNodeTest.groovy b/src/test/org/codehaus/groovy/ast/MethodNodeTest.groovy
index d7bbaded08..45f7ec525e 100644
--- a/src/test/org/codehaus/groovy/ast/MethodNodeTest.groovy
+++ b/src/test/org/codehaus/groovy/ast/MethodNodeTest.groovy
@@ -52,7 +52,7 @@ final class MethodNodeTest {
         result = new MethodNode('foo', 0, ClassHelper.STRING_TYPE.makeArray(), params, null, null).tap {
             declaringClass = ClassHelper.OBJECT_TYPE
         }
-        assert result.endsWith('[Ljava.lang.String; foo(int, [I) from java.lang.Object]')
+        assert result.endsWith('java.lang.String[] foo(int, int[]) from java.lang.Object]')
     }
 
     @Test
diff --git a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index ffe958b762..9f925c8748 100644
--- a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -3002,9 +3002,22 @@ final class TraitASTTransformationTest {
 
     @Test // GROOVY-10521
     void testVariadicMethodOfPrecompiledTrait() {
+        assertScript shell, """import org.codehaus.groovy.ast.*
+            class CT implements ${T10521.name} {
+                def n(Class<?> clazz, Object... array) {
+                }
+            }
+
+            def cn = new ClassNode(${T10521.name})
+            def mn = cn.getMethods('m')[0]
+            def td = mn.typeDescriptor
+
+            assert td == 'java.lang.Object m(java.lang.Class, java.lang.Object[])'
+        """
+
         System.setProperty('spock.iKnowWhatImDoing.disableGroovyVersionCheck','true')
         assertScript shell, """
-            @Grab('org.spockframework:spock-core:2.2-M1-groovy-4.0')
+            @Grab('org.spockframework:spock-core:2.2-M3-groovy-4.0')
             @GrabExclude('org.apache.groovy:*')
             import spock.lang.Specification