aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/Erasure.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-10-07 09:07:14 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-10-12 10:49:35 +0200
commit5de255637589b800ffc99ddb3453ccd651bfafc9 (patch)
tree285d28125822132793223feb84a4530d9126abc4 /src/dotty/tools/dotc/transform/Erasure.scala
parent2ca36a96aee3f2e5cc9073b8970659180f839f95 (diff)
downloaddotty-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.scala8
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)
}