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 2022/02/16 17:26:50 UTC
[groovy] 01/01: GROOVY-10497: `@NamedVariant`: don't replace explicit value with default
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-10497
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 08cba8b24a6d8218c46c35696006839446d8b886
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Feb 16 11:24:47 2022 -0600
GROOVY-10497: `@NamedVariant`: don't replace explicit value with default
---
.../groovy/transform/NamedVariantASTTransformation.java | 4 +++-
.../groovy/transform/NamedVariantTransformTest.groovy | 14 +++++++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index 2d65dc5..a4fe57b 100644
--- a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -74,6 +74,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
import static org.codehaus.groovy.ast.tools.GeneralUtils.plusX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.ternaryX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
@@ -278,13 +279,14 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
defaultValue = defaultValueX(type);
}
if (defaultValue != null) {
- value = elvisX(value, defaultValue);
+ value = ternaryX(containsKey(mapParam, name), value, defaultValue);
}
return asType(value, type, coerce);
}
private static Expression containsKey(final Parameter mapParam, final String name) {
MethodCallExpression call = callX(varX(mapParam), "containsKey", constX(name));
+ call.setImplicitThis(false); // required for use before super ctor call
call.setMethodTarget(MAP_TYPE.getMethods("containsKey").get(0));
return call;
}
diff --git a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index 2ec9135..ae58594 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -192,7 +192,7 @@ final class NamedVariantTransformTest {
'''
}
- @Test // GROOVY-9158
+ @Test // GROOVY-9158, GROOVY-10497
void testNamedParamWithDefaultArgument() {
assertScript '''
import groovy.transform.*
@@ -226,6 +226,18 @@ final class NamedVariantTransformTest {
m()
}
'''
+
+ assertScript '''
+ import groovy.transform.*
+
+ @NamedVariant
+ def m(int one, int two = 42) {
+ "$one $two"
+ }
+
+ String result = m(one:0, two:0)
+ assert result == '0 0'
+ '''
}
@Test // GROOVY-10176