Последнее время часто приходится работать с такой мощной возможностью Groovy как Compile-time AST Transformations.
Так как я не люблю излишнюю динамику, то бОльшая часть проверок DSL на валидность у нас происходит на этапе компиляции, а так же мы используем очень много генерации кода. Поэтому каждый день приходится сталкиваться с составлением ASTNode-ов вручную.
def someVariable = new ConstantExpression("someValue");
def returnStatement = new ReturnStatement(
new ConstructorCallExpression(
ClassHelper.make(SomeCoolClass),
new ArgumentListExpression(someVariable)
)
);
До боли знакомые конструкции, не правда ли? Хотите, чтобы было вот так?
def someVariable = macro { "someValue" }
def returnStatement = macro { return new SomeCoolClass($v{ someVariable }) }
Или даже так?
def constructorCall = macro { new SomeCoolClass($v{ macro { "someValue" } }) }
В данной статье речь пойдёт о моём решении этой проблемы, максимально близком к родному решению Groovy — github.com/bsideup/MacroGroovy