You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (Jira)" <ji...@apache.org> on 2026/05/02 10:19:00 UTC

[jira] [Resolved] (GROOVY-11973) Allow ASTTransformationCustomizer to support annotations with multiple AST transforms (e.g. @Sealed, @RecordBase) and @AnnotationCollector aliases (e.g. @AutoExternalize) via a new forAnnotation factory method

     [ https://issues.apache.org/jira/browse/GROOVY-11973?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul King resolved GROOVY-11973.
--------------------------------
    Fix Version/s: 6.0.0-alpha-1
       Resolution: Fixed

> Allow ASTTransformationCustomizer to support annotations with multiple AST transforms (e.g. @Sealed, @RecordBase) and @AnnotationCollector aliases (e.g. @AutoExternalize) via a new forAnnotation factory method
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-11973
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11973
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 6.0.0-alpha-1
>
>
> ASTTransformationCustomizer currently throws "AST transformation customizer doesn't support AST transforms with multiple classes" when given an annotation whose @GroovyASTTransformationClass lists more than one transform (e.g. @Sealed, @RecordBase). It also rejects @AnnotationCollector aliases such as @AutoExternalize with "Provided class doesn't look like an AST @interface", since those annotations carry @AnnotationCollector rather than @GroovyASTTransformationClass.
> This enhancement adds a static factory method, ASTTransformationCustomizer.forAnnotation(...), that returns a list of customizer instances - one per resolved transform class - so each runs at its own declared compile phase. The factory also recognises @AnnotationCollector and recursively expands it to the underlying annotations, flattening nested collectors.
> Typical usage:
> {code:groovy}
> config.addCompilationCustomizers(*ASTTransformationCustomizer.forAnnotation(Sealed))
> config.addCompilationCustomizers(*ASTTransformationCustomizer.forAnnotation(AutoExternalize))
> {code}
> Overloads accept an optional annotation-parameters map and a custom ClassLoader, mirroring the existing constructors. The legacy single-class constructors are unchanged for backward compatibility; their error message now points users at forAnnotation.
> A small companion fix in SealedCompletionASTTransformation makes it usable from the customizer: it now uses the AnnotationNode passed in via nodes[0] rather than re-fetching it from the class node (which the customizer does not attach), and skips emitting an empty permittedSubclasses member when no subclasses are detected.



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