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