groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Keegan Witt <keeganw...@gmail.com>
Subject Re: Always add no-args constructor at compile time
Date Thu, 23 Jul 2015 23:29:29 GMT
FYI: I opened GROOVY-7522
<https://issues.apache.org/jira/browse/GROOVY-7522> and GROOVY-7523
<https://issues.apache.org/jira/browse/GROOVY-7523> which, if agreed to,
will make your config script a lot simpler.

-Keegan

On Fri, Jul 17, 2015 at 4:49 PM, Keegan Witt <keeganwitt@gmail.com> wrote:

> Awesome!  Glad I could help.
>
> On Fri, Jul 17, 2015 at 12:48 PM, Nikolay Totomanov <ntotomanov@abv.bg>
> wrote:
>
>> Thanks a lot, Keegan!
>> It works like a charm!
>>
>>
>>
>> >-------- Оригинално писмо --------
>> >От: Nikolay Totomanov ntotomanov@abv.bg
>> >Относно: Re: Always add no-args constructor at compile time
>> >До: users@groovy.incubator.apache.org
>> >Изпратено на: 15.07.2015 01:57
>>
>>  The code looks very clean to me!
>> Thanks a lot, Keegan!
>> I'll give it a try.
>>
>>
>>
>>
>> >-------- Оригинално писмо --------
>> >От: Keegan Witt keeganwitt@gmail.com
>> >Относно: Re: Always add no-args constructor at compile time
>> >До: users@groovy.incubator.apache.org
>> >Изпратено на: 14.07.2015 06:04
>>
>>  Oh, actually Opcodes is not needed, you can take that off so you don't
>> need a dependency on *org.ow2.asm:asm*.
>>
>>  On Mon, Jul 13, 2015 at 10:53 PM, Keegan Witt <keeganwitt@gmail.com>
>> wrote:
>>
>>  Here's what I'm thinking.  Use this as a configuration script.
>>
>> import java.lang.annotation.ElementType
>> import java.lang.annotation.Retention
>> import java.lang.annotation.RetentionPolicy
>> import java.lang.annotation.Target
>> import org.codehaus.groovy.ast.ASTNode
>> import org.codehaus.groovy.ast.AnnotatedNode
>> import org.codehaus.groovy.ast.ClassNode
>> import org.codehaus.groovy.ast.ConstructorNode
>> import org.codehaus.groovy.ast.Parameter
>> import org.codehaus.groovy.ast.stmt.BlockStatement
>> import org.codehaus.groovy.control.CompilePhase
>> import org.codehaus.groovy.control.SourceUnit
>> import org.codehaus.groovy.transform.AbstractASTTransformation
>> import org.codehaus.groovy.transform.GroovyASTTransformation
>> import org.codehaus.groovy.transform.GroovyASTTransformationClass
>> import org.objectweb.asm.Opcodes
>>
>> @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
>> public class DefaultConstructorASTTransformation extends AbstractASTTransformation
implements Opcodes {
>>     public void visit(ASTNode[] nodes, SourceUnit source) {
>>         init(nodes, source)
>>         AnnotatedNode parent = (AnnotatedNode) nodes[1]
>>
>>         if (parent instanceof ClassNode) {
>>             ClassNode cNode = (ClassNode) parent
>>             if (!cNode.getDeclaredConstructor(new Parameter[0])) {
>>                 final BlockStatement body = new BlockStatement()
>>                 cNode.addConstructor(new ConstructorNode(ACC_PUBLIC, new Parameter[0],
cNode.EMPTY_ARRAY, body))
>>             }
>>         }
>>     }
>> }
>> @Retention(RetentionPolicy.RUNTIME)
>> @Target(ElementType.TYPE)
>> @GroovyASTTransformationClass("DefaultConstructorASTTransformation")
>> public @interface DefaultConstructor {}
>>
>> withConfig(configuration) {
>>     ast(DefaultConstructor)
>> }
>>
>>
>>  Seemed to work in my tests, but everybody should feel free to point out
>> anything I goofed up.
>>
>> -Keegan
>>
>>  On Mon, Jul 13, 2015 at 6:24 PM, Keegan Witt <keeganwitt@gmail.com>
>> wrote:
>>
>>  Sorry, I should have given you the example in the configuration script
>> syntax
>>
>> withConfig(configuration) {
>>     ast(groovy.transform.TupleConstructor, includes:[''])
>> }
>>
>>
>>  But it doesn't matter, because the transformation removes existing
>> constructors from the class.  Sorry, I got ahead of myself.
>>
>> -Keegan
>>
>>  On Mon, Jul 13, 2015 at 5:45 PM, Keegan Witt <keeganwitt@gmail.com>
>> wrote:
>>
>>   One way that comes to mind offhand would be
>>     @groovy.transform.TupleConstructor(includeFields=false,
>> includeProperties=false, includeSuperFields=false,
>> includeSuperProperties=false)
>>
>>  or
>>     @groovy.transform.TupleConstructor(includes=[''])
>>
>> Anybody know why
>>     @groovy.transform.TupleConstructor(includes=[])
>> doesn't work?
>>
>>  -Keegan
>>
>>  On Mon, Jul 13, 2015 at 5:34 PM, Nikolay Totomanov <ntotomanov@abv.bg>
>> wrote:
>>
>>  Hello,
>>
>>  I need to always add the default constructor to my classes.
>>  Is it possible to achieve that using CompilerConfiguration
>>
>>  Regards,
>>  Nikki
>>
>>
>>
>>
>>
>>
>

Mime
View raw message