[
https://issues.apache.org/jira/browse/GROOVY-10574?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17524347#comment-17524347
]
Leonard Brünings commented on GROOVY-10574:
-------------------------------------------
Is it recommended/idiomatic to use {{@Category}} for
{{org.codehaus.groovy.runtime.ExtensionModule}}'s {{staticExtensionClasses}} or
just a convenient workaround?
> @NamedVariant generation does not work with extension methods
> -------------------------------------------------------------
>
> Key: GROOVY-10574
> URL: https://issues.apache.org/jira/browse/GROOVY-10574
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.5.16, 3.0.10, 4.0.1
> Reporter: Leonard Brünings
> Priority: Major
> Labels: named-parameters
> Attachments: screenshot-1.png
>
>
> Based on the discussion in GROOVY-10567 I tried creating a extension method
> by explicitly annotating the other parameters with {{@NamedParam}}. However,
> the method was not picked up as an extension method.
> As an example:
> {code:groovy}
> import groovy.transform.*
> @NamedVariant
> static javaBlockingTest(File self,
> @NamedParam String packageName = 'com.example',
> @NamedParam String className = "BlockingTest") {
> }
> {code}
> will generate as
> {code:groovy}
> @groovy.transform.Generated
> public static java.lang.Object
> javaBlockingTest(@groovy.transform.NamedParams(value =
> [@groovy.transform.NamedParam(value = 'packageName', type =
> java.lang.String), @groovy.transform.NamedParam(value = 'className', type =
> java.lang.String)]) java.util.Map namedArgs, java.io.File self) {
> if ( namedArgs == null) {
> throw new java.lang.IllegalArgumentException('Named parameter map
> cannot be null')
> }
> for (java.lang.String namedArgKey : namedArgs.keySet()) {
> assert ['self', 'packageName', 'className'].contains( namedArgKey
> ) : 'Unrecognized namedArgKey: ' + namedArgKey }
> return this.javaBlockingTest(self,
> namedArgs.containsKey('packageName') ? namedArgs.packageName : 'com.example',
> namedArgs.containsKey('className') ? namedArgs.className : 'BlockingTest')
> }
> {code}
> Important to note is that the {{namedArgs}} parameter was moved before the
> {{self}} parameter, basically shifting the extended type from {{File}} to
> {{Map}}.
> If we handcraft
> {code:groovy}
> public static java.lang.Object javaBlockingTest(java.io.File self,
> @groovy.transform.NamedParams(value = [@groovy.transform.NamedParam(value =
> 'packageName', type = java.lang.String), @groovy.transform.NamedParam(value =
> 'className', type = java.lang.String)]) java.util.Map namedArgs) {
> }
> {code}
> it works as expected.
> IMHO we would need a flag {{@NamedVariant(extensionMethod = true)}}, which
> changes the generated code by preserving the first parameter.
--
This message was sent by Atlassian Jira
(v8.20.7#820007)