This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_3_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 6413ca250743d46221b37b172bc0e804452cb745 Author: Eric Milles <[email protected]> AuthorDate: Mon Feb 21 03:58:46 2022 -0600 GROOVY-10500: `@NamedVariant`: slice named args map for `@NamedDelegate` Conflicts: src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java --- .../transform/NamedVariantASTTransformation.java | 29 ++++++++-------------- .../transform/NamedVariantTransformTest.groovy | 7 +++--- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java index 385102c..25c8740 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; @@ -66,12 +65,10 @@ 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; -import static org.codehaus.groovy.ast.tools.GeneralUtils.mapX; -import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX; import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX; 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; @@ -119,8 +116,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) { @@ -203,22 +199,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(mNode, propNames, next)) return false; + for (String name : names) { + if (hasDuplicates(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 } }
