@@ -5,6 +5,7 @@ package core
5
5
import Symbols ._ , Types ._ , Contexts ._ , Flags ._ , Names ._ , StdNames ._ , Decorators ._ , Flags .JavaDefined
6
6
import Uniques .unique
7
7
import dotc .transform .ExplicitOuter ._
8
+ import dotc .transform .ValueClasses ._
8
9
import typer .Mode
9
10
import util .DotClass
10
11
@@ -32,6 +33,8 @@ object TypeErasure {
32
33
* isInstanceOf may have types that do not satisfy the predicate.
33
34
*/
34
35
def isErasedType (tp : Type )(implicit ctx : Context ): Boolean = tp match {
36
+ case _ : ErasedValueType =>
37
+ true
35
38
case tp : TypeRef =>
36
39
tp.symbol.isClass && tp.symbol != defn.AnyClass
37
40
case _ : TermRef =>
@@ -270,10 +273,12 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
270
273
* - For any other type, exception.
271
274
*/
272
275
private def apply (tp : Type )(implicit ctx : Context ): Type = tp match {
276
+ case _ : ErasedValueType =>
277
+ tp
273
278
case tp : TypeRef =>
274
279
val sym = tp.symbol
275
280
if (! sym.isClass) this (tp.info)
276
- else if (sym. isDerivedValueClass) eraseDerivedValueClassRef(tp)
281
+ else if (isSemi && isDerivedValueClass(sym) ) eraseDerivedValueClassRef(tp)
277
282
else eraseNormalClassRef(tp)
278
283
case tp : RefinedType =>
279
284
val parent = tp.parent
@@ -282,7 +287,8 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
282
287
case tp : TermRef =>
283
288
this (tp.widen)
284
289
case tp : ThisType =>
285
- this (tp.cls.typeRef)
290
+ val thisTypeErasure = erasureFn(isJava, isSemi = false , isConstructor, wildcardOK)(_)
291
+ thisTypeErasure(tp.cls.typeRef)
286
292
case SuperType (thistpe, supertpe) =>
287
293
SuperType (this (thistpe), this (supertpe))
288
294
case ExprType (rt) =>
@@ -332,9 +338,10 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
332
338
333
339
private def eraseArray (tp : RefinedType )(implicit ctx : Context ) = {
334
340
val defn .ArrayType (elemtp) = tp
341
+ val arrayErasure = erasureFn(isJava, isSemi = false , isConstructor, wildcardOK)(_)
335
342
if (elemtp derivesFrom defn.NullClass ) JavaArrayType (defn.ObjectType )
336
343
else if (isUnboundedGeneric(elemtp)) defn.ObjectType
337
- else JavaArrayType (this (elemtp))
344
+ else JavaArrayType (arrayErasure (elemtp))
338
345
}
339
346
340
347
/** The erasure of a symbol's info. This is different from `apply` in the way `ExprType`s are
@@ -352,8 +359,12 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
352
359
case tp => this (tp)
353
360
}
354
361
355
- private def eraseDerivedValueClassRef (tref : TypeRef )(implicit ctx : Context ): Type =
356
- unsupported(" eraseDerivedValueClass" )
362
+ private def eraseDerivedValueClassRef (tref : TypeRef )(implicit ctx : Context ): Type = {
363
+ val cls = tref.symbol.asClass
364
+ val underlying = underlyingOfValueClass(cls)
365
+ ErasedValueType (cls, erasure(underlying, isSemi = false ))
366
+ }
367
+
357
368
358
369
private def eraseNormalClassRef (tref : TypeRef )(implicit ctx : Context ): Type = {
359
370
val cls = tref.symbol.asClass
@@ -365,7 +376,7 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
365
376
case tp : TypeRef =>
366
377
val sym = tp.typeSymbol
367
378
if (sym eq defn.UnitClass ) sym.typeRef
368
- else if (sym. isDerivedValueClass) eraseNormalClassRef(tp)
379
+ else if (isConstructor && isDerivedValueClass(sym) ) eraseNormalClassRef(tp)
369
380
else this (tp)
370
381
case RefinedType (parent, _) if ! (parent isRef defn.ArrayClass ) =>
371
382
eraseResult(parent)
@@ -387,10 +398,12 @@ class TypeErasure(isJava: Boolean, isSemi: Boolean, isConstructor: Boolean, wild
387
398
* Need to ensure correspondence with erasure!
388
399
*/
389
400
private def sigName (tp : Type )(implicit ctx : Context ): TypeName = tp match {
401
+ case ErasedValueType (_, underlying) =>
402
+ sigName(underlying)
390
403
case tp : TypeRef =>
391
404
val sym = tp.symbol
392
405
if (! sym.isClass) sigName(tp.info)
393
- else if (sym. isDerivedValueClass) sigName(eraseDerivedValueClassRef(tp))
406
+ else if (isDerivedValueClass(sym) ) sigName(eraseDerivedValueClassRef(tp))
394
407
else normalizeClass(sym.asClass).fullName.asTypeName
395
408
case defn.ArrayType (elem) =>
396
409
sigName(this (tp))
0 commit comments