Gradle 全局转换中缺少AST类

Gradle 全局转换中缺少AST类,gradle,groovy,Gradle,Groovy,我正在编写一个转换,向已经有特定注释的字段添加一些额外的注释 我向编译器提供了以下配置 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 imp

我正在编写一个转换,向已经有特定注释的字段添加一些额外的注释

我向编译器提供了以下配置

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

转换按预期运行,但
source.AST.classes
仅返回单个类。此类始终是所有正在编译的类中按字母顺序排列的第一个类。例如,如果我有Bar和Foo类,它将返回Bar。如果我创建另一个名为Alpha的类,Alpha将被返回


我的问题是,是什么导致转换无法获得所有类?以这种方式添加全局转换是否有问题,或者可能会阻止其他类可见?

我通过使用
内联
方法解决了这个问题,而不是在配置脚本中创建类。我不确定为什么原来的方法不起作用,可能是一个bug,但这里是解决方案

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)))
      }
    }
  }
}