Two separate compilations.  One for the traits and transforms (framework code). 
 The second for the user scripts that are transformed to dynamically
implement the trait.

> On Apr 22, 2016, at 01:33, Mario Garcia <mario.g...@gmail.com> wrote:
> 
> Nice :)
> 
> Just to get this straight, you compiled the traits first and then you 
> compiled the local transformation and the user-developer code altogether. 
> It's that correct ?
> 
> 
> 
> 2016-04-21 23:16 GMT+02:00 John Smiljanic <john.smilja...@gmail.com>:
>> After some digging I found org.codehaus.groovy.transform.trait.TraitComposer 
>> and from there I was able to backtrack to how groovy transforms statically 
>> defined traits.  This is performed in canonalization, so it appears that a 
>> trait that is added to a class during semantic analysis may still have its 
>> fields/behavior applied to that class.  So, I was able to get this to work 
>> as follows:
>> 
>> 1.  Compile the trait.
>> 
>> I was having some problems jointly compiling the trait while compiling the 
>> class that implements the trait when using the embedded compiler.  If I 
>> recall correctly the base issue was that if I declared the trait as follows:
>> 
>> 
>>             classNode.addInterface(new ClassNode(
>>                <trait name>
>>                , Opcodes.ACC_INTERFACE
>>                , ClassHelper.make(Object.class)));
>> 
>> the TraitComposer did not recognize the interface ClassNode as a Trait (no 
>> @Trait annotation).  I suppose that the ClassNode constructor above does not 
>> trigger a proper compilation/load of my trait's groovy file (?), but I 
>> frankly didn't dig much deeper.
>> 
>> This is fine for my purposes.  In my case, the Trait developer (framework 
>> developer)  is different than the class developer (citizen developer).
>> 
>> 2.  Declare the trait during semantic analysis of the Class.
>> 
>> classNode.addInterface(new ClassNode(<trait javaclass from 1>);
>> 
>> 
>> 
>>> On Wed, Apr 20, 2016 at 3:08 PM, John Smiljanic <john.smilja...@gmail.com> 
>>> wrote:
>>> Hi All,
>>> 
>>> Groovy 2.3.7.
>>> 
>>> I've been experimenting with trying to add a Trait (or Mixin) to a 
>>> ClassNode during semantic analysis (compiler phase).  I've tried using 
>>> ClassNode::addInterface and ClassNode::addMixin passing the appropriate.  I 
>>> sort of expected ClassNode to have an addTrait or something like. 
>>> 
>>> Is setting a trait at this phase of compilation supported?
>>> 
>>> JR
> 

Reply via email to