You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/02/23 13:31:39 UTC
[groovy] 01/02: GROOVY-10500: `@NamedVariant`: slice named args map for `@NamedDelegate`
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 57c2fe9bb260a744d82bcb1725d91af6306a1b98
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Feb 21 03:58:46 2022 -0600
GROOVY-10500: `@NamedVariant`: slice named args map for `@NamedDelegate`
---
.../transform/NamedVariantASTTransformation.java | 30 ++++++++--------------
.../transform/NamedVariantTransformTest.groovy | 7 ++---
2 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index f3052de..ad2c140 100644
--- a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -31,7 +31,6 @@ 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.Expression;
-import org.codehaus.groovy.ast.expr.MapEntryExpression;
import org.codehaus.groovy.ast.expr.MethodCallExpression;
import org.codehaus.groovy.ast.stmt.AssertStatement;
import org.codehaus.groovy.ast.stmt.BlockStatement;
@@ -43,7 +42,6 @@ import org.codehaus.groovy.control.SourceUnit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
-import java.util.Optional;
import java.util.Set;
import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedConstructor;
@@ -67,12 +65,10 @@ 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.defaultValueX;
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.ifS;
import static org.codehaus.groovy.ast.tools.GeneralUtils.isNullX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.list2args;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.mapX;
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;
@@ -122,8 +118,7 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
}
}
- if (!annoFound && autoDelegate) {
- // assume the first param is the delegate by default
+ if (!annoFound && autoDelegate) { // the first param is the delegate
processDelegateParam(mNode, mapParam, args, propNames, fromParams[0], coerce);
} else {
for (Parameter fromParam : fromParams) {
@@ -180,7 +175,7 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
type = fromParam.getType();
namedParam.addMember("type", classX(type));
} else {
- // TODO: Check attribute type is is assignable to declared param type?
+ // TODO: Check attribute type is assignable to declared param type?
}
boolean required = memberHasValue(namedParam, "required", true);
@@ -206,22 +201,19 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
Set<String> names = new HashSet<>();
List<PropertyNode> props = getAllProperties(names, fromParam.getType(), true, false, false, true, false, true);
- for (String next : names) {
- if (hasDuplicates(this, mNode, propNames, next)) return false;
+ for (String name : names) {
+ if (hasDuplicates(this, mNode, propNames, name)) return false;
}
- List<MapEntryExpression> entries = new ArrayList<>();
- for (PropertyNode pNode : props) {
- String name = pNode.getName();
- // create entry [name: __namedArgs.getOrDefault('name', initialValue)]
- Expression defaultValue = Optional.ofNullable(pNode.getInitialExpression()).orElseGet(() -> defaultValueX(pNode.getType()));
- entries.add(entryX(constX(name), asType(callX(varX(mapParam), "getOrDefault", args(constX(name), defaultValue)), pNode.getType(), coerce)));
- // create annotation @NamedParam(value='name', type=DelegateType)
+ for (PropertyNode prop : props) {
+ // create annotation @NamedParam(value='name', type=PropertyType)
AnnotationNode namedParam = new AnnotationNode(NAMED_PARAM_TYPE);
- namedParam.addMember("value", constX(name));
- namedParam.addMember("type", classX(pNode.getType()));
+ namedParam.addMember("value", constX(prop.getName()));
+ namedParam.addMember("type", classX(prop.getType()));
mapParam.addAnnotation(namedParam);
}
- Expression delegateMap = mapX(entries);
+
+ Expression[] subMapArgs = names.stream().map(name -> constX(name)).toArray(Expression[]::new);
+ Expression delegateMap = callX(varX(mapParam), "subMap", args(subMapArgs));
args.addExpression(castX(fromParam.getType(), delegateMap));
return true;
}
diff --git a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index 7534421..16a364e 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -311,7 +311,7 @@ final class NamedVariantTransformTest {
}
@Test // GROOVY-10261
- void testNamedDelegateWithDefaultArguments() {
+ void testNamedVariantWithDefaultArguments() {
assertScript '''
import groovy.transform.*
@@ -333,7 +333,7 @@ final class NamedVariantTransformTest {
'''
}
- @Test // GROOVY-9183
+ @Test // GROOVY-9183, GROOVY-10500
void testNamedDelegateWithPropertyDefaults() {
assertScript '''
import groovy.transform.*
@@ -362,7 +362,8 @@ final class NamedVariantTransformTest {
String separator = ','
Boolean headers = true
Integer headersRow = 0
- Integer firstDataRow = 1
+ Integer firstDataRow = FIRST_DATA_ROW
+ private static final int FIRST_DATA_ROW = 1
}
}