将AST节点字符串转换为groovy代码

vlju58qv  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(194)

我想使用AstBuilder创建groovy代码,但之后,我想看看实际的groovy代码是什么样子的。是否可以将AST节点的输出转换为如下所示的字符串:

org.codehaus.groovy.ast.stmt.BlockStatement@5b7a5baa[
org.codehaus.groovy.ast.stmt.ExpressionStatement@776aec5c[
expression:org.codehaus.groovy.ast.expr.DeclarationExpression@1d296da[
org.codehaus.groovy.ast.expr.VariableExpression@7c7a06ec[
variable: cl]("=" at 2:17:  "=" )org.codehaus.groovy.ast.expr.ClosureExpression@13c9d689[
]{ org.codehaus.groovy.ast.stmt.BlockStatement@75d4a5c2[
] }]]]

回到常规代码中?

jgwigjjp

jgwigjjp1#

您可以使用我最喜欢的代码片段,我在处理AST转换时会用到它:

java.io.StringWriter writer = new java.io.StringWriter();
groovy.inspect.swingui.AstNodeToScriptVisitor visitor = new groovy.inspect.swingui.AstNodeToScriptVisitor(writer);
visitor.visitClass(node); // replace with proper visit****
System.out.println(writer.toString());

它将提供几乎正确的Groovy代码。它仍然不是100%正确的(我的意思是,如果你将它编译回来,那么它可能不会编译),但足够调试了。
MacroGroovy中的示例:
https://github.com/bsideup/MacroGroovy/blob/950193cb2d12443bf0c7b7af9635f24712d3bad0/src/main/groovy/ru/trylogic/groovy/macro/MacroTransformation.java#L58

gtlvzcf8

gtlvzcf82#

AstNodeToScriptVisitor现在是groovy子项目groovy-console包的一部分,在这里您可以找到从AST节点生成代码的类。

def writer = new StringWriter()
def visitor = new groovy.console.ui.AstNodeToScriptVisitor(writer)
visitor.visitClass(demoClass)
println writer

在您的项目中,您可以导入此包,例如通过Gradle。

implementation group: 'org.codehaus.groovy', name: 'groovy-console', version: '3.0.11'

相关问题