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

paulk 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 9b8fc00  GROOVY-10261: @NamedVariant: Default parameters on 
ctor/method are ignored when passing some named parameters (port to 3_0_X)
9b8fc00 is described below

commit 9b8fc006b5dc9f094c8699e6119bf3a2031a283b
Author: Paul King <[email protected]>
AuthorDate: Sun Sep 26 17:10:24 2021 +1000

    GROOVY-10261: @NamedVariant: Default parameters on ctor/method are ignored 
when passing some named parameters (port to 3_0_X)
---
 .../org/codehaus/groovy/ast/tools/GeneralUtils.java    |  8 ++++++++
 .../transform/NamedVariantASTTransformation.java       | 15 ++++++++++++---
 .../groovy/transform/NamedVariantTransformTest.groovy  | 18 ++++++++++++++++++
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java 
b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index c0d17e7..9390a16 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -41,6 +41,7 @@ import org.codehaus.groovy.ast.expr.ClosureExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
 import org.codehaus.groovy.ast.expr.DeclarationExpression;
+import org.codehaus.groovy.ast.expr.ElvisOperatorExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.FieldExpression;
 import org.codehaus.groovy.ast.expr.ListExpression;
@@ -319,6 +320,13 @@ public class GeneralUtils {
         return new DeclarationExpression(target, ASSIGN, init);
     }
 
+    /**
+     * @since 3.0.10
+     */
+    public static ElvisOperatorExpression elvisX(final Expression base, final 
Expression otherwise) {
+        return new ElvisOperatorExpression(base, otherwise);
+    }
+
     public static MapEntryExpression entryX(final Expression key, final 
Expression value) {
         return new MapEntryExpression(key, value);
     }
diff --git 
a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
 
b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index 6ce13c5..b25bf78 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -32,6 +32,8 @@ import org.codehaus.groovy.ast.PropertyNode;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.MapEntryExpression;
+import org.codehaus.groovy.ast.expr.PropertyExpression;
+import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.AssertStatement;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.codehaus.groovy.ast.stmt.ForStatement;
@@ -63,6 +65,7 @@ import static 
org.codehaus.groovy.ast.tools.GeneralUtils.castX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.elvisX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.entryX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getAllProperties;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.list2args;
@@ -125,7 +128,9 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
                 } else if (AnnotatedNodeUtils.hasAnnotation(fromParam, 
NAMED_DELEGATE_TYPE)) {
                     if (!processDelegateParam(mNode, mapParam, args, 
propNames, fromParam, coerce)) return;
                 } else {
-                    args.addExpression(asType(varX(fromParam), 
fromParam.getType(), coerce));
+                    VariableExpression arg = varX(fromParam);
+                    Expression argOrDefault = fromParam.hasInitialExpression() 
? elvisX(arg, fromParam.getDefaultValue()) : arg;
+                    args.addExpression(asType(argOrDefault, 
fromParam.getType(), coerce));
                     if (hasDuplicates(mNode, propNames, fromParam.getName())) 
return;
                     genParams.add(fromParam);
                 }
@@ -143,7 +148,9 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
         namedParam.addMember("type", classX(fromParam.getType()));
         namedParam.addMember("required", constX(required, true));
         mapParam.addAnnotation(namedParam);
-        args.addExpression(asType(propX(varX(mapParam), name), 
fromParam.getType(), coerce));
+        PropertyExpression arg = propX(varX(mapParam), name);
+        Expression argOrDefault = fromParam.hasInitialExpression() ? 
elvisX(arg, fromParam.getDefaultValue()) : arg;
+        args.addExpression(asType(argOrDefault, fromParam.getType(), coerce));
         return true;
     }
 
@@ -168,7 +175,9 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
             inner.addStatement(new AssertStatement(boolX(callX(varX(mapParam), 
"containsKey", args(constX(name)))),
                     plusX(constX("Missing required named argument '" + name + 
"'. Keys found: "), callX(varX(mapParam), "keySet"))));
         }
-        args.addExpression(asType(propX(varX(mapParam), name), 
fromParam.getType(), coerce));
+        PropertyExpression arg = propX(varX(mapParam), name);
+        Expression argOrDefault = fromParam.hasInitialExpression() ? 
elvisX(arg, fromParam.getDefaultValue()) : arg;
+        args.addExpression(asType(argOrDefault, fromParam.getType(), coerce));
         mapParam.addAnnotation(namedParam);
         fromParam.getAnnotations().remove(namedParam);
         return true;
diff --git 
a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy 
b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index 198f951..edb22d6 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -187,6 +187,24 @@ final class NamedVariantTransformTest {
         '''
     }
 
+    @Test // GROOVY-GROOVY-10261
+    void testNamedDelegateWithDefaultValues() {
+        assertScript '''
+            import groovy.transform.*
+            import java.awt.Color
+
+            @NamedVariant
+            Color makeColor(int r=10, int g=20, int b=30) {
+                new Color(r, g, b)
+            }
+
+            assert makeColor(r: 128, g: 128, b: 5).toString() == 
'java.awt.Color[r=128,g=128,b=5]'
+            assert makeColor(r: 128, g: 128).toString() == 
'java.awt.Color[r=128,g=128,b=30]'
+            assert makeColor(r: 128).toString() == 
'java.awt.Color[r=128,g=20,b=30]'
+            assert makeColor().toString() == 'java.awt.Color[r=10,g=20,b=30]'
+        '''
+    }
+
     @Test // GROOVY-9183
     void testNamedDelegateWithPropertyDefaults() {
         assertScript '''

Reply via email to