这是我的AST转换
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
public class ASTExampleTransformation implements ASTTransformation {
public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
astNodes.findAll {
node -> node instanceof ClassNode
}.each {
classNode ->
println("classNode")
def useMethodBody = new AstBuilder().buildFromCode {
println(">>useMethodBody")
}
def useMethod = new MethodNode (
'useMethod', ACC_PUBLIC, ClassHelper.VOID_TYPE, [] as Parameter[], [] as ClassNode[], useMethodBody[0]
)
classNode.addMethod(useMethod)
}
}
}
当我编译时,我收到此错误
[groovyc] General error during class generation: Cannot use return statement with an expression on a method that returns void
如何构建代码然后返回void?谢谢。
答案 0 :(得分:0)
我从未使用过AstBuilder
所以我无法帮助你。我猜想问题是AST构建器支持Groovy样式的隐式返回和默认返回Object,或类似的东西?
以下是直接使用AST构建器代码构建println方法调用语句的示例。老实说,我不确定这是否也最终会回报。但我假设使用低级AST语法构建的原始语句不会添加隐式返回。有一个单独的类来制作返回语句 - ReturnStatement
。所以试一试:)
Statement useMethodBody = new ExpressionStatement(
new MethodCallExpression(
new VariableExpression("this"),
new ConstantExpression("println"),
new ArgumentListExpression(
new ConstantExpression(">>useMethodBody")
)
)
)
然后将useMethodBody[0]
更改为useMethodBody
。希望它能够工作,但我实际上没有测试过,所以可能会有错误:)