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:
-Keegandoesn't work?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=[])
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