@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")
}
参考资料:
- Gradle GroovyCompileOptions 文档
- Groovy 文档:Compilation customizers
我注意到 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")
}
参考资料:
- Gradle GroovyCompileOptions 文档
- Groovy 文档:Compilation customizers