diff options
-rw-r--r-- | src/dotty/tools/dotc/core/TypeErasure.scala | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/src/dotty/tools/dotc/core/TypeErasure.scala b/src/dotty/tools/dotc/core/TypeErasure.scala index 616e222e0..dd6589a08 100644 --- a/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/src/dotty/tools/dotc/core/TypeErasure.scala @@ -401,10 +401,10 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean private def eraseDerivedValueClassRef(tref: TypeRef)(implicit ctx: Context): Type = { val cls = tref.symbol.asClass val underlying = underlyingOfValueClass(cls) - ErasedValueType(cls, valueErasure(underlying)) + if (underlying.exists) ErasedValueType(cls, valueErasure(underlying)) + else NoType } - private def eraseNormalClassRef(tref: TypeRef)(implicit ctx: Context): Type = { val cls = tref.symbol.asClass (if (cls.owner is Package) normalizeClass(cls) else cls).typeRef @@ -439,36 +439,46 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean /** The name of the type as it is used in `Signature`s. * Need to ensure correspondence with erasure! */ - private def sigName(tp: Type)(implicit ctx: Context): TypeName = tp match { - case ErasedValueType(_, underlying) => - sigName(underlying) - case tp: TypeRef => - if (!tp.denot.exists) throw new MissingType(tp.prefix, tp.name) - val sym = tp.symbol - if (!sym.isClass) { - val info = tp.info - if (!info.exists) assert(false, "undefined: $tp with symbol $sym") - sigName(info) - } - else if (isDerivedValueClass(sym)) sigName(eraseDerivedValueClassRef(tp)) - else normalizeClass(sym.asClass).fullName.asTypeName - case defn.ArrayType(elem) => - sigName(this(tp)) - case JavaArrayType(elem) => - sigName(elem) ++ "[]" - case tp: TermRef => - sigName(tp.widen) - case ExprType(rt) => - sigName(defn.FunctionType(Nil, rt)) - case tp: TypeProxy => - sigName(tp.underlying) - case ErrorType | WildcardType => - tpnme.WILDCARD - case tp: WildcardType => - sigName(tp.optBounds) - case _ => - val erased = this(tp) - assert(erased ne tp, tp) - sigName(erased) + private def sigName(tp: Type)(implicit ctx: Context): TypeName = try { + tp match { + case ErasedValueType(_, underlying) => + sigName(underlying) + case tp: TypeRef => + if (!tp.denot.exists) throw new MissingType(tp.prefix, tp.name) + val sym = tp.symbol + var edvc: Type = null + def dvcErasure: Type = { + if (edvc == null) edvc = eraseDerivedValueClassRef(tp) + edvc + } + if (!sym.isClass) { + val info = tp.info + if (!info.exists) assert(false, "undefined: $tp with symbol $sym") + sigName(info) + } else if (isDerivedValueClass(sym) && dvcErasure.exists) sigName(dvcErasure) + else normalizeClass(sym.asClass).fullName.asTypeName + case defn.ArrayType(elem) => + sigName(this(tp)) + case JavaArrayType(elem) => + sigName(elem) ++ "[]" + case tp: TermRef => + sigName(tp.widen) + case ExprType(rt) => + sigName(defn.FunctionType(Nil, rt)) + case tp: TypeProxy => + sigName(tp.underlying) + case ErrorType | WildcardType => + tpnme.WILDCARD + case tp: WildcardType => + sigName(tp.optBounds) + case _ => + val erased = this(tp) + assert(erased ne tp, tp) + sigName(erased) + } + } catch { + case ex: AssertionError => + println(s"no sig for $tp") + throw ex } } |