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)
+ '''
}
}