Anton Pryamostanov created GROOVY-8880:
------------------------------------------

             Summary: Traits - static/instance init blocks
                 Key: GROOVY-8880
                 URL: https://issues.apache.org/jira/browse/GROOVY-8880
             Project: Groovy
          Issue Type: Improvement
          Components: Compiler, groovy-runtime
    Affects Versions: 2.5.2
            Reporter: Anton Pryamostanov


Let's consider the below examples of Traits with Init blocks:
 *Instance init block:*
{code}
trait InstanceTrait {

    {
        System.out.println("Instance init")
    }

}

class InstanceTraitClass implements InstanceTrait {
}

new InstanceTraitClass()
{code}
This gives the below compilation exception:
{code:java}
General error during class generation: NPE while processing 
script1542098577743.groovy

groovy.lang.GroovyRuntimeException: NPE while processing 
script1542098577743.groovy
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:2
    at 
org.codehaus.groovy.control.CompilationUnit$17.call(CompilationUnit.java:8
    at 
org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:10
    at 
org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:6
    at 
org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:5
    at 
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:5
    at org.codehaus.groovy.control.CompilationUnit$compile$1.call(Unknown Sour
    at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:
    at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:1
    at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:1
    at 
groovy.inspect.swingui.AstNodeToScriptAdapter.compileToScript(AstNodeToScriptAdapter.groovy:
    at 
groovy.inspect.swingui.AstNodeToScriptAdapter$compileToScript.call(Unknown Sour
    at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:
    at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:1
    at 
groovy.inspect.swingui.AstBrowser$_decompile_closure6.doCall(AstBrowser.groovy:3
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Meth
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
    at java.lang.reflect.Method.invoke(Method.java:4
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:3
    at 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:2
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:10
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:10
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:10
    at groovy.lang.Closure.call(Closure.java:4
    at groovy.lang.Closure.call(Closure.java:4
    at groovy.lang.Closure.run(Closure.java:4
    at java.lang.Thread.run(Thread.java:7
Caused by: java.lang.NullPointerException
    at 
org.codehaus.groovy.classgen.asm.CallSiteWriter.prepareCallSite(CallSiteWriter.java:2
    at 
org.codehaus.groovy.classgen.asm.CallSiteWriter.prepareSiteAndReceiver(CallSiteWriter.java:2
    at 
org.codehaus.groovy.classgen.asm.CallSiteWriter.prepareSiteAndReceiver(CallSiteWriter.java:2
    at 
org.codehaus.groovy.classgen.asm.CallSiteWriter.makeCallSite(CallSiteWriter.java:2
    at 
org.codehaus.groovy.classgen.asm.InvocationWriter.makeCachedCall(InvocationWriter.java:3
    at 
org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:3
    at 
org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:1
    at 
org.codehaus.groovy.classgen.asm.InvocationWriter.makeInvokeMethodCall(InvocationWriter.java:
    at 
org.codehaus.groovy.classgen.asm.InvocationWriter.writeInvokeMethod(InvocationWriter.java:4
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:7
    at 
org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:
    at 
org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:6
    at 
org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeExpressionStatement(OptimizingStatementWriter.java:3
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:6
    at 
org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:
    at 
org.ehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:85)
    at 
org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:1
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:5
    at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:
    at 
org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:
    at 
org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:1
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:5
    at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:
    at 
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitObjectInitializerStatements(ClassCodeVisitorSupport.java:
    at 
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:
    at 
org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:2
    ... 28 m
{code}
*Static init block:*
{code}
trait StaticTrait {

    static {
        System.out.println("Static init")
    }

}

class StaticTraitClass implements StaticTrait {
}

new StaticTraitClass()
{code}
This compiles but gives below runtime exception:
{code:java}
java.lang.ExceptionInInitializerError

        at ConsoleScript278.run(ConsoleScript278:12)

Caused by: groovy.lang.MissingMethodException: No signature of method: static 
StaticTrait.<clinit>() is applicable for argument types: (java.lang.Class) 
values: [class StaticTraitClass]

        at StaticTrait$Trait$Helper.$static_methodMissing(ConsoleScript278)

        at StaticTraitClass.<clinit>(ConsoleScript278)

        ... 1 more
{code}

*Expected enhancement*:
- If it is easy to implement - please add support for above init blocks into 
traits.
Use case: adding initialization traits to classes.
- If it is difficult to implement - please add user-friendly error message for 
both cases and take decision not to support init blocks in Groovy traits.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to