Skip to content

Commit 729e7a9

Browse files
committed
SI-8932 Fix dropRight/takeRight implementations
I looked up at all the overrides of `IterableLike#takeRight` and `IterableLike#dropRight` and replaced usages of its argument `n` with `math.max(n, 0)` every time it was being used in an index subtraction. Fixes [SI-8932](https://issues.scala-lang.org/browse/SI-8932).
1 parent 0e8c6da commit 729e7a9

File tree

8 files changed

+81
-8
lines changed

8 files changed

+81
-8
lines changed

src/library/scala/collection/IndexedSeqOptimized.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ trait IndexedSeqOptimized[+A, +Repr] extends Any with IndexedSeqLike[A, Repr] {
141141
def drop(n: Int): Repr = slice(n, length)
142142

143143
override /*IterableLike*/
144-
def takeRight(n: Int): Repr = slice(length - n, length)
144+
def takeRight(n: Int): Repr = slice(length - math.max(n, 0), length)
145145

146146
override /*IterableLike*/
147-
def dropRight(n: Int): Repr = slice(0, length - n)
147+
def dropRight(n: Int): Repr = slice(0, length - math.max(n, 0))
148148

149149
override /*TraversableLike*/
150150
def splitAt(n: Int): (Repr, Repr) = (take(n), drop(n))

src/library/scala/collection/IterableViewLike.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ trait IterableViewLike[+A,
150150
sliding(size, 1) // we could inherit this, but that implies knowledge of the way the super class is implemented.
151151

152152
override def dropRight(n: Int): This =
153-
take(thisSeq.length - n)
153+
take(thisSeq.length - math.max(n, 0))
154154

155155
override def takeRight(n: Int): This =
156-
drop(thisSeq.length - n)
156+
drop(thisSeq.length - math.max(n, 0))
157157

158158
override def stringPrefix = "IterableView"
159159
}

src/library/scala/collection/immutable/TreeMap.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ class TreeMap[A, +B] private (tree: RB.Tree[A, B])(implicit val ordering: Orderi
101101
else new TreeMap(RB.slice(tree, from, until))
102102
}
103103

104-
override def dropRight(n: Int) = take(size - n)
105-
override def takeRight(n: Int) = drop(size - n)
104+
override def dropRight(n: Int) = take(size - math.max(n, 0))
105+
override def takeRight(n: Int) = drop(size - math.max(n, 0))
106106
override def splitAt(n: Int) = (take(n), drop(n))
107107

108108
private[this] def countWhile(p: ((A, B)) => Boolean): Int = {

src/library/scala/collection/immutable/TreeSet.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ class TreeSet[A] private (tree: RB.Tree[A, Unit])(implicit val ordering: Orderin
8787
else newSet(RB.slice(tree, from, until))
8888
}
8989

90-
override def dropRight(n: Int) = take(size - n)
91-
override def takeRight(n: Int) = drop(size - n)
90+
override def dropRight(n: Int) = take(size - math.max(n, 0))
91+
override def takeRight(n: Int) = drop(size - math.max(n, 0))
9292
override def splitAt(n: Int) = (take(n), drop(n))
9393

9494
private[this] def countWhile(p: A => Boolean): Int = {

test/junit/scala/collection/IndexedSeqOptimizedTest.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,17 @@ class IndexedSeqOptimizedTest {
1313
assertEquals(0, (Array(2): collection.mutable.WrappedArray[Int]).lastIndexWhere(_ => true, 1))
1414
assertEquals(2, "abc123".lastIndexWhere(_.isLetter, 6))
1515
}
16+
17+
@Test
18+
def hasCorrectDropAndTakeMethods() {
19+
assertEquals("", "abc" take Int.MinValue)
20+
assertEquals("", "abc" takeRight Int.MinValue)
21+
assertEquals("abc", "abc" drop Int.MinValue)
22+
assertEquals("abc", "abc" dropRight Int.MinValue)
23+
24+
assertArrayEquals(Array.empty[Int], Array(1, 2, 3) take Int.MinValue)
25+
assertArrayEquals(Array.empty[Int], Array(1, 2, 3) takeRight Int.MinValue)
26+
assertArrayEquals(Array(1, 2, 3), Array(1, 2, 3) drop Int.MinValue)
27+
assertArrayEquals(Array(1, 2, 3), Array(1, 2, 3) dropRight Int.MinValue)
28+
}
1629
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package scala.collection
2+
3+
import org.junit.Assert._
4+
import org.junit.Test
5+
import org.junit.runner.RunWith
6+
import org.junit.runners.JUnit4
7+
8+
@RunWith(classOf[JUnit4])
9+
class IterableViewLikeTest {
10+
11+
@Test
12+
def hasCorrectDropAndTakeMethods() {
13+
val iter = Iterable(1, 2, 3)
14+
15+
assertEquals(Iterable.empty[Int], iter.view take Int.MinValue force)
16+
assertEquals(Iterable.empty[Int], iter.view takeRight Int.MinValue force)
17+
assertEquals(iter, iter.view drop Int.MinValue force)
18+
assertEquals(iter, iter.view dropRight Int.MinValue force)
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package scala.collection.immutable
2+
3+
import org.junit.Assert._
4+
import org.junit.Test
5+
import org.junit.runner.RunWith
6+
import org.junit.runners.JUnit4
7+
8+
@RunWith(classOf[JUnit4])
9+
class TreeMapTest {
10+
11+
@Test
12+
def hasCorrectDropAndTakeMethods() {
13+
val tree = TreeMap(1 -> "a", 2 -> "b", 3 -> "c")
14+
15+
assertEquals(TreeMap.empty[Int, String], tree take Int.MinValue)
16+
assertEquals(TreeMap.empty[Int, String], tree takeRight Int.MinValue)
17+
assertEquals(tree, tree drop Int.MinValue)
18+
assertEquals(tree, tree dropRight Int.MinValue)
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package scala.collection.immutable
2+
3+
import org.junit.Assert._
4+
import org.junit.Test
5+
import org.junit.runner.RunWith
6+
import org.junit.runners.JUnit4
7+
8+
@RunWith(classOf[JUnit4])
9+
class TreeSetTest {
10+
11+
@Test
12+
def hasCorrectDropAndTakeMethods() {
13+
val set = TreeSet(1, 2, 3)
14+
15+
assertEquals(TreeSet.empty[Int], set take Int.MinValue)
16+
assertEquals(TreeSet.empty[Int], set takeRight Int.MinValue)
17+
assertEquals(set, set drop Int.MinValue)
18+
assertEquals(set, set dropRight Int.MinValue)
19+
}
20+
}

0 commit comments

Comments
 (0)