You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (JIRA)" <ji...@apache.org> on 2018/06/15 11:48:00 UTC

[jira] [Commented] (GROOVY-8627) Compile error using NamedParam with value

    [ https://issues.apache.org/jira/browse/GROOVY-8627?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16513705#comment-16513705 ] 

Eric Milles commented on GROOVY-8627:
-------------------------------------

This is what I came up with for a fix in the transform class:
{code:java}
            for (Parameter fromParam : fromParams) {
                if (hasAnnotation(fromParam, NAMED_PARAM_TYPE)) {
                    AnnotationNode namedParam = fromParam.getAnnotations(NAMED_PARAM_TYPE).get(0);
                    boolean required = memberHasValue(namedParam, "required", Boolean.TRUE);
                    // GRECLIPSE edit -- GROOVY-8627
                    //if (getMemberValue(namedParam, "name") == null) {
                    if (getMemberValue(namedParam, "value") == null) {
                    // GRECLIPSE end
                        namedParam.addMember("value", constX(fromParam.getName()));
                    }
                    String name = getMemberStringValue(namedParam, "value");
{code}

The annotation could be fixed by adding "default null" to the value attribute.

> Compile error using NamedParam with value
> -----------------------------------------
>
>                 Key: GROOVY-8627
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8627
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.0
>            Reporter: Eric Milles
>            Priority: Major
>
> {{NamedVariantASTTransformation}} has bug checking for presence of {{value}} member.
> {code:java}
>             for (Parameter fromParam : fromParams) {
>                 if (AnnotatedNodeUtils.hasAnnotation(fromParam, NAMED_PARAM_TYPE)) {
>                     AnnotationNode namedParam = fromParam.getAnnotations(NAMED_PARAM_TYPE).get(0);
>                     boolean required = memberHasValue(namedParam, "required", true);
>                     if (getMemberValue(namedParam, "name") == null) {
>                         namedParam.addMember("value", constX(fromParam.getName()));
>                     }
>                     String name = getMemberStringValue(namedParam, "value");
> {code}
> Check here is for {{name}} and if not found, fill in {{value}} from name of annotated param.  There are 2 problems with this:
> 1. {{NamedParam}} has no {{name}} member
> 2. {{NamedParam}} indicates {{value}} as required (no default value provided in declaration)
> Example that produces error:
> {code:groovy}
> import groovy.transform.*
> @ToString(includeNames=true)
> class Color {
>   Integer r, g, b
> }
> @NamedVariant\n" +
> String m(@NamedDelegate Color color, @NamedParam(value='a', required=true) int alpha) {
>   return [color, alpha].join(' ')
> }
> print m(r:1, g:2, b:3, a: 0)
> {code}
> Compiling this script results in this error because the {{@NamedParam}} annotation already has a {{value}} member when this line from the transform is executed: {{namedParam.addMember("value", constX(fromParam.getName()));}}.
> {code}
> 1. ERROR in Script.groovy (at line 1)\r\n
> 	import groovy.transform.*\r\n
> 	^\n
> Groovy:Groovy compiler error: exception in phase 'semantic analysis' in source unit 'Script.groovy' Annotation member value has already been added @ line 1, column 0.
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)