@CompileStatic 整个包?

@CompileStatic an entire package?

我注意到 Groovy 的 @CompileStatic 注释允许注释整个包。

所以我在 com.somepackage 包中创建了一个 package-info.groovy 文件,其中包含:

package com.somepackage

到目前为止一切顺利。现在我添加注释:

@CompileStatic
package com.somepackage

import groovy.transform.CompileStatic

然后 Eclipse 突然将第 2 行标记为错误:"Groovy:[Static type checking] - Unimplemented node type @ line 2, column 9"

这是什么意思?我可以通过这种方式将静态编译应用于整个包,还是我必须继续将包中的每个个体 class 注释为 @CompileStatic?

Groovy的CompileStatic不支持包级别的操作。请参阅 this discussion. I have opened GROOVY-7453 更正此问题。

您可以使用 config script with Maven or Gradle,但这会将 CompileStatic 应用于整个项目,而不仅仅是单个包。不幸的是,我认为没有办法处理整个包,除非在包中注释所有 类 :(

使用 Groovy 编译器配置脚本,您可以将 CompileStatic AST 转换添加到包及其子包的每个 类。

首先创建配置脚本并将其命名为groovycConfig.groovy :

import org.codehaus.groovy.ast.ClassNode
import static org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder.withConfig

withConfig(configuration) {

    source(classValidator: { ClassNode cn -> cn.packageName.startsWith("com.myapp.mypackage") }) {
        ast(groovy.transform.CompileStatic)
    }

}

然后在编译时告诉gradle使用它groovy

compileGroovy {
    groovyOptions.configurationScript = file("groovycConfig.groovy")
}

参考资料: