Skip to content

Commit 7ad5beb

Browse files
committed
Handle existing <clinit> in template
1 parent 04d0dc9 commit 7ad5beb

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)