用Groovy AST添加字段不会生成getter和setter

时间:2018-12-04 13:55:53

标签: groovy field metaprogramming abstract-syntax-tree

所以我正在写一个AST转换,它将带有@Delegate批注的字段添加到类中

@SimpleAST
class PersonBuilder{
}

应该生产

class PersonBuilder{
        @Delegate
        Person target = new Person
    }

我的界面:

@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE])
@GroovyASTTransformationClass("poc.SimpleASTTransformation")
public @interface SimpleAST {

    /**
     * A class for which builder methods should be created. It will be an error to leave
     * this attribute with its default value for some strategies.
     */

    Class value()

}

我的转变:

@CompileStatic
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
class SimpleASTTransformation implements ASTTransformation {

    @Override
    void visit(ASTNode[] astNodes, SourceUnit source) {

        ClassNode classNode = (ClassNode) astNodes[1]

        if (!astNodes) return
        if (!astNodes[0]) return
        if (!astNodes[1]) return
        if (!(astNodes[0] instanceof AnnotationNode)) return
        if (!(astNodes[1] instanceof ClassNode)) return

        println "Running AST Transformation for ${classNode.getNameWithoutPackage()}..."

        AnnotationNode annotationNode = (AnnotationNode) astNodes[0]
        ClassExpression classExpression = (ClassExpression) annotationNode.getMember("value")
        String packageName = classNode.getPackageName()
        String builderClassNameWithoutPackage = classNode.getNameWithoutPackage()
        String originalClassNameWithPackage = classExpression.getText()
        originalClassNameWithPackage = Validate.checkOriginalClassName(originalClassNameWithPackage)
        Class<?> originalClass = Class.forName(originalClassNameWithPackage)
        ClassNode originalClassNode = new ClassNode(originalClass)
        String originalClassNameWithoutPackage = originalClassNode.getNameWithoutPackage()

        println "Generating methods for $originalClassNameWithoutPackage..."

        generateTargetField(classNode,originalClass)

        println "Transformation applied!"

    }

   static void generateTargetField(ClassNode classNode, Class originalClass){
        ClassNode originalClassNode = new ClassNode(originalClass)
        ConstructorCallExpression constructorCallExpression = new ConstructorCallExpression(originalClassNode,new ArgumentListExpression())
        FieldNode fieldNode = new FieldNode("target",
                2,
                originalClassNode,
                classNode,
                constructorCallExpression)

        ArrayList<AnnotationNode> annotationNodes = new ArrayList<>()
        annotationNodes.add(new AnnotationNode(new ClassNode(Delegate)))
        fieldNode.addAnnotations(annotationNodes)
        classNode.addField(fieldNode)
    }
}

当我检查字节码时,Class Person内部的字段没有getter / setter方法(我在目标字段上使用@Delegate)

但是,如果我只是手动添加字段并编译代码,我会在Person类中获取和获取设置器。

人员有2个字段:firstName,lastName和Strings。

0 个答案:

没有答案
相关问题