groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ed Clark <eacl...@ameritech.net>
Subject Re: help with an AST
Date Mon, 20 Feb 2017 17:06:50 GMT
Ok, poking around the source for VariableScopeVisitor didn't provide me
with any insights.  It did lead me to try
     VariableScopeVisitor scopeVisitor = new VariableScopeVisitor( source, true)
but I still get the error:
     BUG! exception in phase 'class generation' in source unit 'CtxTest2.groovy' Operation:

(<assignment operator>:  "=" ) not supported

One possible twist that I noticed, is if I run my test script under groovyConsole
I get one error message.  But, if I run the equivalent code (with a 'main') as a
standalone groovy file, the error message is printed twice.  Not sure what that
indicates.

But, it is tied to my inserted statements.  If I comment out the statement
insertions, the compiler is happy.  So I'm guessing I'm building bad
statements.

What is the proper way to build a statement that set a property that is
defined in a base class (i.e., extended by a class that gets instantiated)?

I'm currently doing:

     VariableExpression cV = newVariableExpression( '__currentContext')
//    PropertyExpression cP = newPropertyExpression( cnStack[ -1], '__currentContext')
     ExpressionStatement currStmt = newExpressionStatement(
         new BinaryExpression(
                 cV,                           // also tried assigning to cP instead of cV
                 new Token(Types.ASSIGNMENT_OPERATOR, "=", -1, -1),
                 cnStack[ -1]
//                 new MethodCallExpression( VariableExpression.THIS_EXPRESSION,
//                                                             new ConstantExpression( 'getDelegate'),
//                                                             new ArgumentListExpress())
     )
     )
     blockStatement.statements.add( 0, currStmt)

(I've tried with and without the VariableScopeVisitor call, and with and without
a call to "blockStatement.variableScope.putReferencedClassVariable( cv)".)

So, does this look like the correct way to set the value of a property that is
inherited from a base class?

(The somewhat frustrating thing is the resultant AST with the inserted statements
looks correct after the transform (up through the Instruction Selection phase).
In fact, if I type that code into a separate groovyConsole, it runs.)


Thanks for your time,

Ed



On 02/16/2017 04:41 PM, Paul King wrote:
> Do you have something like:
>
> VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(source)
> scopeVisitor.visitClass(cNode)
>
> for each of your closure(s)? Where cNode is a closure's classNode?
>
> Cheers, Paul.
>

Mime
View raw message