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

Christopher Smith commented on GROOVY-10758:
--------------------------------------------

{{Resource}} is a Java class in a precompiled dependency jar. I was assembling 
{{FooResource}} "by hand", approximately this (I've been tweaking as I go 
along):

{code}
ClassHelper.makeWithoutCaching(fqcn).tap {
  modifiers |= PUBLIC | FINAL
  superClass = makeWithoutCaching(resourceBaseClass).tap { genericsTypes = 
[attr] as GenericsType }

  // add annotations and methods
}
{code}

As the Javadoc on {{ClassNode}} says "A ClassNode should be created using the 
methods in ClassHelper", I had naively expected that "make without caching" 
(because that's what we do for {{Map}}) meant "get a new instance so I can 
customize the generics on it". I eventually found the methods in 
{{GenericsUtils}} after your tips on Stack Overflow, but 
{{makeClassSafeWithGenerics}} is a rather unenlightening method name and 
carries no Javadoc.

> Improve error message when using generic ClassNodes in ASTT
> -----------------------------------------------------------
>
>                 Key: GROOVY-10758
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10758
>             Project: Groovy
>          Issue Type: Improvement
>          Components: Compiler
>    Affects Versions: 4.0.5
>            Reporter: Christopher Smith
>            Priority: Minor
>
> When mistakenly using a shared instance of a {{ClassNode}} that has generics 
> applied, the compiler (helpfully!) produces this error:
> {code}
> transform used a generics containing ClassNode 
> com.example.Resource<com.example.FooAttributes> for the super class 
> com.example.FooResource 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}
> However, there is no explanation of *how* to create the "new ClassNode", and 
> [I couldn't find anything in the API that made the error go 
> away|https://stackoverflow.com/questions/73749765/how-do-i-subclass-a-generic-base-class-in-a-groovy-ast-transformation].
>  It would be helpful to ASTT neophytes if the error message specified the 
> method call(s) suitable for this operation.



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

Reply via email to