summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala20
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala23
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala2
-rw-r--r--src/library/scala/Predef.scala2
5 files changed, 31 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
index 18fd09e0ba..d60dbf2f4c 100644
--- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
@@ -44,6 +44,7 @@ trait Definitions {
var NullClass: Symbol = _
var NothingClass: Symbol = _
var SingletonClass: Symbol = _
+ lazy val StableClass = getClass("scala.$Stable$") // todo internalize, need a new starr first
lazy val ClassClass: Symbol = getClass(sn.Class)
lazy val StringClass: Symbol = getClass(sn.String)
@@ -652,9 +653,9 @@ trait Definitions {
RootClass.info.decls.enter(RootPackage)
AnyClass = newClass(ScalaPackageClass, nme.Any, List()).setFlag(ABSTRACT)
- val anyparam = List(AnyClass.typeConstructor)
+ val any = List(AnyClass.typeConstructor)
- AnyValClass = newClass(ScalaPackageClass, nme.AnyVal, anyparam)
+ AnyValClass = newClass(ScalaPackageClass, nme.AnyVal, any)
.setFlag(FINAL | SEALED)
AnyRefClass =
newAlias(ScalaPackageClass, nme.AnyRef, ObjectClass.typeConstructor)
@@ -662,12 +663,15 @@ trait Definitions {
NullClass = newClass(ScalaPackageClass, nme.Null, anyrefparam)
.setFlag(ABSTRACT | TRAIT | FINAL)
- NothingClass = newClass(ScalaPackageClass, nme.Nothing, anyparam)
+ NothingClass = newClass(ScalaPackageClass, nme.Nothing, any)
.setFlag(ABSTRACT | TRAIT | FINAL)
- SingletonClass = newClass(ScalaPackageClass, nme.Singleton, anyparam)
+ SingletonClass = newClass(ScalaPackageClass, nme.Singleton, any)
.setFlag(ABSTRACT | TRAIT | FINAL)
+// StableClass = newClass(ScalaPackageClass, nme._Stable_, any)
+// .setFlag(ABSTRACT | TRAIT | FINAL)
+
UnitClass =
newClass(ScalaPackageClass, nme.Unit, List(AnyValClass.typeConstructor))
.setFlag(ABSTRACT | FINAL)
@@ -718,9 +722,9 @@ trait Definitions {
val booltype = BooleanClass.typeConstructor
// members of class scala.Any
- Any_== = newMethod(AnyClass, nme.EQ, anyparam, booltype) setFlag FINAL
- Any_!= = newMethod(AnyClass, nme.NE, anyparam, booltype) setFlag FINAL
- Any_equals = newMethod(AnyClass, nme.equals_, anyparam, booltype)
+ Any_== = newMethod(AnyClass, nme.EQ, any, booltype) setFlag FINAL
+ Any_!= = newMethod(AnyClass, nme.NE, any, booltype) setFlag FINAL
+ Any_equals = newMethod(AnyClass, nme.equals_, any, booltype)
Any_hashCode = newMethod(
AnyClass, nme.hashCode_, List(), IntClass.typeConstructor)
Any_toString = newMethod(
@@ -751,7 +755,7 @@ trait Definitions {
ObjectClass, "$asInstanceOf",
tparam => MethodType(List(), tparam.typeConstructor)) setFlag FINAL
String_+ = newMethod(
- StringClass, "+", anyparam, StringClass.typeConstructor) setFlag FINAL
+ StringClass, "+", any, StringClass.typeConstructor) setFlag FINAL
PatternWildcard = NoSymbol.newValue(NoPosition, "_").setInfo(NothingClass.typeConstructor)
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index c230cb5ab0..c8168ed52a 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -256,6 +256,7 @@ trait StdNames {
val Seq = newTermName("Seq")
val Short = newTermName("Short")
val Singleton = newTermName("Singleton")
+ val _Stable_ = newTermName("$Stable$")
val Some = newTermName("Some")
val SourceFile = newTermName("SourceFile")
val String = newTermName("String")
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 4da4b5f09b..76120f084e 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -1180,16 +1180,21 @@ trait Types {
def contributesAbstractMembers(p: Type) =
p.deferredMembers exists isVisible
- parents dropWhile (! _.typeSymbol.isAbstractType) match {
+ ((parents exists (_.isVolatile)) ||
+ (parents dropWhile (! _.typeSymbol.isAbstractType) match {
case ps @ (_ :: ps1) =>
(ps ne parents) ||
(ps1 exists contributesAbstractMembers) ||
(decls.elements exists (m => m.isDeferred && isVisible(m)))
case _ =>
false
- }
+ })) &&
+ !(typeSymbol isNonBottomSubClass StableClass) // escape hatch!
}
+ override def isStable =
+ (parents exists (_.isStable)) && !isVolatile
+
override def kind = "RefinedType"
}
@@ -1376,13 +1381,15 @@ trait Types {
override def isStable: Boolean = {
sym == SingletonClass ||
- sym.isAbstractType && (sym.info.bounds.hi.typeSymbol isSubClass SingletonClass)
+ sym == StableClass ||
+ sym.isAliasType && normalize.isStable ||
+ sym.isAbstractType && bounds.hi.isStable
}
- override def isVolatile: Boolean = {
- sym.isAbstractType && transform(sym.info.bounds.hi).isVolatile ||
- sym.isAliasType && sym.info.normalize.isVolatile
- }
+ override def isVolatile: Boolean =
+ sym.isAliasType && normalize.isVolatile ||
+ sym.isAbstractType && bounds.hi.isVolatile
+
override val isTrivial: Boolean =
pre.isTrivial && !sym.isTypeParameter && args.forall(_.isTrivial)
@@ -1421,7 +1428,7 @@ A type's typeSymbol should never be inspected directly.
*/
override def bounds: TypeBounds =
- if (sym.isAbstractType) transform(thisInfo.bounds).asInstanceOf[TypeBounds]
+ if (sym.isAbstractType) transform(thisInfo.bounds).asInstanceOf[TypeBounds] // ??? seems to be doing asSeenFrom twice
else super.bounds
override def parents: List[Type] = {
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 23203bd848..f9876f45e2 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -81,7 +81,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
if (sym == ArrayClass)
if (isGeneric(tp)) erasedTypeRef(BoxedArrayClass)
else typeRef(apply(pre), sym, args map this)
- else if (sym == AnyClass || sym == AnyValClass || sym == SingletonClass) erasedTypeRef(ObjectClass)
+ else if (sym == AnyClass || sym == AnyValClass || sym == SingletonClass || sym == StableClass) erasedTypeRef(ObjectClass)
else if (sym == UnitClass) erasedTypeRef(BoxedUnitClass)
else if (sym.isClass)
typeRef(apply(if (sym.owner.isClass) sym.owner.tpe else pre), sym, List())
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index f1bff1f990..437be17a5d 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -114,6 +114,8 @@ object Predef {
// tupling ------------------------------------------------------------
+ def uncheckedStable[A](x: A): A with $Stable$ = x.asInstanceOf[A with $Stable$]
+
type Pair[+A, +B] = Tuple2[A, B]
object Pair {
def apply[A, B](x: A, y: B) = Tuple2(x, y)