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