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 0d5809489b GROOVY-10521: plain array return descriptor
0d5809489b is described below

commit 0d5809489b6b78918f83d197a6377b8d4919040e
Author: Eric Milles <[email protected]>
AuthorDate: Mon Aug 22 16:31:19 2022 -0500

    GROOVY-10521: plain array return descriptor
---
 .../apache/groovy/ast/tools/MethodNodeUtils.java   | 54 +++++++++++-----------
 .../classgen/asm/sc/bugs/Groovy6650Bug.groovy      | 48 ++++++++++---------
 2 files changed, 53 insertions(+), 49 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 190462ca87..885c1cd90e 100644
--- a/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/MethodNodeUtils.java
@@ -31,8 +31,7 @@ import static org.apache.groovy.util.BeanUtils.decapitalize;
  */
 public class MethodNodeUtils {
 
-    private MethodNodeUtils() {
-    }
+    private MethodNodeUtils() { }
 
     /**
      * Return the method node's descriptor including its
@@ -58,17 +57,20 @@ public class MethodNodeUtils {
      * @return the method node's descriptor
      */
     public static String methodDescriptor(final MethodNode mNode) {
-        StringBuilder sb = new StringBuilder(mNode.getName().length() + 
mNode.getParameters().length * 10);
-        sb.append(mNode.getReturnType().getName());
+        String name = mNode.getName();
+        Parameter[] parameters = mNode.getParameters();
+        int nParameters = parameters == null ? 0 : parameters.length;
+
+        StringBuilder sb = new StringBuilder(name.length() * 2 + nParameters * 
10);
+        sb.append(ClassNodeUtils.formatTypeName(mNode.getReturnType()));
         sb.append(' ');
-        sb.append(mNode.getName());
+        sb.append(name);
         sb.append('(');
-        for (int i = 0; i < mNode.getParameters().length; i++) {
+        for (int i = 0; i < nParameters; i += 1) {
             if (i > 0) {
                 sb.append(", ");
             }
-            Parameter p = mNode.getParameters()[i];
-            sb.append(ClassNodeUtils.formatTypeName(p.getType()));
+            sb.append(ClassNodeUtils.formatTypeName(parameters[i].getType()));
         }
         sb.append(')');
         return sb.toString();
@@ -85,21 +87,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 && 
!mNode.getReturnType().equals(ClassHelper.VOID_TYPE)) {
-                        return decapitalize(name.substring(3));
-                    }
-                    break;
-                case 's':
-                    if (nameLength > 3 && name.charAt(1) == 'e' && 
name.charAt(2) == 't' && mNode.getParameters().length == 1 /*&& 
mNode.getReturnType().equals(ClassHelper.VOID_TYPE)*/) {
-                        return decapitalize(name.substring(3));
-                    }
-                    break;
-                case 'i':
-                    if (name.charAt(1) == 's' && mNode.getParameters().length 
== 0 && (mNode.getReturnType().equals(ClassHelper.boolean_TYPE) /*|| 
mNode.getReturnType().equals(ClassHelper.Boolean_TYPE)*/)) {
-                        return decapitalize(name.substring(2));
-                    }
-                    break;
+              case 'g':
+                if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) 
== 't' && mNode.getParameters().length == 0 && 
!mNode.getReturnType().equals(ClassHelper.VOID_TYPE)) {
+                    return decapitalize(name.substring(3));
+                }
+                break;
+              case 's':
+                if (nameLength > 3 && name.charAt(1) == 'e' && name.charAt(2) 
== 't' && mNode.getParameters().length == 1 /*&& 
mNode.getReturnType().equals(ClassHelper.VOID_TYPE)*/) {
+                    return decapitalize(name.substring(3));
+                }
+                break;
+              case 'i':
+                if (name.charAt(1) == 's' && mNode.getParameters().length == 0 
&& (mNode.getReturnType().equals(ClassHelper.boolean_TYPE) /*|| 
mNode.getReturnType().equals(ClassHelper.Boolean_TYPE)*/)) {
+                    return decapitalize(name.substring(2));
+                }
+                break;
             }
         }
         return null;
@@ -112,11 +114,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();
diff --git 
a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy6650Bug.groovy 
b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy6650Bug.groovy
index 4e08e409e5..5baaab0167 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy6650Bug.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy6650Bug.groovy
@@ -22,33 +22,35 @@ package org.codehaus.groovy.classgen.asm.sc.bugs
 import groovy.transform.stc.StaticTypeCheckingTestCase
 import org.codehaus.groovy.classgen.asm.sc.StaticCompilationTestSupport
 
-class Groovy6650Bug extends StaticTypeCheckingTestCase implements 
StaticCompilationTestSupport {
+final class Groovy6650Bug extends StaticTypeCheckingTestCase implements 
StaticCompilationTestSupport {
+
     void testShouldChooseVargsMethod() {
-        assertScript '''import 
org.codehaus.groovy.transform.stc.ExtensionMethodNode
-
-def x = 'a,b,c'.split(',')
-def y = 'd,e,f'.split(',')
-
-@ASTTest(phase=INSTRUCTION_SELECTION,value={
-    def call = node.rightExpression.getNodeMetaData(DIRECT_METHOD_CALL_TARGET)
-    assert call instanceof ExtensionMethodNode
-    def emn = call.extensionMethodNode
-    def typeDesc = emn.typeDescriptor
-    assert typeDesc == '[Ljava.lang.Object; plus(java.lang.Object[], 
java.lang.Object[])'
-    println emn.typeDescriptor
-})
-String[] result = x + y
-assert result as List == ['a', 'b', 'c', 'd', 'e', 'f']
-'''
+        assertScript '''
+            import org.codehaus.groovy.transform.stc.ExtensionMethodNode
+
+            def x = 'a,b,c'.split(',')
+            def y = 'd,e,f'.split(',')
+
+            @ASTTest(phase=INSTRUCTION_SELECTION,value={
+                def mn = 
node.rightExpression.getNodeMetaData(DIRECT_METHOD_CALL_TARGET)
+                assert mn instanceof ExtensionMethodNode
+                def td = mn.extensionMethodNode.typeDescriptor
+                assert td == 'java.lang.Object[] plus(java.lang.Object[], 
java.lang.Object[])'
+            })
+            String[] result = x + y
+            assert result as List == ['a', 'b', 'c', 'd', 'e', 'f']
+        '''
     }
 
     void testShouldNotThrowAmbiguousSelectionError() {
-        assertScript '''import org.codehaus.groovy.ast.ClassNode
-import org.codehaus.groovy.ast.MethodNode
+        assertScript '''
+            import org.codehaus.groovy.ast.ClassNode
+            import org.codehaus.groovy.ast.MethodNode
 
-MethodNode methodNode = null
-ClassNode annotation = null
-List annots = methodNode?.getAnnotations(annotation)
-return (annots != null && annots.size() > 0);'''
+            ClassNode  annotation = null
+            MethodNode methodNode = null
+            List annos = methodNode?.getAnnotations(annotation)
+            return (annos != null && annos.size() > 0)
+        '''
     }
 }

Reply via email to