diff options
author | Martin Odersky <odersky@gmail.com> | 2014-03-30 10:49:42 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-03-31 14:52:08 +0200 |
commit | 9bd1e6a99e1cb09a3527e548699d1561e72e36d3 (patch) | |
tree | e9f3899d05cf3cb2012e3f3032f1a3fc4da52415 /src/dotty/tools/dotc/core/transform/Erasure.scala | |
parent | fc4648d33a051ff5d220c2fea097fc99b5883ecc (diff) | |
download | dotty-9bd1e6a99e1cb09a3527e548699d1561e72e36d3.tar.gz dotty-9bd1e6a99e1cb09a3527e548699d1561e72e36d3.tar.bz2 dotty-9bd1e6a99e1cb09a3527e548699d1561e72e36d3.zip |
More fixes and tests for easure.
1. Object_isInstanceOf/asInstanceOf are no longer parameterized methods (seems there's
no point in writing x.$asInstanceOf[T]() instead of the shorter x.$asInstanceOf[T]).
2. Array constructor's type is unchanged (the previous rules erased it to
def <init>(len: Int)Object
which is clearly wrong).
3. indexing needs to be disabled.
4. typedTypeApply needs to keep type applications that apply to type tests and type casts as well as
array ops.
5. References to self-ids are typed ThisType(cls) before erasure; are replaced by This(cls) references
during erasure.
Diffstat (limited to 'src/dotty/tools/dotc/core/transform/Erasure.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/transform/Erasure.scala | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/src/dotty/tools/dotc/core/transform/Erasure.scala b/src/dotty/tools/dotc/core/transform/Erasure.scala index d59bdf1a9..842e2f81f 100644 --- a/src/dotty/tools/dotc/core/transform/Erasure.scala +++ b/src/dotty/tools/dotc/core/transform/Erasure.scala @@ -61,16 +61,11 @@ object Erasure { */ def transformInfo(sym: Symbol, tp: Type)(implicit ctx: Context): Type = { val erase = erasureFn(sym is JavaDefined, isSemi = true, sym.isConstructor, wildcardOK = false) - if ((sym eq defn.Object_asInstanceOf) || sym.isType && (sym.owner eq defn.ArrayClass)) - sym.info - else if ((sym eq defn.Object_isInstanceOf) || (sym eq defn.ArrayClass.primaryConstructor)) { - val tp @ PolyType(pnames) = sym.info - tp.derivedPolyType(pnames, TypeBounds.empty :: Nil, erase(tp.resultType)) - } - else if (sym.isAbstractType) - TypeAlias(WildcardType) - else - erase(tp) + if ((sym eq defn.Object_asInstanceOf) || + (sym eq defn.Object_isInstanceOf) || + (sym.owner eq defn.ArrayClass) && (sym.isType || sym.isConstructor)) sym.info + else if (sym.isAbstractType) TypeAlias(WildcardType) + else erase(tp) } def isUnboundedGeneric(tp: Type)(implicit ctx: Context) = !( @@ -120,7 +115,7 @@ class Erasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wildcard case tp: TypeRef => val sym = tp.symbol if (!sym.isClass) - if (sym.owner eq defn.ArrayClass) tp else this(tp.info) + if (sym.exists && (sym.owner eq defn.ArrayClass)) tp else this(tp.info) //!!!! else if (sym.isDerivedValueClass) eraseDerivedValueClassRef(tp) else eraseNormalClassRef(tp) case tp: RefinedType => |