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
                 }
             }
 

Reply via email to