Skip to content

Instantly share code, notes, and snippets.

@melix
Created March 1, 2012 16:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save melix/1951215 to your computer and use it in GitHub Desktop.
Save melix/1951215 to your computer and use it in GitHub Desktop.
Add local AST transformation to a method
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.CompilationCustomizer
import org.codehaus.groovy.control.CompilePhase
import groovy.transform.CompileStatic
import org.codehaus.groovy.ast.AnnotationNode
import org.codehaus.groovy.ast.ClassHelper
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.transform.sc.StaticCompileTransformation
def config = new CompilerConfiguration()
config.addCompilationCustomizers(new ASTTransformationInjector())
def shell = new GroovyShell(config)
shell.evaluate '''
void foo() { 1 + new Object()}
'''
class ASTTransformationInjector extends CompilationCustomizer {
private static final ClassNode COMPILESTATIC_CLASSNODE = ClassHelper.make(CompileStatic)
ASTTransformationInjector() {
super(CompilePhase.CANONICALIZATION)
}
@Override
void call(final org.codehaus.groovy.control.SourceUnit source, final org.codehaus.groovy.classgen.GeneratorContext context, final org.codehaus.groovy.ast.ClassNode classNode) {
classNode.getMethods('foo').each { mn ->
AnnotationNode an = new AnnotationNode(COMPILESTATIC_CLASSNODE)
mn.addAnnotation(an)
classNode.addTransform(StaticCompileTransformation, an)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment