Skip to content

Commit 5e8f992

Browse files
committed
Handle existing <clinit> in template
1 parent d740f4a commit 5e8f992

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

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

+12-6
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)