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 d5adf21b4102c956d98ca0179b17def4e5191305
Author: Paul King <[email protected]>
AuthorDate: Mon Feb 21 23:07:54 2022 +1000

    GROOVY-10502: `@NamedVariant`: improve default value treatment
    
    Conflicts:
        
src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
---
 .../groovy/transform/NamedVariantASTTransformation.java    | 14 +++++++++-----
 .../groovy/transform/NamedVariantTransformTest.groovy      |  5 +++--
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
 
b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index 25c8740..43bc0e6 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -66,14 +66,16 @@ 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.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.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;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ternaryX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 
 @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
@@ -83,6 +85,7 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
     private static final String NAMED_VARIANT = "@" + 
NAMED_VARIANT_TYPE.getNameWithoutPackage();
     private static final ClassNode NAMED_PARAM_TYPE = 
makeWithoutCaching(NamedParam.class, false);
     private static final ClassNode NAMED_DELEGATE_TYPE = 
makeWithoutCaching(NamedDelegate.class, false);
+    private static final ClassNode ILLEGAL_ARGUMENT_TYPE = 
makeWithoutCaching(IllegalArgumentException.class);
 
     @Override
     public void visit(final ASTNode[] nodes, final SourceUnit source) {
@@ -99,7 +102,7 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
 
         boolean autoDelegate = memberHasValue(anno, "autoDelegate", true);
         boolean coerce = memberHasValue(anno, "coerce", true);
-        Parameter mapParam = param(GenericsUtils.nonGeneric(MAP_TYPE), 
"__namedArgs");
+        Parameter mapParam = param(GenericsUtils.nonGeneric(MAP_TYPE), 
"namedArgs");
         List<Parameter> genParams = new ArrayList<>();
         genParams.add(mapParam);
         ClassNode cNode = mNode.getDeclaringClass();
@@ -227,6 +230,10 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
 
     private void createMapVariant(final MethodNode mNode, final AnnotationNode 
anno, final Parameter mapParam, final List<Parameter> genParams, final 
ClassNode cNode, final BlockStatement inner, final ArgumentListExpression args, 
final List<String> propNames) {
         Parameter namedArgKey = param(STRING_TYPE, "namedArgKey");
+        if (!(mNode instanceof ConstructorNode)) {
+            inner.getStatements().add(0, ifS(isNullX(varX(mapParam)),
+                    throwS(ctorX(ILLEGAL_ARGUMENT_TYPE, constX("Named 
parameter map cannot be null")))));
+        }
         inner.addStatement(
                 new ForStatement(
                         namedArgKey,
@@ -276,9 +283,6 @@ public class NamedVariantASTTransformation extends 
AbstractASTTransformation {
             defaultValue = defaultValueX(type);
         }
         if (defaultValue != null) {
-            if (isPrimitiveType(type)) { // handle null for primitive
-                value = ternaryX(notNullX(value), value, defaultValueX(type));
-            }
             value = ternaryX(containsKey(mapParam, name), value, defaultValue);
         }
         return asType(value, type, coerce);
diff --git 
a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy 
b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index 58e3428..16a364e 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -229,6 +229,7 @@ final class NamedVariantTransformTest {
 
         assertScript '''
             import groovy.transform.*
+            import static groovy.test.GroovyAssert.shouldFail
 
             @NamedVariant
             def m(int one, int two = 42) {
@@ -238,8 +239,8 @@ final class NamedVariantTransformTest {
             String result = m(one:0, two:0)
             assert result == '0 0'
 
-            result = m(one:0, two:null)
-            assert result == '0 0'
+            shouldFail(MissingMethodException) { m(one:null) }
+            shouldFail(MissingMethodException) { m(one:0, two:null) }
         '''
     }
 

Reply via email to