'How to apply `@POJO` to classes via config script?

I have a few classes which I'd like to keep as POJO. Manually annotating each of these would be troublesome, for both updating all current ones and adding future such classes.

I have a SourceAwareCustomizer able to identify all these classes. However I do not know how to apply the @POJO via the config script.

I tried ast(POJO), and I would get an error:

Provided class doesn't look like an AST @interface

I dug in the code a bit and found that @POJO is not an AST transformation (it's not annotated with @GroovyASTTransformationClass.

Is there a way to apply @POJO, or maybe a random annotation, to a class via the config script?



Solution 1:[1]

POJO is not an AST transformation.

Compare POJO source to ToString (for example). In POJO the GroovyASTTransformationClass annotation is missing..

I can't make @POJO working without @CompileStatic..

So, here is my try with groovy 4.0.1:

congig.groovy

import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.ast.AnnotationNode

import groovy.transform.stc.POJO
import groovy.transform.CompileStatic

withConfig(configuration) { 
   inline(phase:'SEMANTIC_ANALYSIS'){Object...args->
     if(args.size()>2){
       ClassNode cn = args[2]
       if( cn.getSuperClass().name=="java.lang.Object" ) {
         if( !cn.annotations.find{it.classNode.name==POJO.class.name} ) {
           cn.addAnnotation( new AnnotationNode(new ClassNode(POJO.class)) )
           //can't see how POJO could work without compile static in groovy 4.0.1
           if( !cn.annotations.find{it.classNode.name==CompileStatic.class.name} )
             cn.addAnnotation( new AnnotationNode(new ClassNode(CompileStatic.class)) )
         }
       }

       println "class       = $cn"
       println "annotations = ${cn.getAnnotations()}"
     }
   }
}

A.groovy

class A{
    String id
}

compile command line:

groovyc --configscript config.groovy A.groovy

generated class

public class A
{
    private String id;
    
    @Generated
    public A() {}
    
    @Generated
    public String getId() {
        return this.id;
    }
    
    @Generated
    public void setId(final String id) {
        this.id = id;
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 daggett