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) {