Created
March 30, 2011 09:48
-
-
Save kimukou/894144 to your computer and use it in GitHub Desktop.
DefaultImportClassLoader.groovy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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