Skip to content

Instantly share code, notes, and snippets.

@kimukou
Created March 30, 2011 09:48
Show Gist options
  • Save kimukou/894144 to your computer and use it in GitHub Desktop.
Save kimukou/894144 to your computer and use it in GitHub Desktop.
DefaultImportClassLoader.groovy
// http://groovy.codehaus.org/api/groovy/lang/GroovyClassLoader.html
// http://groovy.codehaus.org/api/org/codehaus/groovy/ast/ModuleNode.html
// http://svn.codehaus.org/groovy/branches/GROOVY_1_7_X/src/examples/groovyShell/
import java.security.CodeSource
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.ast.expr.*
import org.codehaus.groovy.ast.stmt.*
import static org.codehaus.groovy.syntax.Types.*
import org.codehaus.groovy.classgen.*
import org.codehaus.groovy.control.*
import org.codehaus.groovy.control.CompilationUnit.PrimaryClassNodeOperation
import org.codehaus.groovy.control.messages.ExceptionMessage
import org.codehaus.groovy.control.CompilationUnit.SourceUnitOperation
class DefaultImportSourceUnitOperation extends SourceUnitOperation {
public void call(SourceUnit source) {
println "==StaticImportOperation::call=="
ModuleNode ast = source.getAST()
// add a static import for java.lang.Math
//ast.addStaticStarImport('java.lang.Math', ClassHelper.make(java.lang.Math))
//ast.addStaticStarImport('groovy.swing.SwingBuilder', ClassHelper.make(groovy.swing.SwingBuilder))
//ast.addStaticStarImport('groovy.beans.Bindable', ClassHelper.make(groovy.beans.Bindable))
//println ast.getStaticStarImports()
ast.addImport('groovy.swing.SwingBuilder',ClassHelper.make(groovy.swing.SwingBuilder))
ast.addImport('groovy.beans.Bindable',ClassHelper.make(groovy.beans.Bindable))
println ast.getImports()
//ast.addImportPackage("groovy.swing.SwingBuilder")
//ast.addImportPackage("groovy.beans.Bindable")
//println ast.getImportPackages()
}
}
class DefaultImportClassLoader extends GroovyClassLoader {
public CompilationUnit createCompilationUnit(CompilerConfiguration config, CodeSource codeSource) {
println "== DefaultImportClassLoader::createCompilationUnit=="
CompilationUnit cu = super.createCompilationUnit(config, codeSource)
cu.addPhaseOperation(new DefaultImportSourceUnitOperation(), Phases.CONVERSION)
return cu
}
}
text='''
//import groovy.swing.SwingBuilder
//import groovy.beans.Bindable
class MyModel {
@Bindable int count = 0
}
def model = new MyModel()
new SwingBuilder().edt {
frame(title: "Java Frame", size: [100, 100], locationRelativeTo: null, show: true) {
gridLayout(cols: 1, rows: 2)
label(text: bind(source: model, sourceProperty: "count", converter: { v -> v? "Clicked $v times": ''}))
button("Click me!", actionPerformed: { model.count++ })
}
}
'''
DefaultImportClassLoader loader = new DefaultImportClassLoader()
Class clazz = loader.parseClass(text)
Script script = (Script)clazz.newInstance()
Object result = script.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment