以编程方式创建GStringExpression

时间:2016-04-13 13:43:09

标签: groovy

我想创建代表此文字行的GStringExpression

"Exception: $all"

它的构造函数可以有verbatimTextverbatimText, strings[], values[]

GStringExpression

我的文字应如何代表GStringExpression

例如此代码

new GStringExpression("Exception:", [], [ new ConstantExpression("all") ])

结果为"Exception:"。 当我尝试在$all内使用verbatimText时,由于缺少all

,我无法编译它

似乎正在使用verbatim,因为生成的代码看起来像这样,

enter image description here

虽然我的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)

1 个答案:

答案 0 :(得分:1)

verbatimText生成的代码中未使用GStringExpression。它只是在这里有错误消息,或者#"漂亮转储"一个AST。

参数stringsvaluesGStringImpl构造函数的参数完全相同。生成的代码只将这些属性推送到堆栈中,并调用构造函数。

您无法轻松地将GString转换为GStringExpression。在Groovy中,这个解析是在脚本的上下文中使用antlr解析器完成的(而不仅仅是GString)。没有方法可以使用GString并创建GroovyExpression

在您的情况下,如果您要创建的GString是" hello $ {name}",那么您必须将带有ConstantExpression的数组作为字符串参数传递给值"你好",并且作为值参数,一个数组带有VariableExpressionFieldExpression

如果您要做的只是解析GString(并且您没有创建AST转换),那么您应该使用TemplateEngine