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/04/19 14:40:00 UTC
[jira] [Comment Edited] (GROOVY-10574) @NamedVariant generation does not work with extension methods
[ https://issues.apache.org/jira/browse/GROOVY-10574?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17524347#comment-17524347 ]
Leonard Brünings edited comment on GROOVY-10574 at 4/19/22 2:39 PM:
--------------------------------------------------------------------
Is it recommended/idiomatic to use {{@Category}} for {{org.codehaus.groovy.runtime.ExtensionModule}}'s {{extensionClasses}} and {{staticExtensionClasses}} or just a convenient workaround?
was (Author: leonard84):
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)