Piotr Boryczko created GROOVY-12415:
---------------------------------------

             Summary: Groovy 5 decompiler crashes on TYPE_USE annotation on 
primitive Java record component
                 Key: GROOVY-12415
                 URL: https://issues.apache.org/jira/browse/GROOVY-12415
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 5.1.2, 5.0.8
            Reporter: Piotr Boryczko
         Attachments: groovy-record-primitive-type-annotation.zip

Groovy 5 throws `GroovyBugError` while lazily configuring a decompiled,
precompiled Java record when a primitive record component carries a
`TYPE_USE` annotation:

 
{code:java}
Caught: BUG! Adding type annotation @TypeAnnotation to non-redirect node: int
{code}

The failure is in *ClassSignatureParser.configureClass*. It unconditionally
passes the primitive component's *ClassNode* to
*Annotations.addTypeAnnotations*, which eventually calls
*ClassNode.addTypeAnnotation*. Shared primitive nodes are not redirect nodes,
so that method aborts.

This occurs in ordinary applications through frameworks that inspect or infer
types from records. Jakarta Validation makes it particularly easy to encounter:
constraints such as *@Min*, and *@Max* include *TYPE_USE* in their
targets.

The attached reproducer does not use Spock, Jakarta Validation, Gradle, or any
third-party dependency other than Groovy itself.


h5. Groovy 5 source location

*org.codehaus.groovy.ast.decompiled.ClassSignatureParser.configureClass*:

{code:java}
RecordComponentNode recordComponent =
        new RecordComponentNode(classNode, rc.name, type[0]);
Annotations.addAnnotations(rc, recordComponent, resolver);
Annotations.addTypeAnnotations(rc, type[0], resolver);
{code}

Possible narrow fix for Groovy 5

Guard primitive component types before calling *addTypeAnnotations*:

{code:java}
if (!ClassHelper.isPrimitiveType(type[0])) {
    Annotations.addTypeAnnotations(rc, type[0], resolver);
}
{code}


This guard was tested locally against Groovy 5.0.8: the reproducer fails with
the original class and succeeds when the patched *ClassSignatureParser* is
placed first on the compiler classpath.



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

Reply via email to