Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
2.5.10
-
None
-
None
Description
playground.groovy
@groovy.transform.AutoImplement class C implements Runnable {} class Main { static void main(String[] args) { def c = new C() c.run() } }
I.java
public interface I { void foo(); }
$ groovyc I.java playground.groovy -j $ java -cp .:$GROOVY_HOME/lib/groovy-2.5.10.jar Main Exception in thread "main" java.lang.NullPointerException at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:37) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119) at Main.main(playground.groovy:9)
What happens:
1. org.codehaus.groovy.tools.javac.JavaStubGenerator#printClassContents applies its Verifier.
2. org.codehaus.groovy.classgen.Verifier#addGroovyObjectInterfaceAndMethods adds GroovyObject interface and GroovyObject's methods via org.codehaus.groovy.classgen.Verifier#addMethod.
3. Verifier#addMethod is overridden in #printClassContents' Verifier to skip adding methods to the class node.
4. at the moment when @AutoImplement kicks in there exists the GroovyObject interface and no methods in the class node, so the transformation adds default method implementations.