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/21 10:04:44 UTC
[groovy] 01/01: GROOVY-10500: `@NamedVariant`: slice named args map for `@NamedDelegate`
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-10500
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 0663f0f94ff14976a6be5356c7b135765495a975
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 9bc6d18..82924b7 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;
@@ -66,10 +64,8 @@ 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.list2args;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.mapX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
import static org.codehaus.groovy.ast.tools.GeneralUtils.plusX;
@@ -118,8 +114,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) {
@@ -176,7 +171,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);
@@ -202,22 +197,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 0c882fd..58e3428 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -310,7 +310,7 @@ final class NamedVariantTransformTest {
}
@Test // GROOVY-10261
- void testNamedDelegateWithDefaultArguments() {
+ void testNamedVariantWithDefaultArguments() {
assertScript '''
import groovy.transform.*
@@ -332,7 +332,7 @@ final class NamedVariantTransformTest {
'''
}
- @Test // GROOVY-9183
+ @Test // GROOVY-9183, GROOVY-10500
void testNamedDelegateWithPropertyDefaults() {
assertScript '''
import groovy.transform.*
@@ -361,7 +361,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
}
}