Groovy 以编程方式创建GStringExpression
我想创建表示此文本行的Groovy 以编程方式创建GStringExpression,groovy,Groovy,我想创建表示此文本行的GStringExpression "Exception: $all" 其构造函数可以具有逐字文本或逐字文本、字符串[]、值[] 如何为GStringExpression表示我的文本 例如,此代码 new GStringExpression("Exception:", [], [ new ConstantExpression("all") ]) 结果出现异常:。 当我尝试在逐字文本中使用$all时,由于缺少all 它似乎在使用逐字,因为生成的代码如下所示 而我的ca
GStringExpression
"Exception: $all"
其构造函数可以具有逐字文本
或逐字文本、字符串[]、值[]
如何为GStringExpression
表示我的文本
例如,此代码
new GStringExpression("Exception:", [], [ new ConstantExpression("all") ])
结果出现异常:。
当我尝试在逐字文本中使用$all
时,由于缺少all
它似乎在使用逐字,因为生成的代码如下所示
而我的catchStatement
实现如下所示
Parameter parameter =
new Parameter(ClassHelper.make(Exception.class), "all")
ExpressionStatement returnStatement = new ExpressionStatement (
new MethodCallExpression(
new VariableExpression("this"),
new ConstantExpression("println"),
new ArgumentListExpression([
new GStringExpression(null,
[
new ConstantExpression("Exception:")
],
[ new VariableExpression("all") ]
)
])
)
)
new CatchStatement(parameter, returnStatement)
从GStringExpression
生成的代码中不使用verbatimText
。它只是在这里有错误消息,或“相当转储”AST
参数字符串
和值
与GStringImpl
构造函数的参数完全相同。生成的代码只将这些属性推入堆栈,并调用构造函数
您无法轻松地将GString转换为GStringExpression。在Groovy中,这种解析是在脚本(而不仅仅是GString)上下文中使用antlr解析器完成的。没有使用获取GString并创建GroovyExpression
的方法
在您的情况下,如果要创建的GString是“hello${name}”,则必须将值为“hello”的ConstantPression
数组作为字符串参数传递,将值为“hello”的VariableExpression
或FieldExpression
数组作为值参数传递
如果您只想解析GString(而不是创建AST转换),那么您可能应该使用TemplateEngine
我确实在尝试创建转换(我确实创建了转换,但唯一缺少的是GString
中的正确消息),verbatim
仅用于转储AST,而不是在groovy生成字节码时使用。请参阅此方法:在我的示例中(如示例所示),它将按我前面所述的那样逐字显示的内容。为什么要这样做-我不知道。你怎么看生成的代码?使用java反编译器或groovy控制台?我使用groovyconsole。虽然有些事情我也使用反编译器。但在这种情况下-groovyconsole