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 '''