Looks promising. Thank you for the heads up
>-------- Оригинално писмо --------
>От: Keegan Witt keeganwitt@gmail.com
>Относно: Re: Always add no-args constructor at compile time
>До: users@groovy.incubator.apache.org
>Изпратено на: 24.07.2015 02:29
FYI: I opened
GROOVY-7522
and
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
|