Skip to content

Commit 9edbe3d

Browse files
committed
Merge pull request #5191 from som-snytt/issue/9382
SI-9382 Privatize enhanced x in Tuple2Zipped.Ops
2 parents 7d5a0b3 + 0b79f4b commit 9edbe3d

File tree

7 files changed

+131
-99
lines changed

7 files changed

+131
-99
lines changed

src/library/scala/runtime/Tuple2Zipped.scala

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* __ *\
22
** ________ ___ / / ___ Scala API **
3-
** / __/ __// _ | / / / _ | (c) 2002-2013, LAMP/EPFL **
3+
** / __/ __// _ | / / / _ | (c) 2002-2016, LAMP/EPFL **
44
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
55
** /____/\___/_/ |_/____/_/ | | **
66
** |/ **
@@ -34,14 +34,15 @@ object ZippedTraversable2 {
3434
}
3535

3636
final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1, Repr1], IterableLike[El2, Repr2])) extends AnyVal with ZippedTraversable2[El1, El2] {
37-
// This would be better as "private def coll1 = colls._1" but
38-
// SI-6215 precludes private methods in value classes.
37+
private def coll1 = colls._1
38+
private def coll2 = colls._2
39+
3940
def map[B, To](f: (El1, El2) => B)(implicit cbf: CBF[Repr1, B, To]): To = {
40-
val b = cbf(colls._1.repr)
41-
b.sizeHint(colls._1)
42-
val elems2 = colls._2.iterator
41+
val b = cbf(coll1.repr)
42+
b.sizeHint(coll1)
43+
val elems2 = coll2.iterator
4344

44-
for (el1 <- colls._1) {
45+
for (el1 <- coll1) {
4546
if (elems2.hasNext)
4647
b += f(el1, elems2.next())
4748
else
@@ -52,10 +53,10 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
5253
}
5354

5455
def flatMap[B, To](f: (El1, El2) => TraversableOnce[B])(implicit cbf: CBF[Repr1, B, To]): To = {
55-
val b = cbf(colls._1.repr)
56-
val elems2 = colls._2.iterator
56+
val b = cbf(coll1.repr)
57+
val elems2 = coll2.iterator
5758

58-
for (el1 <- colls._1) {
59+
for (el1 <- coll1) {
5960
if (elems2.hasNext)
6061
b ++= f(el1, elems2.next())
6162
else
@@ -66,11 +67,11 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
6667
}
6768

6869
def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CBF[Repr1, El1, To1], cbf2: CBF[Repr2, El2, To2]): (To1, To2) = {
69-
val b1 = cbf1(colls._1.repr)
70-
val b2 = cbf2(colls._2.repr)
71-
val elems2 = colls._2.iterator
70+
val b1 = cbf1(coll1.repr)
71+
val b2 = cbf2(coll2.repr)
72+
val elems2 = coll2.iterator
7273

73-
for (el1 <- colls._1) {
74+
for (el1 <- coll1) {
7475
if (elems2.hasNext) {
7576
val el2 = elems2.next()
7677
if (f(el1, el2)) {
@@ -85,9 +86,9 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
8586
}
8687

8788
def exists(@deprecatedName('f) p: (El1, El2) => Boolean): Boolean = {
88-
val elems2 = colls._2.iterator
89+
val elems2 = coll2.iterator
8990

90-
for (el1 <- colls._1) {
91+
for (el1 <- coll1) {
9192
if (elems2.hasNext) {
9293
if (p(el1, elems2.next()))
9394
return true
@@ -101,21 +102,21 @@ final class Tuple2Zipped[El1, Repr1, El2, Repr2](val colls: (TraversableLike[El1
101102
!exists((x, y) => !p(x, y))
102103

103104
def foreach[U](f: (El1, El2) => U): Unit = {
104-
val elems2 = colls._2.iterator
105+
val elems2 = coll2.iterator
105106

106-
for (el1 <- colls._1) {
107+
for (el1 <- coll1) {
107108
if (elems2.hasNext)
108109
f(el1, elems2.next())
109110
else
110111
return
111112
}
112113
}
113114

114-
override def toString = "(%s, %s).zipped".format(colls._1.toString, colls._2.toString)
115+
override def toString = s"($coll1, $coll2).zipped"
115116
}
116117

117118
object Tuple2Zipped {
118-
final class Ops[T1, T2](val x: (T1, T2)) extends AnyVal {
119+
final class Ops[T1, T2](private val x: (T1, T2)) extends AnyVal {
119120
def invert[El1, CC1[X] <: TraversableOnce[X], El2, CC2[X] <: TraversableOnce[X], That]
120121
(implicit w1: T1 <:< CC1[El1],
121122
w2: T2 <:< CC2[El2],

src/library/scala/runtime/Tuple3Zipped.scala

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,16 @@ object ZippedTraversable3 {
3434
final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (TraversableLike[El1, Repr1], IterableLike[El2, Repr2], IterableLike[El3, Repr3]))
3535
extends AnyVal with ZippedTraversable3[El1, El2, El3] {
3636

37+
private def coll1 = colls._1
38+
private def coll2 = colls._2
39+
private def coll3 = colls._3
40+
3741
def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CBF[Repr1, B, To]): To = {
38-
val b = cbf(colls._1.repr)
39-
val elems2 = colls._2.iterator
40-
val elems3 = colls._3.iterator
42+
val b = cbf(coll1.repr)
43+
val elems2 = coll2.iterator
44+
val elems3 = coll3.iterator
4145

42-
for (el1 <- colls._1) {
46+
for (el1 <- coll1) {
4347
if (elems2.hasNext && elems3.hasNext)
4448
b += f(el1, elems2.next(), elems3.next())
4549
else
@@ -49,11 +53,11 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
4953
}
5054

5155
def flatMap[B, To](f: (El1, El2, El3) => TraversableOnce[B])(implicit cbf: CBF[Repr1, B, To]): To = {
52-
val b = cbf(colls._1.repr)
53-
val elems2 = colls._2.iterator
54-
val elems3 = colls._3.iterator
56+
val b = cbf(coll1.repr)
57+
val elems2 = coll2.iterator
58+
val elems3 = coll3.iterator
5559

56-
for (el1 <- colls._1) {
60+
for (el1 <- coll1) {
5761
if (elems2.hasNext && elems3.hasNext)
5862
b ++= f(el1, elems2.next(), elems3.next())
5963
else
@@ -66,14 +70,14 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
6670
implicit cbf1: CBF[Repr1, El1, To1],
6771
cbf2: CBF[Repr2, El2, To2],
6872
cbf3: CBF[Repr3, El3, To3]): (To1, To2, To3) = {
69-
val b1 = cbf1(colls._1.repr)
70-
val b2 = cbf2(colls._2.repr)
71-
val b3 = cbf3(colls._3.repr)
72-
val elems2 = colls._2.iterator
73-
val elems3 = colls._3.iterator
73+
val b1 = cbf1(coll1.repr)
74+
val b2 = cbf2(coll2.repr)
75+
val b3 = cbf3(coll3.repr)
76+
val elems2 = coll2.iterator
77+
val elems3 = coll3.iterator
7478
def result = (b1.result(), b2.result(), b3.result())
7579

76-
for (el1 <- colls._1) {
80+
for (el1 <- coll1) {
7781
if (elems2.hasNext && elems3.hasNext) {
7882
val el2 = elems2.next()
7983
val el3 = elems3.next()
@@ -91,10 +95,10 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
9195
}
9296

9397
def exists(@deprecatedName('f) p: (El1, El2, El3) => Boolean): Boolean = {
94-
val elems2 = colls._2.iterator
95-
val elems3 = colls._3.iterator
98+
val elems2 = coll2.iterator
99+
val elems3 = coll3.iterator
96100

97-
for (el1 <- colls._1) {
101+
for (el1 <- coll1) {
98102
if (elems2.hasNext && elems3.hasNext) {
99103
if (p(el1, elems2.next(), elems3.next()))
100104
return true
@@ -108,22 +112,22 @@ final class Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3](val colls: (Travers
108112
!exists((x, y, z) => !p(x, y, z))
109113

110114
def foreach[U](f: (El1, El2, El3) => U): Unit = {
111-
val elems2 = colls._2.iterator
112-
val elems3 = colls._3.iterator
115+
val elems2 = coll2.iterator
116+
val elems3 = coll3.iterator
113117

114-
for (el1 <- colls._1) {
118+
for (el1 <- coll1) {
115119
if (elems2.hasNext && elems3.hasNext)
116120
f(el1, elems2.next(), elems3.next())
117121
else
118122
return
119123
}
120124
}
121125

122-
override def toString: String = "(%s, %s, %s).zipped".format(colls._1.toString, colls._2.toString, colls._3.toString)
126+
override def toString = s"($coll1, $coll2, $coll3).zipped"
123127
}
124128

125129
object Tuple3Zipped {
126-
final class Ops[T1, T2, T3](val x: (T1, T2, T3)) extends AnyVal {
130+
final class Ops[T1, T2, T3](private val x: (T1, T2, T3)) extends AnyVal {
127131
def invert[El1, CC1[X] <: TraversableOnce[X], El2, CC2[X] <: TraversableOnce[X], El3, CC3[X] <: TraversableOnce[X], That]
128132
(implicit w1: T1 <:< CC1[El1],
129133
w2: T2 <:< CC2[El2],

test/files/neg/t9382.check

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
t9382.scala:3: error: value x is not a member of (List[Int], List[Int])
2+
def f = (List(1,2,3), List(4,5,6)).x
3+
^
4+
t9382.scala:4: error: value x is not a member of (List[Int], List[Int], List[Int])
5+
def g = (List(1,2,3), List(4,5,6), List(7,8,9)).x
6+
^
7+
t9382.scala:5: error: value x is not a member of (Int, Int)
8+
def huh = (1,2).x
9+
^
10+
three errors found

test/files/neg/t9382.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
trait T {
3+
def f = (List(1,2,3), List(4,5,6)).x
4+
def g = (List(1,2,3), List(4,5,6), List(7,8,9)).x
5+
def huh = (1,2).x
6+
}

test/files/run/tuple-zipped.scala

Lines changed: 0 additions & 41 deletions
This file was deleted.

test/junit/scala/collection/immutable/StreamTest.scala

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -107,20 +107,4 @@ class StreamTest {
107107
def withFilter_map_properly_lazy_in_tail: Unit = {
108108
assertStreamOpLazyInTail(_.withFilter(_ % 2 == 0).map(identity), List(1, 2))
109109
}
110-
111-
@Test
112-
def test_si9379() {
113-
class Boom {
114-
private var i = -1
115-
def inc = {
116-
i += 1
117-
if (i > 1000) throw new NoSuchElementException("Boom! Too many elements!")
118-
i
119-
}
120-
}
121-
val b = new Boom
122-
val s = Stream.continually(b.inc)
123-
// zipped.toString must allow s to short-circuit evaluation
124-
assertTrue((s, s).zipped.toString contains s.toString)
125-
}
126110
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
package scala.runtime
3+
4+
import scala.language.postfixOps
5+
6+
import org.junit.Assert._
7+
import org.junit.Test
8+
import org.junit.runner.RunWith
9+
import org.junit.runners.JUnit4
10+
11+
/** Tests Tuple?Zipped */
12+
@RunWith(classOf[JUnit4])
13+
class ZippedTest {
14+
@Test
15+
def crossZipped() {
16+
17+
val xs1 = List.range(1, 100)
18+
val xs2 = xs1.view
19+
val xs3 = xs1 take 10
20+
val ss1 = Stream from 1
21+
val ss2 = ss1.view
22+
val ss3 = ss1 take 10
23+
val as1 = 1 to 100 toArray
24+
val as2 = as1.view
25+
val as3 = as1 take 10
26+
27+
def xss1 = List[Seq[Int]](xs1, xs2, xs3, ss1, ss2, ss3, as1, as2, as3)
28+
def xss2 = List[Seq[Int]](xs1, xs2, xs3, ss3, as1, as2, as3) // no infinities
29+
def xss3 = List[Seq[Int]](xs2, xs3, ss3, as1) // representative sampling
30+
31+
for (cc1 <- xss1 ; cc2 <- xss2) {
32+
val sum1 = (cc1, cc2).zipped map { case (x, y) => x + y } sum
33+
val sum2 = (cc1, cc2).zipped map (_ + _) sum
34+
35+
assert(sum1 == sum2)
36+
}
37+
38+
for (cc1 <- xss1 ; cc2 <- xss2 ; cc3 <- xss3) {
39+
val sum1 = (cc1, cc2, cc3).zipped map { case (x, y, z) => x + y + z } sum
40+
val sum2 = (cc1, cc2, cc3).zipped map (_ + _ + _) sum
41+
42+
assert(sum1 == sum2)
43+
}
44+
45+
assert((ss1, ss1).zipped exists ((x, y) => true))
46+
assert((ss1, ss1, ss1).zipped exists ((x, y, z) => true))
47+
48+
assert(!(ss1, ss2, 1 to 3).zipped.exists(_ + _ + _ > 100000))
49+
assert((1 to 3, ss1, ss2).zipped.forall(_ + _ + _ > 0))
50+
assert((ss1, 1 to 3, ss2).zipped.map(_ + _ + _).size == 3)
51+
}
52+
53+
@Test
54+
def test_si9379() {
55+
class Boom {
56+
private var i = -1
57+
def inc = {
58+
i += 1
59+
if (i > 1000) throw new NoSuchElementException("Boom! Too many elements!")
60+
i
61+
}
62+
}
63+
val b = new Boom
64+
val s = Stream.continually(b.inc)
65+
// zipped.toString must allow s to short-circuit evaluation
66+
assertTrue((s, s).zipped.toString contains s.toString)
67+
}
68+
}

0 commit comments

Comments
 (0)