summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-01-31 12:33:47 +0100
committerMartin Odersky <odersky@gmail.com>2012-01-31 12:33:47 +0100
commite9a70f564a29ec0e2262cc9e6608c990b6b05274 (patch)
treeb64e854a7c4f8e30322d9c08c9b73c54aea43e4f
parent5cb688172c86d3f34a4149e8280694f64bbf1422 (diff)
downloadscala-e9a70f564a29ec0e2262cc9e6608c990b6b05274.tar.gz
scala-e9a70f564a29ec0e2262cc9e6608c990b6b05274.tar.bz2
scala-e9a70f564a29ec0e2262cc9e6608c990b6b05274.zip
First steps towards erasure of inline classes.
-rw-r--r--src/compiler/scala/reflect/internal/Types.scala12
-rw-r--r--src/compiler/scala/reflect/internal/transform/Erasure.scala8
2 files changed, 20 insertions, 0 deletions
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) =>