groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mario Garcia <mario.g...@gmail.com>
Subject Re: Adding a Trait to a ClassNode during semantic analysis
Date Tue, 26 Apr 2016 06:24:28 GMT
Ok thanks!
Mario

2016-04-25 19:23 GMT+02:00 John Smiljanic <john.smiljanic@gmail.com>:

> 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.ggar@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.smiljanic@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.smiljanic@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
>>>
>>
>>
>

Mime
View raw message