From e9a70f564a29ec0e2262cc9e6608c990b6b05274 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 31 Jan 2012 12:33:47 +0100 Subject: First steps towards erasure of inline classes. --- src/compiler/scala/reflect/internal/Types.scala | 12 ++++++++++++ src/compiler/scala/reflect/internal/transform/Erasure.scala | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala index bf0017d989..0d25ccf86d 100644 --- a/src/compiler/scala/reflect/internal/Types.scala +++ b/src/compiler/scala/reflect/internal/Types.scala @@ -65,6 +65,8 @@ import util.Statistics._ // inst is the instantiation and constr is a list of bounds. case DeBruijnIndex(level, index) // for dependent method types: a type referring to a method parameter. + case ErasedInlineType(tp) + // only used during erasure of inline classes. */ trait Types extends api.Types { self: SymbolTable => @@ -3067,6 +3069,15 @@ trait Types extends api.Types { self: SymbolTable => "De Bruijn "+kind+"("+(pnames mkString ",")+";"+(ptypes mkString ",")+";"+restpe+")" } } + + abstract case class ErasedInlineType(sym: Symbol) extends Type + + final class UniqueErasedInlineType(sym: Symbol) extends ErasedInlineType(sym) with UniqueType + + object ErasedInlineType { + def apply(sym: Symbol): Type = + unique(new UniqueErasedInlineType(sym)) + } /** A class representing an as-yet unevaluated type. */ @@ -3732,6 +3743,7 @@ trait Types extends api.Types { self: SymbolTable => case WildcardType => tp case NoType => tp case NoPrefix => tp + case ErasedSingleType(sym) => tp */ case _ => tp diff --git a/src/compiler/scala/reflect/internal/transform/Erasure.scala b/src/compiler/scala/reflect/internal/transform/Erasure.scala index 9faa399cad..38a60587a4 100644 --- a/src/compiler/scala/reflect/internal/transform/Erasure.scala +++ b/src/compiler/scala/reflect/internal/transform/Erasure.scala @@ -62,6 +62,13 @@ trait Erasure { protected def rebindInnerClass(pre: Type, cls: Symbol): Type = { if (cls.owner.isClass) cls.owner.tpe else pre // why not cls.isNestedClass? } + + protected def unboxInlineType(clazz: Symbol): Type = + clazz.primaryConstructor.info.params.head.tpe + + protected def eraseInlineClassRef(clazz: Symbol): Type = { + scalaErasure(unboxInlineType(clazz)) + } abstract class ErasureMap extends TypeMap { def mergeParents(parents: List[Type]): Type @@ -80,6 +87,7 @@ trait Erasure { else if (sym == AnyClass || sym == AnyValClass || sym == SingletonClass || sym == NotNullClass) erasedTypeRef(ObjectClass) else if (sym == UnitClass) erasedTypeRef(BoxedUnitClass) else if (sym.isRefinementClass) apply(mergeParents(tp.parents)) + else if (sym.isInlineClass) eraseInlineClassRef(sym) else if (sym.isClass) typeRef(apply(rebindInnerClass(pre, sym)), sym, List()) // #2585 else apply(sym.info) // alias type or abstract type case PolyType(tparams, restpe) => -- cgit v1.2.3