[ 
https://issues.apache.org/jira/browse/GROOVY-10761?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17607278#comment-17607278
 ] 

Christopher Smith commented on GROOVY-10761:
--------------------------------------------

I have it working now; the code I posted was simplified, and I had been saving 
the result of {{makeClass...}} into a constant. Apparently the compiler Did Not 
Like that I reused the {{ClassNode}} for the return type across various 
{{MethodNode}}s, and changing the constant to a factory method (producing clean 
instances each time) fixed it. I have no idea how this squares with the 
intended use case of reusing {{ClassHelper.MAP_TYPE}}.

> MethodNode won't accept ClassNode with generics as return type
> --------------------------------------------------------------
>
>                 Key: GROOVY-10761
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10761
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler
>    Affects Versions: 4.0.5
>            Reporter: Christopher Smith
>            Priority: Major
>
> This is likely a case of "there's a specific idiomatic way to make this 
> work", but the overall API documentation suggests that this case _should_ 
> work. I have a base class with a generic property:
> {code}
> class Base<M> {
>   M meta
> }
> {code}
> In an ASTT, I attempt to create this derived class:
> {code}
> class Derived extends Base<Map<String, Object>> {
>   final Map<String, Object> getMeta() { super.getMeta() }
>   final void setMeta(Map<String, Object> value) { super.setMeta(value) }
> }
> {code}
> I am trying to create the {{getMeta}} method as follows:
> {code}
> derivedCn.addMethod(new MethodNode(
>   'getMeta',
>   PUBLIC | FINAL,
>   makeClassSafeWithGenerics(makeWithoutCaching(Map), 
> STRING_TYPE.asGenericsType(), OBJECT_TYPE.asGenericsType()),
>   Parameter.EMPTY_ARRAY,
>   ClassNode.EMPTY_ARRAY,
>   returnS(callSuperX(name))
> ))
> {code}
> In particular, I'm following the "official" format for creating a 
> {{ClassNode}} representing {{Map<String, Object>}}. However, I still receive 
> the compiler error
> {code}
> A transform used a generics containing ClassNode 
> java.util.Map<java.lang.String, java.lang.Object> for the method public final 
> java.util.Map<java.lang.String, java.lang.Object> getMeta() { ... } directly. 
> You are not supposed to do this. Please create a new ClassNode referring to 
> the old ClassNode and use the new ClassNode instead of the old one. Otherwise 
> the compiler will create wrong descriptors and a potential 
> NullPointerException in TypeResolver in the OpenJDK. If this is not your own 
> doing, please report this bug to the writer of the transform.
> {code}
> I observe that {{MethodNode}} defines a property {{genericsTypes}}, but in 
> this case the method itself is not generic, it simply has a (non-generic) 
> return type that is itself generic.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to