gradle - 全局转换中缺少AST类

标签 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
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/

相关文章:

java - 构建android项目时gradle构建错误

gradle - 无法解决最近创建的grails项目中的依赖关系

gradle - 常规构建脚本类可以直接访问Gradle项目吗?

java - GroovyTemplate作为SpringMVC的 View 技术,可以创建JSON吗?

android - 无法解析 com.android.tools.build :gradle:0. 5.+

groovy - Gradle zip 插件,如何在 zip 中创建空文件夹?

java - 如何更改 MapStruct 生成的 *.java 文件的位置?

android - Gradle同步在Android Studio 1.4.1中失败

grails - Grails 域中的枚举

gradle - Gradle/Spock 中是否有测试套件的概念?