Skip to content

Commit 1a6eedd

Browse files
committed
Merge pull request #1199 from dotty-staging/fix-stale-sym
Make erased value type take a TypeRef instead of a ClassSymbol
2 parents 8dff0c6 + ba1027e commit 1a6eedd

File tree

5 files changed

+24
-24
lines changed

5 files changed

+24
-24
lines changed

src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
237237
case OrType(tp21, tp22) =>
238238
if (tp21.stripTypeVar eq tp22.stripTypeVar) isSubType(tp1, tp21)
239239
else secondTry(tp1, tp2)
240-
case TypeErasure.ErasedValueType(cls2, underlying2) =>
240+
case TypeErasure.ErasedValueType(tycon1, underlying2) =>
241241
def compareErasedValueType = tp1 match {
242-
case TypeErasure.ErasedValueType(cls1, underlying1) =>
243-
(cls1 eq cls2) && isSameType(underlying1, underlying2)
242+
case TypeErasure.ErasedValueType(tycon2, underlying1) =>
243+
(tycon1.symbol eq tycon2.symbol) && isSameType(underlying1, underlying2)
244244
case _ =>
245245
secondTry(tp1, tp2)
246246
}

src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,20 @@ object TypeErasure {
6666
* Nothing. This is because this type is only useful for type adaptation (see
6767
* [[Erasure.Boxing#adaptToType]]).
6868
*
69-
* @param cls The value class symbol
69+
* @param tycon A TypeRef referring to the value class symbol
7070
* @param erasedUnderlying The erased type of the single field of the value class
7171
*/
72-
abstract case class ErasedValueType(cls: ClassSymbol, erasedUnderlying: Type)
72+
abstract case class ErasedValueType(tycon: TypeRef, erasedUnderlying: Type)
7373
extends CachedGroundType with ValueType {
74-
override def computeHash = doHash(cls, erasedUnderlying)
74+
override def computeHash = doHash(tycon, erasedUnderlying)
7575
}
7676

77-
final class CachedErasedValueType(cls: ClassSymbol, erasedUnderlying: Type)
78-
extends ErasedValueType(cls, erasedUnderlying)
77+
final class CachedErasedValueType(tycon: TypeRef, erasedUnderlying: Type)
78+
extends ErasedValueType(tycon, erasedUnderlying)
7979

8080
object ErasedValueType {
81-
def apply(cls: ClassSymbol, erasedUnderlying: Type)(implicit ctx: Context) = {
82-
unique(new CachedErasedValueType(cls, erasedUnderlying))
81+
def apply(tycon: TypeRef, erasedUnderlying: Type)(implicit ctx: Context) = {
82+
unique(new CachedErasedValueType(tycon, erasedUnderlying))
8383
}
8484
}
8585

@@ -411,7 +411,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
411411
private def eraseDerivedValueClassRef(tref: TypeRef)(implicit ctx: Context): Type = {
412412
val cls = tref.symbol.asClass
413413
val underlying = underlyingOfValueClass(cls)
414-
if (underlying.exists) ErasedValueType(cls, valueErasure(underlying))
414+
if (underlying.exists) ErasedValueType(tref, valueErasure(underlying))
415415
else NoType
416416
}
417417

src/dotty/tools/dotc/printing/RefinedPrinter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
157157
return toText(tp.info)
158158
case ExprType(result) =>
159159
return "=> " ~ toText(result)
160-
case ErasedValueType(clazz, underlying) =>
161-
return "ErasedValueType(" ~ toText(clazz.typeRef) ~ ", " ~ toText(underlying) ~ ")"
160+
case ErasedValueType(tycon, underlying) =>
161+
return "ErasedValueType(" ~ toText(tycon) ~ ", " ~ toText(underlying) ~ ")"
162162
case tp: ClassInfo =>
163163
return toTextParents(tp.parentsWithArgs) ~ "{...}"
164164
case JavaArrayType(elemtp) =>

src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ object Erasure extends TypeTestsCasts{
153153

154154
final def box(tree: Tree, target: => String = "")(implicit ctx: Context): Tree = ctx.traceIndented(i"boxing ${tree.showSummary}: ${tree.tpe} into $target") {
155155
tree.tpe.widen match {
156-
case ErasedValueType(clazz, _) =>
157-
New(clazz.typeRef, cast(tree, underlyingOfValueClass(clazz)) :: Nil) // todo: use adaptToType?
156+
case ErasedValueType(tycon, _) =>
157+
New(tycon, cast(tree, underlyingOfValueClass(tycon.symbol.asClass)) :: Nil) // todo: use adaptToType?
158158
case tp =>
159159
val cls = tp.classSymbol
160160
if (cls eq defn.UnitClass) constant(tree, ref(defn.BoxedUnit_UNIT))
@@ -173,10 +173,10 @@ object Erasure extends TypeTestsCasts{
173173

174174
def unbox(tree: Tree, pt: Type)(implicit ctx: Context): Tree = ctx.traceIndented(i"unboxing ${tree.showSummary}: ${tree.tpe} as a $pt") {
175175
pt match {
176-
case ErasedValueType(clazz, underlying) =>
176+
case ErasedValueType(tycon, underlying) =>
177177
def unboxedTree(t: Tree) =
178-
adaptToType(t, clazz.typeRef)
179-
.select(valueClassUnbox(clazz))
178+
adaptToType(t, tycon)
179+
.select(valueClassUnbox(tycon.symbol.asClass))
180180
.appliedToNone
181181

182182
// Null unboxing needs to be treated separately since we cannot call a method on null.
@@ -185,7 +185,7 @@ object Erasure extends TypeTestsCasts{
185185
val tree1 =
186186
if (tree.tpe isRef defn.NullClass)
187187
adaptToType(tree, underlying)
188-
else if (!(tree.tpe <:< clazz.typeRef)) {
188+
else if (!(tree.tpe <:< tycon)) {
189189
assert(!(tree.tpe.typeSymbol.isPrimitiveValueClass))
190190
val nullTree = Literal(Constant(null))
191191
val unboxedNull = adaptToType(nullTree, underlying)
@@ -223,12 +223,12 @@ object Erasure extends TypeTestsCasts{
223223
if treeElem.widen.isPrimitiveValueType && !ptElem.isPrimitiveValueType =>
224224
// See SI-2386 for one example of when this might be necessary.
225225
cast(ref(defn.runtimeMethodRef(nme.toObjectArray)).appliedTo(tree), pt)
226-
case (_, ErasedValueType(cls, _)) =>
227-
ref(u2evt(cls)).appliedTo(tree)
226+
case (_, ErasedValueType(tycon, _)) =>
227+
ref(u2evt(tycon.symbol.asClass)).appliedTo(tree)
228228
case _ =>
229229
tree.tpe.widen match {
230-
case ErasedValueType(cls, _) =>
231-
ref(evt2u(cls)).appliedTo(tree)
230+
case ErasedValueType(tycon, _) =>
231+
ref(evt2u(tycon.symbol.asClass)).appliedTo(tree)
232232
case _ =>
233233
if (pt.isPrimitiveValueType)
234234
primitiveConversion(tree, pt.classSymbol)

src/dotty/tools/dotc/transform/ExtensionMethods.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful
7070
}
7171

7272
val underlying = valueErasure(underlyingOfValueClass(valueClass))
73-
val evt = ErasedValueType(valueClass, underlying)
73+
val evt = ErasedValueType(valueClass.typeRef, underlying)
7474
val u2evtSym = ctx.newSymbol(moduleSym, nme.U2EVT, Synthetic | Method,
7575
MethodType(List(nme.x_0), List(underlying), evt))
7676
val evt2uSym = ctx.newSymbol(moduleSym, nme.EVT2U, Synthetic | Method,

0 commit comments

Comments
 (0)