[ 
https://issues.apache.org/jira/browse/GROOVY-10561?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Leonard Brünings updated GROOVY-10561:
--------------------------------------
    Description: 
If a default parameter refers to another parameter ( {{String language = 
'java', String extension = language}} ) it will fail, when the named variant is 
used.
{code:groovy}
import groovy.transform.NamedVariant
import spock.lang.Specification

class Demo {
    @NamedVariant
    String fileInSourceSet(String language = 'java', String extension = 
language) {
        return "$language -> .$extension"
    }
    
    def test() {
                assert fileInSourceSet() == 'java -> .java'
                assert fileInSourceSet('groovy') == 'groovy -> .groovy'
                assert fileInSourceSet(language: 'kotlin', extension: 'kt') == 
'kotlin -> .kt'
        // fails
                assert fileInSourceSet(language: 'groovy') == 'groovy -> 
.groovy'
    }
    
    static main(args) {
            new Demo().test() 
    }    
}
{code}
See on 
[WebConsole|https://gwc-experiment.appspot.com/?g=groovy_3_0&codez=eJyNUU1rwzAMPTe_QpRCEujS-6Bjh1126SWwu0iV4C2Wh610G6P_ff5KWAtl00HgJ72nJ1npd2MFBmvM6asRi-x6Y3VzQE3HF7QKWYqiG9E5eCJt4LsAH48X9YC0YhUP0KuRnrk1k-2oJakyPCIPEw4Eeyhf8YTldibQpxA7ZdiX5q46TwlhSSbLsN4sEncP0GwW2jp2nmOO6Ug9CDmpgspq5Y2TX_DaVw37bCXqRU-3u8t0nzKx0iPyMn6bObu-h_LNyKjYb754D6Bk0VSNoh5b1t_toEc1un9N-Mvl1aWcoKgONCqu0A7u99lDMH3EP6_qJh80KUSBc1FcNP8AgUKxrg]
 (as long as deployed version is 3.0.10)
{noformat}
groovy.lang.MissingPropertyException: No such property: language for class: Demo
        at Demo.fileInSourceSet(Script1.groovy)
        at Demo$fileInSourceSet$2.callCurrent(Unknown Source)
        at Demo.test(Script1.groovy:14)
        at Demo$test.call(Unknown Source)
        at Demo.main(Script1.groovy:18)
{noformat}
It generates
{code:java}
@groovy.transform.Generated
    public java.lang.String fileInSourceSet(@groovy.transform.NamedParams(value 
= [@groovy.transform.NamedParam(value = 'language', type = java.lang.String, 
required = false), @groovy.transform.NamedParam(value = 'extension', type = 
java.lang.String, required = false)]) java.util.Map namedArgs) {
        if ( namedArgs == null) {
            throw new java.lang.IllegalArgumentException('Named parameter map 
cannot be null')
        }
        for (java.lang.String namedArgKey : namedArgs.keySet()) {
            assert ['language', 'extension'].contains( namedArgKey ) : 
'Unrecognized namedArgKey: ' + namedArgKey }
        return this.fileInSourceSet(namedArgs.containsKey('language') ? 
namedArgs.language : 'java', namedArgs.containsKey('extension') ? 
namedArgs.extension : language )
    }{code}
The problematic line is {{namedArgs.containsKey('extension') ? 
namedArgs.extension : language which either would have to duplicate the logic 
for {{language}}}} or use a local variable for it.

Relates to GROOVY-10261

  was:
If a default parameter refers to another parameter ( {{String language = 
'java', String extension = language}} ) it will fail, when the named variant is 
used.
{code:groovy}
import groovy.transform.NamedVariant
import spock.lang.Specification

class Demo {
    @NamedVariant
    String fileInSourceSet(String language = 'java', String extension = 
language) {
        return "$language -> .$extension"
    }
    
    def test() {
                assert fileInSourceSet() == 'java -> .java'
                assert fileInSourceSet('groovy') == 'groovy -> .groovy'
                assert fileInSourceSet(language: 'kotlin', extension: 'kt') == 
'kotlin -> .kt'
        // fails
                assert fileInSourceSet(language: 'groovy') == 'groovy -> 
.groovy'
    }
    
    static main(args) {
            new Demo().test() 
    }    
}
{code}
See on 
[WebConsole|https://gwc-experiment.appspot.com/?g=groovy_3_0&codez=eJyNUU1rwzAMPTe_QpRCEujS-6Bjh1126SWwu0iV4C2Wh610G6P_ff5KWAtl00HgJ72nJ1npd2MFBmvM6asRi-x6Y3VzQE3HF7QKWYqiG9E5eCJt4LsAH48X9YC0YhUP0KuRnrk1k-2oJakyPCIPEw4Eeyhf8YTldibQpxA7ZdiX5q46TwlhSSbLsN4sEncP0GwW2jp2nmOO6Ug9CDmpgspq5Y2TX_DaVw37bCXqRU-3u8t0nzKx0iPyMn6bObu-h_LNyKjYb754D6Bk0VSNoh5b1t_toEc1un9N-Mvl1aWcoKgONCqu0A7u99lDMH3EP6_qJh80KUSBc1FcNP8AgUKxrg]
 (as long as deployed version is 3.0.10)
{noformat}
groovy.lang.MissingPropertyException: No such property: language for class: Demo
        at Demo.fileInSourceSet(Script1.groovy)
        at Demo$fileInSourceSet$2.callCurrent(Unknown Source)
        at Demo.test(Script1.groovy:14)
        at Demo$test.call(Unknown Source)
        at Demo.main(Script1.groovy:18)
{noformat}
Relates to GROOVY-10261


> @NamedVariant self referential default values are not correctly resolved
> ------------------------------------------------------------------------
>
>                 Key: GROOVY-10561
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10561
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.16, 3.0.10, 4.0.1
>            Reporter: Leonard Brünings
>            Priority: Major
>
> If a default parameter refers to another parameter ( {{String language = 
> 'java', String extension = language}} ) it will fail, when the named variant 
> is used.
> {code:groovy}
> import groovy.transform.NamedVariant
> import spock.lang.Specification
> class Demo {
>     @NamedVariant
>     String fileInSourceSet(String language = 'java', String extension = 
> language) {
>         return "$language -> .$extension"
>     }
>     
>     def test() {
>               assert fileInSourceSet() == 'java -> .java'
>               assert fileInSourceSet('groovy') == 'groovy -> .groovy'
>               assert fileInSourceSet(language: 'kotlin', extension: 'kt') == 
> 'kotlin -> .kt'
>         // fails
>               assert fileInSourceSet(language: 'groovy') == 'groovy -> 
> .groovy'
>     }
>     
>     static main(args) {
>             new Demo().test() 
>     }    
> }
> {code}
> See on 
> [WebConsole|https://gwc-experiment.appspot.com/?g=groovy_3_0&codez=eJyNUU1rwzAMPTe_QpRCEujS-6Bjh1126SWwu0iV4C2Wh610G6P_ff5KWAtl00HgJ72nJ1npd2MFBmvM6asRi-x6Y3VzQE3HF7QKWYqiG9E5eCJt4LsAH48X9YC0YhUP0KuRnrk1k-2oJakyPCIPEw4Eeyhf8YTldibQpxA7ZdiX5q46TwlhSSbLsN4sEncP0GwW2jp2nmOO6Ug9CDmpgspq5Y2TX_DaVw37bCXqRU-3u8t0nzKx0iPyMn6bObu-h_LNyKjYb754D6Bk0VSNoh5b1t_toEc1un9N-Mvl1aWcoKgONCqu0A7u99lDMH3EP6_qJh80KUSBc1FcNP8AgUKxrg]
>  (as long as deployed version is 3.0.10)
> {noformat}
> groovy.lang.MissingPropertyException: No such property: language for class: 
> Demo
>       at Demo.fileInSourceSet(Script1.groovy)
>       at Demo$fileInSourceSet$2.callCurrent(Unknown Source)
>       at Demo.test(Script1.groovy:14)
>       at Demo$test.call(Unknown Source)
>       at Demo.main(Script1.groovy:18)
> {noformat}
> It generates
> {code:java}
> @groovy.transform.Generated
>     public java.lang.String 
> fileInSourceSet(@groovy.transform.NamedParams(value = 
> [@groovy.transform.NamedParam(value = 'language', type = java.lang.String, 
> required = false), @groovy.transform.NamedParam(value = 'extension', type = 
> java.lang.String, required = false)]) java.util.Map namedArgs) {
>         if ( namedArgs == null) {
>             throw new java.lang.IllegalArgumentException('Named parameter map 
> cannot be null')
>         }
>         for (java.lang.String namedArgKey : namedArgs.keySet()) {
>             assert ['language', 'extension'].contains( namedArgKey ) : 
> 'Unrecognized namedArgKey: ' + namedArgKey }
>         return this.fileInSourceSet(namedArgs.containsKey('language') ? 
> namedArgs.language : 'java', namedArgs.containsKey('extension') ? 
> namedArgs.extension : language )
>     }{code}
> The problematic line is {{namedArgs.containsKey('extension') ? 
> namedArgs.extension : language which either would have to duplicate the logic 
> for {{language}}}} or use a local variable for it.
> Relates to GROOVY-10261



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to