groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paolo Di Tommaso <paolo.ditomm...@gmail.com>
Subject Re: Clousure expression transformation
Date Tue, 25 Sep 2018 06:35:38 GMT
Replying to myself, for some reason the closure expression needs to be
explicitly visited. The following transformer do the trick:

       new ClassCodeExpressionTransformer() {

            protected SourceUnit getSourceUnit() { unit }

            Expression transform(Expression expr) {
                if( expr.class == BinaryExpression ) {
                    return .. // my replacement where
                }
                else if( expr instanceof ClosureExpression) {
                    // explicitly visit the closure
                    visitClosureExpression(expr)
                }
                super.transform(expr)
            }
        }



p

On Mon, Sep 24, 2018 at 7:34 PM Paolo Di Tommaso <paolo.ditommaso@gmail.com>
wrote:

> Dear all,
>
>
> I'm trying to write a global transformation for my DSL to apply a custom
> logic on binary expression. For example:
>
> @GroovyASTTransformation(phase = CompilePhase.CONVERSION)
> class FooXformImpl implements ASTTransformation {
>
>     SourceUnit unit
>
>     @Override
>     void visit(ASTNode[] nodes, SourceUnit source) {
>         this.unit = unit
>         createVisitor().visitClass((ClassNode)nodes[1])
>     }
>
>     protected ClassCodeExpressionTransformer createVisitor() {
>
>         new ClassCodeExpressionTransformer() {
>
>             protected SourceUnit getSourceUnit() { unit }
>
>             Expression transform(Expression expr) {
>                 if( expr.class == BinaryExpression ) {
>                     return .. // my replacement where
>                 }
>                 super.transform(expr)
>             }
>         }
>     }
> }
>
>
> The transformation is correctly applied, however it turns out the
> expressions nested in a closure definition are *not* visited. Therefore the
> above transformation is not applied to binary expressions inside a closure.
>
> Is that expected? How to manage this use case ?
>
>
> Cheers,
> Paolo
>
>

Mime
View raw message