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 2024/02/26 20:12:48 UTC

(groovy) branch GROOVY_4_0_X updated: GROOVY-11325: `@NamedVariant`: default argument expression transformer

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

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


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 05283808bd GROOVY-11325: `@NamedVariant`: default argument expression transformer
05283808bd is described below

commit 05283808bdea6d57db60d9e0ed7d4ea1e7ccc5a9
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Feb 26 13:31:21 2024 -0600

    GROOVY-11325: `@NamedVariant`: default argument expression transformer
---
 .../transform/NamedVariantASTTransformation.java   | 20 +++++++++-------
 .../transform/NamedVariantTransformTest.groovy     | 28 ++++++++++++++++++----
 2 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index 6a15eb0035..0d27b5915f 100644
--- a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -30,8 +30,8 @@ import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.PropertyNode;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
-import org.codehaus.groovy.ast.expr.CastExpression;
 import org.codehaus.groovy.ast.expr.Expression;
+import org.codehaus.groovy.ast.expr.ExpressionTransformer;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.AssertStatement;
@@ -292,14 +292,16 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
     }
 
     private static Expression getDefaultValue(final Expression defaultValue, final Map<Parameter, Expression> seen) {
-        if (defaultValue != null && seen != null) { // GROOVY-10561, GROOVY-10889
-            Expression v = defaultValue;
-            while (v instanceof CastExpression) {
-                v = ((CastExpression) v).getExpression();
-            }
-            if (v instanceof VariableExpression) { // maybe it's a reference to a previous parameter
-                return seen.getOrDefault(((VariableExpression) v).getAccessedVariable(), defaultValue);
-            }
+        if (defaultValue != null && seen != null && !seen.isEmpty()) { // GROOVY-10561, GROOVY-10889, GROOVY-11325
+            ExpressionTransformer variableTransformer = (expression) -> {
+                if (expression instanceof VariableExpression) { // maybe it's a reference to a previous parameter
+                    return seen.getOrDefault(((VariableExpression) expression).getAccessedVariable(), expression);
+                }
+                return expression;
+            };
+            return (defaultValue instanceof VariableExpression
+                    ? variableTransformer.transform(defaultValue)
+                    : defaultValue.transformExpression(variableTransformer));
         }
         return defaultValue;
     }
diff --git a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index ecd1319000..da3a1cd25c 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -329,7 +329,7 @@ final class NamedVariantTransformTest {
     }
 
     @Test // GROOVY-9183, GROOVY-10500
-    void testNamedDelegateWithPropertyDefaults() {
+    void testNamedDelegateWithPropertyDefault() {
         assertScript shell, '''
             class RowMapper {
                 final Settings settings
@@ -369,7 +369,7 @@ final class NamedVariantTransformTest {
     }
 
     @Test // GROOVY-10561
-    void testReferenceToEarlierParam() {
+    void testDefaultArgumentReferenceToParam1() {
         assertScript shell, '''
             @NamedVariant
             String fileInSourceSet(String language = 'java', String extension = language) {
@@ -384,7 +384,7 @@ final class NamedVariantTransformTest {
     }
 
     @Test // GROOVY-10561
-    void testEarlierParamInExpression() {
+    void testDefaultArgumentReferenceToParam2() {
         assertScript shell, '''
             @NamedVariant
             String foo(String a = 'a', String b = a, String c = (String) a) {
@@ -398,8 +398,28 @@ final class NamedVariantTransformTest {
         '''
     }
 
+    @Test // GROOVY-11325
+    void testDefaultArgumentReferenceToParam3() {
+        assertScript shell, '''
+            @NamedVariant
+            String foo(String a = 'a', String b = a + 'b', String c = a + b) {
+                return "$a $b $c"
+            }
+
+            assert foo() == 'a ab aab'
+            assert foo('c') == 'c cb ccb'
+            assert foo('c', 'd') == 'c d cd'
+            assert foo('c', 'd', 'e') == 'c d e'
+
+            assert foo(c: 'c') == 'a ab c'
+            assert foo(a: 'c') == 'c cb ccb'
+            assert foo(a: 'c', b: 'd') == 'c d cd'
+            assert foo(a: 'c', b: 'd', c: 'e') == 'c d e'
+        '''
+    }
+
     @Test // GROOVY-10889
-    void testDefaultValueCastIsRetained() {
+    void testDefaultArgumentCoerceIsPreserved() {
         assertScript shell, '''
             @NamedVariant
             Tuple2<Integer,Set<String>> createSampleData(Integer integer = 0, Set<String> strings = [] as Set) {