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 >