我正在编写一个转换,以将一些额外的注释添加到已经具有特定注释的字段中。
我具有以下提供给编译器的配置
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.ast.AnnotationNode
import org.codehaus.groovy.ast.ClassHelper
import org.codehaus.groovy.ast.FieldNode
import org.codehaus.groovy.control.CompilePhase
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.transform.AbstractASTTransformation
import org.codehaus.groovy.transform.GroovyASTTransformation
@CompileStatic
@GroovyASTTransformation(phase = CompilePhase.CONVERSION)
class InjectorTransform extends AbstractASTTransformation {
@Override void visit(ASTNode[] nodes, SourceUnit source) {
source.AST.classes*.fields.flatten().each {
def field = it as FieldNode
def found = field.annotations.find { it.classNode.name == 'javax.inject.Inject' }
if (found) {
field.addAnnotation(new AnnotationNode(ClassHelper.make(PackageScope)))
}
}
}
}
withConfig(configuration) {
ast(CompileStatic)
ast(new InjectorTransform())
}
我使用
groovyOptions.configurationScript
将其提供给gradle转换按预期运行,但是
source.AST.classes
仅返回单个类。此类始终是所有正在编译的类中的第一个字母顺序类。例如,如果我有Bar和Foo类,它将返回Bar。如果我创建另一个名为Alpha的类,则将返回Alpha。我的问题是什么可能导致转换无法获取所有类?以这种方式添加全局转换是否存在问题,或者是否有可能阻止其余类的可见?
最佳答案
我通过使用inline
方法解决了这个问题,而不是在配置脚本中创建一个类。我不确定为什么原来的方法不起作用,也许是个错误,但是这里有解决方案。
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.codehaus.groovy.ast.AnnotationNode
import org.codehaus.groovy.ast.ClassHelper
import org.codehaus.groovy.ast.FieldNode
import static org.codehaus.groovy.control.CompilePhase.CONVERSION
withConfig(configuration) {
ast(CompileStatic)
inline(phase: CONVERSION) { source, context, classNode ->
source.AST.classes*.fields.flatten().each {
def field = it as FieldNode
def found = field.annotations.find { it.classNode.name == 'Inject' }
if (found) {
field.addAnnotation(new AnnotationNode(ClassHelper.make(PackageScope)))
}
}
}
}
关于gradle - 全局转换中缺少AST类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834750/