Details
-
Type:
Bug
-
Status:
In Progress
-
Priority:
Major
-
Resolution: Unresolved
-
Affects Version/s: 1.7-rc-2
-
Fix Version/s: None
-
Component/s: ast builder
-
Labels:None
-
Environment:Groovy 1.7-RC-2 on jre1.6.0_04 on Windows Vista SP2
-
Number of attachments :
Description
The following code produces class MyClass OK, but running the class produces error:
Exception in thread "main" java.lang.NoSuchMethodError: main
Here's the ASTBuilder code I used:
import static org.objectweb.asm.Opcodes.ACC_PUBLIC
import static org.objectweb.asm.Opcodes.ACC_STATIC
import org.codehaus.groovy.ast.builder.AstBuilder
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.CompilationUnit
def classes= new AstBuilder().buildFromSpec{
classNode 'MyClass', ACC_PUBLIC, {
classNode Object //superclass
interfaces{
classNode GroovyObject
}
mixins{}
genericsTypes{}
method('main', ACC_PUBLIC & ACC_STATIC, Void.class) {
parameters{
parameter 'args': String[].class
}
exceptions{}
block{
methodCall {
variable "this"
constant "println"
argumentList {
constant "Hello, world!"
}
}
}
}
}
}
def gcl= new GroovyClassLoader()
def sec= null
def ccfg= CompilerConfiguration.DEFAULT
def cu= new CompilationUnit(ccfg, sec, gcl)
cu.addClassNode(classes[0])
cu.compile()
Also tried this but same result:
import static org.objectweb.asm.Opcodes.ACC_PUBLIC
import static org.objectweb.asm.Opcodes.ACC_STATIC
import org.codehaus.groovy.ast.*
import java.security.CodeSource
import org.codehaus.groovy.ast.builder.AstBuilder
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.CompilationUnit
import org.codehaus.groovy.control.CompilePhase
def classes= new AstBuilder().buildFromString(CompilePhase.CONVERSION, """\
public class MyClass{
public static void main(String[] args){
println "Hello, world!"
}
}
""")
def gcl= new GroovyClassLoader()
def sec= null //new CodeSource()
def ccfg= CompilerConfiguration.DEFAULT
def cu= new CompilationUnit(ccfg, sec, gcl)
cu.addClassNode(classes[1])
cu.compile()
javap output of class:
public class MyClass extends java.lang.Object implements groovy.lang.GroovyObject{ public static java.lang.Long __timeStamp; public static java.lang.Long __timeStamp__239_neverHappen1262576568013; public MyClass(); public java.lang.Object this$dist$invoke$2(java.lang.String, java.lang.Object); public void this$dist$set$2(java.lang.String, java.lang.Object); public java.lang.Object this$dist$get$2(java.lang.String); protected groovy.lang.MetaClass $getStaticMetaClass(); public groovy.lang.MetaClass getMetaClass(); public void setMetaClass(groovy.lang.MetaClass); public java.lang.Object invokeMethod(java.lang.String, java.lang.Object); public java.lang.Object getProperty(java.lang.String); public void setProperty(java.lang.String, java.lang.Object); static {}; public void super$1$wait(); public java.lang.String super$1$toString(); public void super$1$wait(long); public void super$1$wait(long, int); public void super$1$notify(); public void super$1$notifyAll(); public java.lang.Class super$1$getClass(); public boolean super$1$equals(java.lang.Object); public java.lang.Object super$1$clone(); public int super$1$hashCode(); public void super$1$finalize(); static java.lang.Class class$(java.lang.String); }