diff options
author | Martin Odersky <odersky@gmail.com> | 2008-09-06 11:41:37 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2008-09-06 11:41:37 +0000 |
commit | 7369338a6e9cbd43e547e4c4cb2123c34b60f6c6 (patch) | |
tree | 3be5e30fd360cc4844e20556863133637a6c60a5 /src | |
parent | 4334d8c9915c976ff083621e0df44bb7d2321064 (diff) | |
download | scala-7369338a6e9cbd43e547e4c4cb2123c34b60f6c6.tar.gz scala-7369338a6e9cbd43e547e4c4cb2123c34b60f6c6.tar.bz2 scala-7369338a6e9cbd43e547e4c4cb2123c34b60f6c6.zip |
One more attempt to be sound and at the same ti...
One more attempt to be sound and at the same time let the plugin build
go through.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Definitions.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Symbols.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 18 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 5 | ||||
-rw-r--r-- | src/library/scala/Predef.scala | 3 | ||||
-rw-r--r-- | src/library/scala/_$Stable.scala | 13 | ||||
-rwxr-xr-x | src/library/scala/uncheckedStable.scala (renamed from src/library/scala/UncheckedStable.scala) | 5 |
7 files changed, 16 insertions, 35 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index cd24f34097..3e9230ca68 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -44,7 +44,7 @@ trait Definitions { var NullClass: Symbol = _ var NothingClass: Symbol = _ var SingletonClass: Symbol = _ - lazy val UncheckedStableClass = getClass("scala.UncheckedStable") + lazy val uncheckedStableClass = getClass("scala.uncheckedStable") lazy val ClassClass: Symbol = getClass(sn.Class) lazy val StringClass: Symbol = getClass(sn.String) diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 7d0bd9476d..5ef82e4db7 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -312,7 +312,10 @@ trait Symbols { /** Does this symbol denote a stable value? */ final def isStable = - isTerm && !hasFlag(MUTABLE) && (!hasFlag(METHOD | BYNAMEPARAM) || hasFlag(STABLE)) && !tpe.isVolatile + isTerm && + !hasFlag(MUTABLE) && + (!hasFlag(METHOD | BYNAMEPARAM) || hasFlag(STABLE)) && + !(tpe.isVolatile && getAttributes(uncheckedStableClass).isEmpty) def isDeferred = hasFlag(DEFERRED) && !isClass diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 2d83924226..342d931eeb 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -975,7 +975,6 @@ trait Types { underlyingCache } - override def isStable = !underlying.isVolatile /* override def narrow: Type = { if (phase.erasedTypes) this @@ -1180,21 +1179,17 @@ trait Types { def contributesAbstractMembers(p: Type) = p.deferredMembers exists isVisible - ((parents exists (_.isVolatile)) || - (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 UncheckedStableClass) // escape hatch! + }) } - override def isStable = - (parents exists (_.isStable)) && !isVolatile - override def kind = "RefinedType" } @@ -1381,9 +1376,8 @@ trait Types { override def isStable: Boolean = { sym == SingletonClass || - sym == UncheckedStableClass || sym.isAliasType && normalize.isStable || - sym.isAbstractType && bounds.hi.isStable + sym.isAbstractType && (bounds.hi.typeSymbol isSubClass SingletonClass) } override def isVolatile: Boolean = @@ -2622,8 +2616,6 @@ A type's typeSymbol should never be inspected directly. } def singletonBounds(hi: Type) = { - if (hi.isVolatile) - throw new MalformedType("cannot abstract over singleton with volatile type "+hi) mkTypeBounds(NothingClass.tpe, intersectionType(List(hi, SingletonClass.tpe))) } @@ -2702,8 +2694,6 @@ A type's typeSymbol should never be inspected directly. if (!(pre1.isStable || pre1.typeSymbol.isPackageClass || pre1.typeSymbol.isModuleClass && pre1.typeSymbol.isStatic)) { - if (pre1.isVolatile) - throw new MalformedType("non-stable type "+pre1+" replacing a stable reference "+tp) stabilize(pre1, sym) } else { pre1 diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 592d95fd2e..798a0f91af 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -2240,6 +2240,9 @@ trait Typers { self: Analyzer => if (wc.symbol == NoSymbol) { namer.enterSym(wc); wc.symbol setFlag EXISTENTIAL } else context.scope enter wc.symbol val whereClauses1 = typedStats(tree.whereClauses, context.owner) + for (vd @ ValDef(_, _, _, _) <- tree.whereClauses) + if (vd.symbol.tpe.isVolatile) + error(vd.pos, "illegal abstraction from value with volatile type "+vd.symbol.tpe) val tpt1 = typedType(tree.tpt, mode) val (typeParams, tpe) = existentialTransform(tree.whereClauses map (_.symbol), tpt1.tpe) //println(tpe + ": " + tpe.getClass ) @@ -3424,7 +3427,7 @@ trait Typers { self: Analyzer => /** Types a higher-kinded type tree -- pt denotes the expected kind*/ def typedHigherKindedType(tree: Tree, mode: Int, pt: Type): Tree = if (pt.typeParams.isEmpty) typedType(tree, mode) // kind is known and it's * - else typed(tree, HKmode, pt)//!!! + else typed(tree, HKmode, pt) def typedHigherKindedType(tree: Tree, mode: Int): Tree = typed(tree, HKmode, WildcardType) diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index ce3b05771c..f1bff1f990 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -114,9 +114,6 @@ object Predef { // tupling ------------------------------------------------------------ - def uncheckedStable[A](x: A): A with UncheckedStable = - x.asInstanceOf[A with UncheckedStable] - type Pair[+A, +B] = Tuple2[A, B] object Pair { def apply[A, B](x: A, y: B) = Tuple2(x, y) diff --git a/src/library/scala/_$Stable.scala b/src/library/scala/_$Stable.scala deleted file mode 100644 index d98cbaec7b..0000000000 --- a/src/library/scala/_$Stable.scala +++ /dev/null @@ -1,13 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2007, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ -package scala - -/** A marker thread for types that are assumed to be stable - * todo: internalize in Definitions - */ -trait _$Stable {} diff --git a/src/library/scala/UncheckedStable.scala b/src/library/scala/uncheckedStable.scala index fab43b48a7..8d423c10bc 100755 --- a/src/library/scala/UncheckedStable.scala +++ b/src/library/scala/uncheckedStable.scala @@ -7,6 +7,7 @@ \* */ package scala -/** A marker class for types that are assumed to be stable +/** An annotation for values that are assumed to be stable even though their + * types are volatile. */ -abstract final class UncheckedStable {} +final class uncheckedStable extends StaticAnnotation {} |