diff options
author | Martin Odersky <odersky@gmail.com> | 2012-02-22 23:05:26 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2012-02-22 23:05:26 +0100 |
commit | 4eae7511a297b9d51e1aea2da38c5dacf786efa0 (patch) | |
tree | 9b57d4b39e3e76e5ba42be4e7f679a02a2f2befc | |
parent | d604417bac9a583048d750f627c2de5f8e46424f (diff) | |
download | scala-4eae7511a297b9d51e1aea2da38c5dacf786efa0.tar.gz scala-4eae7511a297b9d51e1aea2da38c5dacf786efa0.tar.bz2 scala-4eae7511a297b9d51e1aea2da38c5dacf786efa0.zip |
Compiler now ready to accept value classes in standard library. Time for a new STARR!
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 2 | ||||
-rw-r--r-- | src/library/scala/runtime/StringAdd.scala | 7 | ||||
-rw-r--r-- | src/library/scala/runtime/StringFormat.scala | 10 | ||||
-rw-r--r-- | test/files/neg/valueclasses.check | 5 | ||||
-rw-r--r-- | test/files/neg/valueclasses.scala | 2 |
5 files changed, 19 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 5207fe8331..687c325760 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -103,7 +103,7 @@ trait Namers extends MethodSynthesis { def enclosingNamerWithScope(scope: Scope) = { var cx = context while (cx != NoContext && cx.scope != scope) cx = cx.outer - if (cx == context) thisNamer + if (cx == NoContext || cx == context) thisNamer else newNamer(cx) } diff --git a/src/library/scala/runtime/StringAdd.scala b/src/library/scala/runtime/StringAdd.scala index a1256c3f3b..a7e78ea9a3 100644 --- a/src/library/scala/runtime/StringAdd.scala +++ b/src/library/scala/runtime/StringAdd.scala @@ -8,8 +8,15 @@ package scala.runtime +/** A wrapper class that adds string concatenation `+` to any value */ final class StringAdd(val self: Any) { + // Note: The implicit conversion from Any to StringAdd is one of two + // implicit conversions from Any to AnyRef in Predef. It is important to have at least + // two such conversions, so that silent conversions from value types to AnyRef + // are avoided. If StringFormat should become a value class, another + // implicit conversion from Any to AnyRef has to be introduced in Predef + def +(other: String) = String.valueOf(self) + other } diff --git a/src/library/scala/runtime/StringFormat.scala b/src/library/scala/runtime/StringFormat.scala index 94bba4043c..1f0183afbb 100644 --- a/src/library/scala/runtime/StringFormat.scala +++ b/src/library/scala/runtime/StringFormat.scala @@ -8,7 +8,15 @@ package scala.runtime -final class StringFormat(val self: Any) extends AnyVal { +/** A wrapper class that adds a `formatted` operation to any value + */ +final class StringFormat(val self: Any) { + + // Note: The implicit conversion from Any to StringFormat is one of two + // implicit conversions from Any to AnyRef in Predef. It is important to have at least + // two such conversions, so that silent conversions from value types to AnyRef + // are avoided. If StringFormat should become a value class, another + // implicit conversion from Any to AnyRef has to be introduced in Predef /** Returns string formatted according to given `format` string. * Format strings are as for `String.format` diff --git a/test/files/neg/valueclasses.check b/test/files/neg/valueclasses.check index c4430c8e1a..30ee689511 100644 --- a/test/files/neg/valueclasses.check +++ b/test/files/neg/valueclasses.check @@ -34,13 +34,10 @@ class V8(var x: Int) extends AnyVal // fail valueclasses.scala:24: error: This statement is not allowed in value class: private[this] val y: Int = V9.this.x val y = x // fail ^ -valueclasses.scala:27: error: Type of parameter of value class may not be a type variable -class V10[T](val x: T) extends AnyVal // fail - ^ valueclasses.scala:29: error: type parameter of value class may not be specialized class V12[@specialized T, U](val x: (T, U)) extends AnyVal // fail ^ valueclasses.scala:31: error: Value class needs to have exactly one public val parameter class V13(x: Int) extends AnyVal // fail ^ -15 errors found +14 errors found diff --git a/test/files/neg/valueclasses.scala b/test/files/neg/valueclasses.scala index 2794a852ee..5979f6f684 100644 --- a/test/files/neg/valueclasses.scala +++ b/test/files/neg/valueclasses.scala @@ -24,7 +24,7 @@ class V9(val x: Int) extends AnyVal { val y = x // fail } -class V10[T](val x: T) extends AnyVal // fail +class V10[T](val x: T) extends AnyVal // ok class V11[T](val x: List[T]) extends AnyVal // ok class V12[@specialized T, U](val x: (T, U)) extends AnyVal // fail |