Skip to content

Commit d388e94

Browse files
committed
Fix Object's scope after ersure
After erasure, former Any members become Object members. Also, fixed some typos and added some TODOs on addBridges.
1 parent f606a47 commit d388e94

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,22 @@ class Erasure extends Phase with DenotTransformer {
3535
def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation = ref match {
3636
case ref: SymDenotation =>
3737
assert(ctx.phase == this, s"transforming $ref at ${ctx.phase}")
38-
val owner = ref.owner
39-
ref.copySymDenotation(
40-
owner = if (owner eq defn.AnyClass) defn.ObjectClass else owner,
41-
info = transformInfo(ref.symbol, ref.info))
38+
if (ref.symbol eq defn.ObjectClass) {
39+
// Aftre erasure, all former Any members are now Object members
40+
val ClassInfo(pre, _, ps, decls, selfInfo) = ref.info
41+
val extendedScope = decls.cloneScope
42+
defn.AnyClass.classInfo.decls.foreach(extendedScope.enter)
43+
ref.copySymDenotation(
44+
info = transformInfo(ref.symbol,
45+
ClassInfo(pre, defn.ObjectClass, ps, extendedScope, selfInfo))
46+
)
47+
}
48+
else {
49+
val owner = ref.owner
50+
ref.copySymDenotation(
51+
owner = if (owner eq defn.AnyClass) defn.ObjectClass else owner,
52+
info = transformInfo(ref.symbol, ref.info))
53+
}
4254
case ref =>
4355
ref.derivedSingleDenotation(ref.symbol, erasure(ref.info))
4456
}
@@ -296,9 +308,9 @@ object Erasure {
296308
val newSymbol = member.symbol(ctx)
297309
assert(oldSymbol.name(beforeCtx) == newSymbol.name,
298310
s"${oldSymbol.name(beforeCtx)} bridging with ${newSymbol.name}")
299-
val newOverriden = oldSymbol.denot.allOverriddenSymbols.toSet
300-
val oldOverriden = newSymbol.allOverriddenSymbols(beforeCtx).toSet
301-
val neededBridges = oldOverriden -- newOverriden
311+
val newOverridden = oldSymbol.denot.allOverriddenSymbols.toSet // TODO: clarify new <-> old in a comment; symbols are swapped here
312+
val oldOverridden = newSymbol.allOverriddenSymbols(beforeCtx).toSet // TODO: can we find a more efficient impl? newOverridden does not have to be a set!
313+
val neededBridges = oldOverridden -- newOverridden
302314

303315
var minimalSet = Set[Symbol]()
304316
// compute minimal set of bridges that are needed:
@@ -316,9 +328,9 @@ object Erasure {
316328
)
317329
clash match {
318330
case Some(cl) =>
319-
ctx.error(s"bridge for method ${newSymbol.show(beforeCtx)}\n" +
320-
s"clashes with ${cl.symbol.show(beforeCtx)}\n" +
321-
s"both have same type after erasure: ${bridge.symbol.info.show}")
331+
ctx.error(i"bridge for method ${newSymbol.showLocated(beforeCtx)} of type ${newSymbol.info(beforeCtx)}\n" +
332+
i"clashes with ${cl.symbol.showLocated(beforeCtx)} of type ${cl.symbol.info(beforeCtx)}\n" +
333+
i"both have same type after erasure: ${bridge.symbol.info}")
322334
case None => minimalSet += bridge
323335
}
324336
}

0 commit comments

Comments
 (0)