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/03/01 12:40:06 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-10484: `@NamedVariant`: bind `@NamedParam` into `@NamedParams`

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new ca789f4  GROOVY-10484: `@NamedVariant`: bind `@NamedParam` into `@NamedParams`
ca789f4 is described below

commit ca789f4aa6c509641834246558d8b52ae95f7a70
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Feb 16 11:09:50 2022 -0600

    GROOVY-10484: `@NamedVariant`: bind `@NamedParam` into `@NamedParams`
---
 .../transform/NamedVariantASTTransformation.java       | 16 ++++++++++++++++
 .../groovy/transform/NamedVariantTransformTest.groovy  | 18 ++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index c09a349..153a270 100644
--- a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -20,6 +20,7 @@ package org.codehaus.groovy.transform;
 
 import groovy.transform.NamedDelegate;
 import groovy.transform.NamedParam;
+import groovy.transform.NamedParams;
 import groovy.transform.NamedVariant;
 import org.apache.groovy.ast.tools.AnnotatedNodeUtils;
 import org.codehaus.groovy.ast.ASTNode;
@@ -29,6 +30,7 @@ import org.codehaus.groovy.ast.ConstructorNode;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.PropertyNode;
+import org.codehaus.groovy.ast.expr.AnnotationConstantExpression;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
@@ -65,6 +67,7 @@ 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.listX;
 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;
@@ -132,9 +135,22 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
                 }
             }
         }
+        collateNamedParamAnnotations(mapParam);
         createMapVariant(mNode, anno, mapParam, genParams, cNode, inner, args, propNames);
     }
 
+    private static void collateNamedParamAnnotations(final Parameter mapParam) {
+        AnnotationNode namedParams = new AnnotationNode(make(NamedParams.class));
+        List<AnnotationNode> mapParamAnnotations = mapParam.getAnnotations();
+        List<Expression> collect = new ArrayList<>();
+        for (AnnotationNode annotationNode : mapParamAnnotations) {
+            collect.add(new AnnotationConstantExpression(annotationNode));
+        }
+        namedParams.addMember("value", listX(collect));
+        mapParamAnnotations.clear();
+        mapParamAnnotations.add(namedParams);
+    }
+
     private boolean processImplicitNamedParam(final MethodNode mNode, final Parameter mapParam, final BlockStatement inner, final ArgumentListExpression args, final List<String> propNames, final Parameter fromParam) {
         String name = fromParam.getName();
         ClassNode type = fromParam.getType();
diff --git a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index 5b20df9..85bac0c 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -271,6 +271,7 @@ final class NamedVariantTransformTest {
 
     @Test
     void testNamedParamRequiredVersusOptional() {
+        // check dynamic case
         def err = shouldFail '''
             import groovy.transform.*
 
@@ -286,6 +287,23 @@ final class NamedVariantTransformTest {
             m(alpha: 123)
         '''
         assert err =~ /Missing required named argument 'color'/
+
+        // also check static error (GROOVY-10484)
+        err = shouldFail '''
+            import groovy.transform.*
+            class Color {
+                int r, g, b
+            }
+            @NamedVariant
+            String m(Color color, int alpha = 0) {
+                return [color, alpha].join(' ')
+            }
+            @TypeChecked
+            void test() {
+                m(alpha: 123)
+            }
+        '''
+        assert err =~ /required named param 'color' not found/
     }
 
     @Test // GROOVY-9183