diff options
author | Martin Odersky <odersky@gmail.com> | 2014-03-26 19:15:40 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-03-29 09:29:05 +0100 |
commit | 37cf9efe509b0bac4fb6bda01b7126e7511e43f0 (patch) | |
tree | ee5fa94171acf87de4e5da5bf7ee704a18596163 /src/dotty/tools/dotc/core/transform/Erasure.scala | |
parent | 0a1e969cb09e953d6b3f3b64b63a050588aa3360 (diff) | |
download | dotty-37cf9efe509b0bac4fb6bda01b7126e7511e43f0.tar.gz dotty-37cf9efe509b0bac4fb6bda01b7126e7511e43f0.tar.bz2 dotty-37cf9efe509b0bac4fb6bda01b7126e7511e43f0.zip |
Erasure phase PoC
Still missing: bridge method generation, signatures.
Other changes
- Turned around Checking and NoChecking. Checking is the default, NoChecking
disables it.
- Refactored Typer#typed to expose typedNamed, so that it can be overridden in
erasure.
- Made logging more forgiving wrt off-buy-one phase errors.
Conflicts:
src/dotty/tools/dotc/typer/Typer.scala
Diffstat (limited to 'src/dotty/tools/dotc/core/transform/Erasure.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/transform/Erasure.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/core/transform/Erasure.scala b/src/dotty/tools/dotc/core/transform/Erasure.scala index 89a504ac6..353911444 100644 --- a/src/dotty/tools/dotc/core/transform/Erasure.scala +++ b/src/dotty/tools/dotc/core/transform/Erasure.scala @@ -7,6 +7,10 @@ import util.DotClass object Erasure { + case class ErasedValueType(cls: ClassSymbol, underlying: Type) extends CachedGroundType { + override def computeHash = doHash(cls, underlying) + } + private def erasureIdx(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wildcardOK: Boolean) = (if (isJava) 1 else 0) + (if (isSemi) 2 else 0) + @@ -123,10 +127,14 @@ class Erasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wildcard val parent = tp.parent if (parent isRef defn.ArrayClass) eraseArray(tp) else this(parent) - case tp: ConstantType => + case tp: TermRef => + val sym = tp.symbol + if (sym.owner is Package) sym.termRef + else tp.derivedSelect(this(tp.prefix)) + case _: ThisType | _: ConstantType => tp case tp: TypeProxy => - this(tp.underlying) + this(tp.underlying) case AndType(tp1, tp2) => mergeAnd(this(tp1), this(tp2)) case OrType(tp1, tp2) => @@ -138,7 +146,7 @@ class Erasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wildcard case tp: PolyType => this(tp.resultType) case tp @ ClassInfo(pre, cls, classParents, decls, _) => - def eraseTypeRef = this.asInstanceOf[TypeRef => TypeRef] + def eraseTypeRef(p: TypeRef) = this(p).asInstanceOf[TypeRef] val parents: List[TypeRef] = if ((cls eq defn.ObjectClass) || cls.isPrimitiveValueClass) Nil else if (cls eq defn.ArrayClass) defn.ObjectClass.typeRef :: Nil |