Christopher Smith created GROOVY-10761:
------------------------------------------

             Summary: 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


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