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