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 580aee1d0f GROOVY-11374: handle type argument(s) and dynamic or 
non-identifier name
580aee1d0f is described below

commit 580aee1d0f98a2c07ce50848693814edfb70cab6
Author: Eric Milles <[email protected]>
AuthorDate: Sun May 12 17:17:47 2024 -0500

    GROOVY-11374: handle type argument(s) and dynamic or non-identifier name
---
 .../groovy/ast/expr/MethodCallExpression.java      | 46 ++++++++++++----
 .../ast/expr/MethodCallExpressionTest.groovy       | 62 +++++++++++++++++++---
 2 files changed, 92 insertions(+), 16 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
index 1eef39e386..005bf6d075 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
@@ -27,6 +27,8 @@ import org.codehaus.groovy.ast.MethodNode;
 import java.util.Collections;
 import java.util.List;
 
+import static org.codehaus.groovy.tools.Utilities.isJavaIdentifier;
+
 /**
  * A method call on an object or class.
  */
@@ -42,7 +44,6 @@ public class MethodCallExpression extends Expression 
implements MethodCall {
 
     // type spec for generics
     private GenericsType[] genericsTypes;
-    private boolean usesGenerics;
 
     private MethodNode target;
 
@@ -137,12 +138,40 @@ public class MethodCallExpression extends Expression 
implements MethodCall {
 
     @Override
     public String getText() {
-        String object = objectExpression.getText();
-        String meth = method.getText();
-        String args = arguments.getText();
-        String spread = spreadSafe ? "*" : "";
-        String dereference = safe ? "?" : "";
-        return object + spread + dereference + "." + meth + args;
+        StringBuilder builder = new StringBuilder( 64 );
+        builder.append(getObjectExpression().getText());
+        if (isSpreadSafe()) builder.append('*');
+        if (isSafe()) builder.append('?');
+        builder.append('.');
+
+        if (isUsingGenerics()) {
+            builder.append('<');
+            boolean first = true;
+            for (GenericsType t : getGenericsTypes()) {
+                if (!first) builder.append(", ");
+                else first = false;
+                builder.append(t);
+            }
+            builder.append('>');
+        }
+
+        Expression method = getMethod();
+        if (method instanceof GStringExpression) {
+            builder.append('"').append(method.getText()).append('"');
+        } else if (!(method instanceof ConstantExpression)) {
+            builder.append('(').append(method.getText()).append(')');
+        } else {
+            Object value = ((ConstantExpression) method).getValue();
+            if (!(value instanceof String) || !isJavaIdentifier((String) 
value)) {
+                builder.append("'").append(value).append("'");
+            } else {
+                builder.append((String) value);
+            }
+        }
+
+        builder.append(getArguments().getText());
+
+        return builder.toString();
     }
 
     /**
@@ -183,12 +212,11 @@ public class MethodCallExpression extends Expression 
implements MethodCall {
     }
 
     public void setGenericsTypes(GenericsType[] genericsTypes) {
-        usesGenerics = usesGenerics || genericsTypes != null;
         this.genericsTypes = genericsTypes;
     }
 
     public boolean isUsingGenerics() {
-        return usesGenerics;
+        return (genericsTypes != null && genericsTypes.length > 0);
     }
 
     /**
diff --git 
a/src/test/org/codehaus/groovy/ast/expr/MethodCallExpressionTest.groovy 
b/src/test/org/codehaus/groovy/ast/expr/MethodCallExpressionTest.groovy
index e0cff15653..0ecabbce2d 100644
--- a/src/test/org/codehaus/groovy/ast/expr/MethodCallExpressionTest.groovy
+++ b/src/test/org/codehaus/groovy/ast/expr/MethodCallExpressionTest.groovy
@@ -18,28 +18,76 @@
  */
 package org.codehaus.groovy.ast.expr
 
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-class MethodCallExpressionTest extends GroovyTestCase {
+import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE
+import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE
 
-    void testGetText() {
+final class MethodCallExpressionTest {
+
+    @Test
+    void testGetText1() {
         MethodCallExpression method = new MethodCallExpression(
                 new VariableExpression('foo'),
                 'bar',
                 new ArgumentListExpression(new ConstantExpression('baz'))
         )
-        assert 'foo.bar(baz)' == method.text
+        assert method.text == 'foo.bar(baz)'
 
         method.safe = true
         method.spreadSafe = false
-        assert 'foo?.bar(baz)' == method.text
+        assert method.text == 'foo?.bar(baz)'
 
         method.safe = false
         method.spreadSafe = true
-        assert 'foo*.bar(baz)' == method.text
+        assert method.text == 'foo*.bar(baz)'
 
         method.safe = true
         method.spreadSafe = true
-        assert 'foo*?.bar(baz)' == method.text
+        assert method.text == 'foo*?.bar(baz)'
+    }
+
+    @Test
+    void testGetText2() {
+        MethodCallExpression method = new MethodCallExpression(
+                new VariableExpression('foo'),
+                new VariableExpression('bar'),
+                new ArgumentListExpression(new VariableExpression('baz'))
+        )
+        assert method.text == 'foo.(bar)(baz)'
+    }
+
+    @Test
+    void testGetText3() {
+        MethodCallExpression method = new MethodCallExpression(
+                new VariableExpression('foo'),
+                new GStringExpression('$bar'),
+                new ArgumentListExpression(new VariableExpression('baz'))
+        )
+        assert method.text == 'foo."$bar"(baz)'
+    }
+
+    @Test
+    void testGetText4() {
+        MethodCallExpression method = new MethodCallExpression(
+                new VariableExpression('foo'),
+                new ConstantExpression(12345),
+                new ArgumentListExpression(new VariableExpression('baz'))
+        )
+        assert method.text == "foo.'12345'(baz)"
+    }
+
+    @Test
+    void testGetText5() {
+        MethodCallExpression method = new MethodCallExpression(
+                new VariableExpression('foo'),
+                'bar',
+                new ArgumentListExpression(new VariableExpression('baz'))
+        )
+        method.setGenericsTypes(
+                STRING_TYPE.asGenericsType(),
+                OBJECT_TYPE.asGenericsType()
+        )
+        assert method.text == "foo.<java.lang.String, 
java.lang.Object>bar(baz)"
     }
 }

Reply via email to