You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Leonard Brünings (Jira)" <ji...@apache.org> on 2022/05/19 08:10:00 UTC
[jira] [Commented] (GROOVY-10561) @NamedVariant self referential default values are not correctly resolved
[ https://issues.apache.org/jira/browse/GROOVY-10561?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17539386#comment-17539386 ]
Leonard Brünings commented on GROOVY-10561:
-------------------------------------------
[~paulk],[~emilles] will this also be fixed in 2.x. and 3.x?
> @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
> Assignee: Paul King
> Priority: Major
> Labels: named-parameters
> Fix For: 5.0.0-alpha-1, 4.0.2
>
> Time Spent: 1h
> Remaining Estimate: 0h
>
> 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.7#820007)