diff options
author | Martin Odersky <odersky@gmail.com> | 2014-10-07 09:07:14 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-10-12 10:49:35 +0200 |
commit | 5de255637589b800ffc99ddb3453ccd651bfafc9 (patch) | |
tree | 285d28125822132793223feb84a4530d9126abc4 /src/dotty/tools/dotc/transform/Erasure.scala | |
parent | 2ca36a96aee3f2e5cc9073b8970659180f839f95 (diff) | |
download | dotty-5de255637589b800ffc99ddb3453ccd651bfafc9.tar.gz dotty-5de255637589b800ffc99ddb3453ccd651bfafc9.tar.bz2 dotty-5de255637589b800ffc99ddb3453ccd651bfafc9.zip |
Fixes to TermRefs and others in TypeErasure.
1) TermRefs are now erased to their widened underlying type. The only exception
are top-level term refs (e.g. the types of Ident or Select nodes), which are
treated as before. Those top-level refs are treated by erasedRef instead of erasure.
2) We make sure that erasure methods are not run after phase erasure. Reason: After
erasure underlying types change, which affects itself the result of erasure.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Erasure.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/Erasure.scala | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala index 379a59c0b..0e1b389ff 100644 --- a/src/dotty/tools/dotc/transform/Erasure.scala +++ b/src/dotty/tools/dotc/transform/Erasure.scala @@ -234,7 +234,10 @@ object Erasure extends TypeTestsCasts{ class Typer extends typer.ReTyper with NoChecking { import Boxing._ - def erasedType(tree: untpd.Tree)(implicit ctx: Context): Type = erasure(tree.typeOpt) + def erasedType(tree: untpd.Tree)(implicit ctx: Context): Type = tree.typeOpt match { + case tp: TermRef if tree.isTerm => erasedRef(tp) + case tp => erasure(tp) + } override def promote(tree: untpd.Tree)(implicit ctx: Context): tree.ThisTree[Type] = { assert(tree.hasType) @@ -366,8 +369,7 @@ object Erasure extends TypeTestsCasts{ tparams = Nil, vparamss = ddef.vparamss.flatten :: Nil, tpt = // keep UnitTypes intact in result position - if (ddef.tpt.typeOpt isRef defn.UnitClass) untpd.TypeTree(defn.UnitType) withPos ddef.tpt.pos - else ddef.tpt) + untpd.TypedSplice(TypeTree(eraseResult(ddef.tpt.typeOpt)).withPos(ddef.tpt.pos))) super.typedDefDef(ddef1, sym) } |