Scott Murphy Heiberg created GROOVY-12575:
---------------------------------------------
Summary: A trait's instance initializer blocks run twice under
joint compilation
Key: GROOVY-12575
URL: https://issues.apache.org/jira/browse/GROOVY-12575
Project: Groovy
Issue Type: Bug
Components: Compiler, Stub generator / Joint compiler
Affects Versions: 5.0.8, 4.0.33, 6.0.0
Reporter: Scott Murphy Heiberg
When Groovy and Java sources are compiled together, each instance initializer
block of a trait runs twice per instance:
{code:groovy}
trait T { List<String> log = []; { log << 'block' } }
class C implements T {}
{code}
{code:java}
public class J { public static void main(String[] a) { System.out.println(new
C().getLog()); } }
{code}
{{groovyc -j T.groovy J.java}}, then {{java J}}, prints {{[block, block]}};
compiled without {{-j}}, {{new C().log}} is {{[block]}}. Dynamic and
{{@CompileStatic}} implementing classes behave alike.
The stub generator runs a {{Verifier}} over each class. {{Verifier.visitClass}}
clears the object initializer statements of a class after copying them into its
constructors, so {{JavaStubGenerator}} saves them first and adds them back
afterwards. For an interface or a trait, {{visitClass}} returns before that
point and keeps them, so adding them back doubles them, and the trait
transformation copies every block into the helper's {{$init$}} twice. Field
initializers and static initializer blocks of traits are not affected.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)