@@ -121,8 +121,12 @@ trait BCodeSkelBuilder extends BCodeHelpers {
121121 for (f <- claszSymbol.info.decls.filter(_.isField))
122122 f.setFlag(JavaStatic )
123123
124+ val (clinits, body) = impl.body.partition(stat => stat.isInstanceOf [DefDef ] && stat.symbol.isStaticConstructor)
125+
124126 val (uptoSuperStats, remainingConstrStats) = splitAtSuper(impl.constr.rhs.asInstanceOf [Block ].stats)
125- val clInitSymbol = ctx.newSymbol(
127+ val clInitSymbol : TermSymbol =
128+ if (clinits.nonEmpty) clinits.head.symbol.asTerm
129+ else ctx.newSymbol(
126130 claszSymbol,
127131 nme.STATIC_CONSTRUCTOR ,
128132 JavaStatic | Method ,
@@ -156,17 +160,19 @@ trait BCodeSkelBuilder extends BCodeHelpers {
156160 val callConstructor = New (claszSymbol.typeRef).select(claszSymbol.primaryConstructor).appliedToArgs(Nil )
157161 val assignModuleField = Assign (ref(moduleField), callConstructor)
158162 val remainingConstrStatsSubst = remainingConstrStats.map(rewire)
159- val clinit = DefDef (
160- clInitSymbol,
161- Block (assignModuleField :: remainingConstrStatsSubst, unitLiteral)
162- )
163+ val clinit = clinits match {
164+ case (ddef : DefDef ) :: _ =>
165+ cpy.DefDef (ddef)(rhs = Block (ddef.rhs :: assignModuleField :: remainingConstrStatsSubst, unitLiteral))
166+ case _ =>
167+ DefDef (clInitSymbol, Block (assignModuleField :: remainingConstrStatsSubst, unitLiteral))
168+ }
163169
164170 val constr2 = {
165171 val rhs = Block (uptoSuperStats, impl.constr.rhs.asInstanceOf [Block ].expr)
166172 cpy.DefDef (impl.constr)(rhs = rhs)
167173 }
168174
169- val impl2 = cpy.Template (impl)(constr = constr2, body = clinit :: impl. body)
175+ val impl2 = cpy.Template (impl)(constr = constr2, body = clinit :: body)
170176 cpy.TypeDef (cd0)(rhs = impl2)
171177 } else cd0
172178
0 commit comments