@@ -35,10 +35,22 @@ class Erasure extends Phase with DenotTransformer {
35
35
def transform (ref : SingleDenotation )(implicit ctx : Context ): SingleDenotation = ref match {
36
36
case ref : SymDenotation =>
37
37
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
+ }
42
54
case ref =>
43
55
ref.derivedSingleDenotation(ref.symbol, erasure(ref.info))
44
56
}
@@ -296,9 +308,9 @@ object Erasure {
296
308
val newSymbol = member.symbol(ctx)
297
309
assert(oldSymbol.name(beforeCtx) == newSymbol.name,
298
310
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
302
314
303
315
var minimalSet = Set [Symbol ]()
304
316
// compute minimal set of bridges that are needed:
@@ -316,9 +328,9 @@ object Erasure {
316
328
)
317
329
clash match {
318
330
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}" )
322
334
case None => minimalSet += bridge
323
335
}
324
336
}
0 commit comments