summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRex Kerr <ichoran@gmail.com>2015-03-31 14:56:53 -0700
committerStefan Zeiger <szeiger@novocode.com>2016-08-12 13:50:37 +0200
commit30876fe2dd8cbe657a6cad6b11bbc34f10c29b36 (patch)
treef7cb3a8de91ac79ce22308f7a877c55f4dbf6755
parent6612ba010b0e70c53550d1e47141c8dc89a55f23 (diff)
downloadscala-30876fe2dd8cbe657a6cad6b11bbc34f10c29b36.tar.gz
scala-30876fe2dd8cbe657a6cad6b11bbc34f10c29b36.tar.bz2
scala-30876fe2dd8cbe657a6cad6b11bbc34f10c29b36.zip
SI-9019 TraversableLike stringPrefix broken for inner classes
This version preserves outer class and object names but discards any part of the name after a `$` that does not start with an upper-case letter. When an integer literal occurs after a `$`, the prefix up to that point is dropped so that classes defined within methods appear as top-level.
-rw-r--r--src/library/scala/collection/TraversableLike.scala21
-rw-r--r--test/files/run/xMigration.check14
-rw-r--r--test/junit/scala/collection/TraversableLikeTest.scala33
3 files changed, 55 insertions, 13 deletions
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala
index d914f2e0ff..be2f427ea4 100644
--- a/src/library/scala/collection/TraversableLike.scala
+++ b/src/library/scala/collection/TraversableLike.scala
@@ -606,12 +606,21 @@ trait TraversableLike[+A, +Repr] extends Any
* simple name of the collection class $coll.
*/
def stringPrefix : String = {
- var string = repr.getClass.getName
- val idx1 = string.lastIndexOf('.' : Int)
- if (idx1 != -1) string = string.substring(idx1 + 1)
- val idx2 = string.indexOf('$')
- if (idx2 != -1) string = string.substring(0, idx2)
- string
+ val fqn = repr.getClass.getName
+ val cls = {
+ val idx1 = fqn.lastIndexOf('.' : Int)
+ if (idx1 != -1) fqn.substring(idx1 + 1) else fqn
+ }
+ val parts = cls.split('$')
+ val last = parts.length - 1
+ parts.zipWithIndex.foldLeft("") { case (z, (s, i)) =>
+ if (s.isEmpty) z
+ else if (i != last && s.forall(java.lang.Character.isDigit)) "" // drop prefix in method-local classes
+ else if (i == 0 || java.lang.Character.isUpperCase(s.charAt(0))) {
+ if (z.isEmpty) s else z + '.' + s
+ }
+ else z
+ }
}
/** Creates a non-strict view of this $coll.
diff --git a/test/files/run/xMigration.check b/test/files/run/xMigration.check
index cd860bf394..9045146ab2 100644
--- a/test/files/run/xMigration.check
+++ b/test/files/run/xMigration.check
@@ -1,11 +1,11 @@
scala> Map(1 -> "eis").values // no warn
-res0: Iterable[String] = MapLike(eis)
+res0: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration:none
scala> Map(1 -> "eis").values // no warn
-res1: Iterable[String] = MapLike(eis)
+res1: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration:any
@@ -14,12 +14,12 @@ scala> Map(1 -> "eis").values // warn
`values` returns `Iterable[B]` rather than `Iterator[B]`.
Map(1 -> "eis").values // warn
^
-res2: Iterable[String] = MapLike(eis)
+res2: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration:2.8
scala> Map(1 -> "eis").values // no warn
-res3: Iterable[String] = MapLike(eis)
+res3: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration:2.7
@@ -28,12 +28,12 @@ scala> Map(1 -> "eis").values // warn
`values` returns `Iterable[B]` rather than `Iterator[B]`.
Map(1 -> "eis").values // warn
^
-res4: Iterable[String] = MapLike(eis)
+res4: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration:2.11
scala> Map(1 -> "eis").values // no warn
-res5: Iterable[String] = MapLike(eis)
+res5: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :setting -Xmigration // same as :any
@@ -42,6 +42,6 @@ scala> Map(1 -> "eis").values // warn
`values` returns `Iterable[B]` rather than `Iterator[B]`.
Map(1 -> "eis").values // warn
^
-res6: Iterable[String] = MapLike(eis)
+res6: Iterable[String] = MapLike.DefaultValuesIterable(eis)
scala> :quit
diff --git a/test/junit/scala/collection/TraversableLikeTest.scala b/test/junit/scala/collection/TraversableLikeTest.scala
new file mode 100644
index 0000000000..8588956016
--- /dev/null
+++ b/test/junit/scala/collection/TraversableLikeTest.scala
@@ -0,0 +1,33 @@
+package scala.collection
+
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(classOf[JUnit4])
+class TraversableLikeTest {
+ // For test_SI9019; out here because as of test writing, putting this in a method would crash compiler
+ class Baz[@specialized(Int) A]() extends IndexedSeq[A] {
+ def apply(i: Int) = ???
+ def length: Int = 0
+ }
+
+ @Test
+ def test_SI9019 {
+ object Foo {
+ def mkBar = () => {
+ class Bar extends IndexedSeq[Int] {
+ def apply(i: Int) = ???
+ def length: Int = 0
+ }
+ new Bar
+ }
+ }
+ val bar = Foo.mkBar()
+ assertEquals("Bar", bar.stringPrefix) // Previously would have been outermost class, TraversableLikeTest
+
+ val baz = new Baz[Int]()
+ assertEquals("TraversableLikeTest.Baz", baz.stringPrefix) // Make sure we don't see specialization $mcI$sp stuff
+ }
+}