Skip to content

Commit 6922288

Browse files
committed
Simplify logic in erasure.
There's one behavioral change: on typedSelectFromTypeTree, we use erasedType as for a notmal ref. Before semiEraseVCs was always set to false here. I don't see how the treatment should be different. E.g. it should not matter if we see a x.y or T#y
1 parent cc04f68 commit 6922288

File tree

1 file changed

+10
-17
lines changed

1 file changed

+10
-17
lines changed

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

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -268,36 +268,29 @@ object Erasure extends TypeTestsCasts{
268268
class Typer extends typer.ReTyper with NoChecking {
269269
import Boxing._
270270

271-
def erasedType(tree: untpd.Tree, semiEraseVCs: Boolean)(implicit ctx: Context): Type =
272-
tree.typeOpt match {
273-
case tp: TermRef if tree.isTerm => erasedRef(tp)
274-
case tp: ThisType => tp
275-
case tp => erasure(tp, semiEraseVCs)
276-
}
271+
def erasedType(tree: untpd.Tree)(implicit ctx: Context): Type = {
272+
val tp = tree.typeOpt
273+
if (tree.isTerm) erasedRef(tp) else erasure(tp, semiEraseVCs = true)
274+
}
277275

278-
def promote(tree: untpd.Tree, semiEraseVCs: Boolean)(implicit ctx: Context): tree.ThisTree[Type] = {
276+
override def promote(tree: untpd.Tree)(implicit ctx: Context): tree.ThisTree[Type] = {
279277
assert(tree.hasType)
280-
val erased = erasedType(tree, semiEraseVCs)
278+
val erased = erasedType(tree)
281279
ctx.log(s"promoting ${tree.show}: ${erased.showWithUnderlying()}")
282280
tree.withType(erased)
283281
}
284282

285-
override def promote(tree: untpd.Tree)(implicit ctx: Context): tree.ThisTree[Type] = {
286-
promote(tree, true)
287-
}
288-
289283
/** When erasing most TypeTrees we should not semi-erase value types.
290284
* This is not the case for [[DefDef#tpt]], [[ValDef#tpt]] and [[Typed#tpt]], they
291285
* are handled separately by [[typedDefDef]], [[typedValDef]] and [[typedTyped]].
292286
*/
293-
override def typedTypeTree(tree: untpd.TypeTree, pt: Type)(implicit ctx: Context): TypeTree = {
294-
promote(tree, semiEraseVCs = false)
295-
}
287+
override def typedTypeTree(tree: untpd.TypeTree, pt: Type)(implicit ctx: Context): TypeTree =
288+
tree.withType(erasure(tree.tpe, semiEraseVCs = false))
296289

297290
/** This override is only needed to semi-erase type ascriptions */
298291
override def typedTyped(tree: untpd.Typed, pt: Type)(implicit ctx: Context): Tree = {
299292
val Typed(expr, tpt) = tree
300-
val tpt1 = promote(tpt, semiEraseVCs = true)
293+
val tpt1 = promote(tpt)
301294
val expr1 = typed(expr, tpt1.tpe)
302295
assignType(untpd.cpy.Typed(tree)(expr1, tpt1), tpt1)
303296
}
@@ -385,7 +378,7 @@ object Erasure extends TypeTestsCasts{
385378
}
386379

387380
override def typedSelectFromTypeTree(tree: untpd.SelectFromTypeTree, pt: Type)(implicit ctx: Context) =
388-
untpd.Ident(tree.name).withPos(tree.pos).withType(erasedType(tree, semiEraseVCs = false))
381+
untpd.Ident(tree.name).withPos(tree.pos).withType(erasedType(tree))
389382

390383
override def typedThis(tree: untpd.This)(implicit ctx: Context): Tree =
391384
if (tree.symbol == ctx.owner.enclosingClass || tree.symbol.isStaticOwner) promote(tree)

0 commit comments

Comments
 (0)