[ https://issues.apache.org/jira/browse/GROOVY-11325?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eric Milles updated GROOVY-11325: --------------------------------- Description: This is a follow-up of GROOVY-10561. The fix didn't handle the case when the default value included any kind of calculation. Example in the [GroovyWebConsole|https://gwc-experiment.appspot.com/?g=groovy_4_0&codez=eNp9j8EKwjAMhu99ip9RmHNjLK2nQsEn8Oi9sk122Dq6UlDx3c1EUBEMgfDBlz9kGGcfIs7B-3SpY3DT0vsw1lshxP7gxq49ujC4KYq263Fy180wRSSCxU5VeIJiSFTSC_WKqqQCN2SSVcmGTDrDXbhl6fjcmpPIgJoC1iKnBkQglf8KFWcZqLeouOmPyFMb6K8F3eT8Dz7qAcyNP7Y] {code:groovy} @NamedVariant baz(int v1 = 42, int v2 = v1+1, int v3 = v2+1) { "$v1 $v2 $v3" } assert baz() == '42 43 44' assert baz(10) == '10 11 12' assert baz(10, 20) == '10 20 21' assert baz(10, 20, 30) == '10 20 30' assert baz(v1: 10) == '10 11 12' assert baz(v1: 10, v2: 20) == '10 20 21' assert baz(v1: 10, v2: 20, v3: 30) == '10 20 30' {code} The generated code looks like this: {code:groovy} public java.lang.Object baz(@groovy.transform.NamedParams(value = [ @groovy.transform.NamedParam(value = 'v1', type = int, required = false), @groovy.transform.NamedParam(value = 'v2', type = int, required = false), @groovy.transform.NamedParam(value = 'v3', type = int, required = false) ]) java.util.Map namedArgs) { if (null == namedArgs ) { throw new java.lang.IllegalArgumentException('Named parameter map cannot be null') } for (java.lang.String namedArgKey : namedArgs.keySet()) { assert ['v1', 'v2', 'v3'].contains( namedArgKey ) : 'Unrecognized namedArgKey: ' + namedArgKey } return this.baz( namedArgs.containsKey('v1') ? namedArgs.v1 : 42, namedArgs.containsKey('v2') ? namedArgs.v2 : v1 + 1, namedArgs.containsKey('v3') ? namedArgs.v3 : v2 + 1) } {code} IMHO, it would be easiest to extract the map entries into local variables, then the references would be valid and would also work for cascading references. was: This is a follow-up of GROOVY-10561. The fix didn't handle the case when the default value included any kind of calculation. Example in the [GroovyWebConsole|https://gwc-experiment.appspot.com/?g=groovy_4_0&codez=eNp9j8EKwjAMhu99ip9RmHNjLK2nQsEn8Oi9sk122Dq6UlDx3c1EUBEMgfDBlz9kGGcfIs7B-3SpY3DT0vsw1lshxP7gxq49ujC4KYq263Fy180wRSSCxU5VeIJiSFTSC_WKqqQCN2SSVcmGTDrDXbhl6fjcmpPIgJoC1iKnBkQglf8KFWcZqLeouOmPyFMb6K8F3eT8Dz7qAcyNP7Y] {code:groovy} @NamedVariant baz(int v1 = 42, int v2 = v1+1, int v3 = v2+1) { "$v1 $v2 $v3" } assert baz() == '42 43 44' assert baz(10) == '10 11 12' assert baz(10, 20) == '10 20 21' assert baz(10, 20, 30) == '10 20 30' assert baz(v1: 10) == '10 11 12' assert baz(v1: 10, v2: 20) == '10 20 21' assert baz(v1: 10, v2: 20, v3: 30) == '10 20 30' {code} The generated code looks like this: {code:groovy} public java.lang.Object baz(@groovy.transform.NamedParams(value = [@groovy.transform.NamedParam(value = 'v1', type = int, required = false), @groovy.transform.NamedParam(value = 'v2', type = int, required = false), @groovy.transform.NamedParam(value = 'v3', type = int, required = false)]) java.util.Map namedArgs) { if (null == namedArgs ) { throw new java.lang.IllegalArgumentException('Named parameter map cannot be null') } for (java.lang.String namedArgKey : namedArgs.keySet()) { assert ['v1', 'v2', 'v3'].contains( namedArgKey ) : 'Unrecognized namedArgKey: ' + namedArgKey } return this.baz(namedArgs.containsKey('v1') ? namedArgs.v1 : 42, namedArgs.containsKey('v2') ? namedArgs.v2 : v1 + 1, namedArgs.containsKey('v3') ? namedArgs.v3 : v2 + 1) } {code} IMHO, it would be easiest to extract the map entries into local variables, then the references would be valid and would also work for cascading references. > @NamedVariant self referential default values are not correctly resolved when > calculations are involved > ------------------------------------------------------------------------------------------------------- > > Key: GROOVY-11325 > URL: https://issues.apache.org/jira/browse/GROOVY-11325 > Project: Groovy > Issue Type: Bug > Affects Versions: 2.5.23, 3.0.20, 4.0.17 > Reporter: Leonard Brünings > Priority: Major > Labels: named-parameters > > This is a follow-up of GROOVY-10561. The fix didn't handle the case when the > default value included any kind of calculation. Example in the > [GroovyWebConsole|https://gwc-experiment.appspot.com/?g=groovy_4_0&codez=eNp9j8EKwjAMhu99ip9RmHNjLK2nQsEn8Oi9sk122Dq6UlDx3c1EUBEMgfDBlz9kGGcfIs7B-3SpY3DT0vsw1lshxP7gxq49ujC4KYq263Fy180wRSSCxU5VeIJiSFTSC_WKqqQCN2SSVcmGTDrDXbhl6fjcmpPIgJoC1iKnBkQglf8KFWcZqLeouOmPyFMb6K8F3eT8Dz7qAcyNP7Y] > {code:groovy} > @NamedVariant baz(int v1 = 42, int v2 = v1+1, int v3 = v2+1) { "$v1 $v2 $v3" } > assert baz() == '42 43 44' > assert baz(10) == '10 11 12' > assert baz(10, 20) == '10 20 21' > assert baz(10, 20, 30) == '10 20 30' > assert baz(v1: 10) == '10 11 12' > assert baz(v1: 10, v2: 20) == '10 20 21' > assert baz(v1: 10, v2: 20, v3: 30) == '10 20 30' > {code} > The generated code looks like this: > {code:groovy} > public java.lang.Object baz(@groovy.transform.NamedParams(value = [ > @groovy.transform.NamedParam(value = 'v1', type = int, required = false), > @groovy.transform.NamedParam(value = 'v2', type = int, required = false), > @groovy.transform.NamedParam(value = 'v3', type = int, required = false) > ]) java.util.Map namedArgs) { > if (null == namedArgs ) { > throw new java.lang.IllegalArgumentException('Named parameter map > cannot be null') > } > for (java.lang.String namedArgKey : namedArgs.keySet()) { > assert ['v1', 'v2', 'v3'].contains( namedArgKey ) : 'Unrecognized > namedArgKey: ' + namedArgKey > } > return this.baz( > namedArgs.containsKey('v1') ? namedArgs.v1 : 42, > namedArgs.containsKey('v2') ? namedArgs.v2 : v1 + 1, > namedArgs.containsKey('v3') ? namedArgs.v3 : v2 + 1) > } > {code} > IMHO, it would be easiest to extract the map entries into local variables, > then the references would be valid and would also work for cascading > references. -- This message was sent by Atlassian Jira (v8.20.10#820010)