Skip to content

Commit

Permalink
Copy sources from tests/pos-special/stdlib to scala2-library-cc
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasstucki committed Nov 28, 2023
1 parent 49e80de commit 15d1acd
Show file tree
Hide file tree
Showing 143 changed files with 2,692 additions and 1,119 deletions.
9 changes: 5 additions & 4 deletions scala2-library-cc/src/scala/collection/ArrayOps.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package collection

import java.lang.Math.{max, min}
import java.util.Arrays
import language.experimental.captureChecking

import scala.Predef.{ // unimport all array-related implicit conversions to avoid triggering them accidentally
genericArrayOps => _,
Expand Down Expand Up @@ -116,7 +117,7 @@ object ArrayOps {
flatMap[B](x => asIterable(f(x)))

/** Creates a new non-strict filter which combines this filter with the given predicate. */
def withFilter(q: A => Boolean): WithFilter[A] = new WithFilter[A](a => p(a) && q(a), xs)
def withFilter(q: A => Boolean): WithFilter[A]^{this, q} = new WithFilter[A](a => p(a) && q(a), xs)
}

@SerialVersionUID(3L)
Expand Down Expand Up @@ -366,7 +367,7 @@ final class ArrayOps[A](private val xs: Array[A]) extends AnyVal {
def inits: Iterator[Array[A]] = iterateUntilEmpty(xs => new ArrayOps(xs).init)

// A helper for tails and inits.
private[this] def iterateUntilEmpty(f: Array[A] => Array[A]): Iterator[Array[A]] =
private[this] def iterateUntilEmpty(f: Array[A] => Array[A]): Iterator[Array[A]]^{f} =
Iterator.iterate(xs)(f).takeWhile(x => x.length != 0) ++ Iterator.single(Array.empty[A])

/** An array containing the first `n` elements of this array. */
Expand Down Expand Up @@ -663,7 +664,7 @@ final class ArrayOps[A](private val xs: Array[A]) extends AnyVal {
* All these operations apply to those elements of this array
* which satisfy the predicate `p`.
*/
def withFilter(p: A => Boolean): ArrayOps.WithFilter[A] = new ArrayOps.WithFilter[A](p, xs)
def withFilter(p: A => Boolean): ArrayOps.WithFilter[A]^{p} = new ArrayOps.WithFilter[A](p, xs)

/** Finds index of first occurrence of some value in this array after or at some start index.
*
Expand Down Expand Up @@ -1345,7 +1346,7 @@ final class ArrayOps[A](private val xs: Array[A]) extends AnyVal {
* @tparam B the type of the elements after being transformed by `f`
* @return a new array consisting of all the elements of this array without duplicates.
*/
def distinctBy[B](f: A => B): Array[A] =
def distinctBy[B](f: A -> B): Array[A] =
ArrayBuilder.make[A].addAll(iterator.distinctBy(f)).result()

/** A copy of this array with an element value appended until a given target length is reached.
Expand Down
6 changes: 3 additions & 3 deletions scala2-library-cc/src/scala/collection/BitSet.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import java.io.{ObjectInputStream, ObjectOutputStream}
import scala.annotation.nowarn
import scala.collection.Stepper.EfficientSplit
import scala.collection.mutable.Builder

import language.experimental.captureChecking

/** Base type of bitsets.
*
Expand All @@ -33,7 +33,7 @@ import scala.collection.mutable.Builder
* @define Coll `BitSet`
*/
trait BitSet extends SortedSet[Int] with BitSetOps[BitSet] {
override protected def fromSpecific(coll: IterableOnce[Int]): BitSet = bitSetFactory.fromSpecific(coll)
override protected def fromSpecific(coll: IterableOnce[Int]^): BitSet = bitSetFactory.fromSpecific(coll)
override protected def newSpecificBuilder: Builder[Int, BitSet] = bitSetFactory.newBuilder
override def empty: BitSet = bitSetFactory.empty
@nowarn("""cat=deprecation&origin=scala\.collection\.Iterable\.stringPrefix""")
Expand All @@ -48,7 +48,7 @@ object BitSet extends SpecificIterableFactory[Int, BitSet] {

def empty: BitSet = immutable.BitSet.empty
def newBuilder: Builder[Int, BitSet] = immutable.BitSet.newBuilder
def fromSpecific(it: IterableOnce[Int]): BitSet = immutable.BitSet.fromSpecific(it)
def fromSpecific(it: IterableOnce[Int]^): BitSet = immutable.BitSet.fromSpecific(it)

@SerialVersionUID(3L)
private[collection] abstract class SerializationProxy(@transient protected val coll: BitSet) extends Serializable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*/

package scala.collection

import language.experimental.captureChecking

/** Buffered iterators are iterators which provide a method `head`
* that inspects the next element without discarding it.
Expand Down
32 changes: 19 additions & 13 deletions scala2-library-cc/src/scala/collection/BuildFrom.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import scala.annotation.implicitNotFound
import scala.collection.mutable.Builder
import scala.collection.immutable.WrappedString
import scala.reflect.ClassTag
import language.experimental.captureChecking
import caps.unsafe.unsafeAssumePure

/** Builds a collection of type `C` from elements of type `A` when a source collection of type `From` is available.
* Implicit instances of `BuildFrom` are available for all collection types.
Expand All @@ -26,7 +28,11 @@ import scala.reflect.ClassTag
*/
@implicitNotFound(msg = "Cannot construct a collection of type ${C} with elements of type ${A} based on a collection of type ${From}.")
trait BuildFrom[-From, -A, +C] extends Any { self =>
def fromSpecific(from: From)(it: IterableOnce[A]): C
def fromSpecific(from: From)(it: IterableOnce[A]^): C
// !!! this is wrong, we need two versions of fromSpecific; one mapping
// to C^{it} when C is an Iterable, and one mapping to C when C is a Seq, Map, or Set.
// But that requires a large scale refactoring of BuildFrom. The unsafeAssumePure
// calls in this file are needed to sweep that problem under the carpet.

/** Get a Builder for the collection. For non-strict collection types this will use an intermediate buffer.
* Building collections with `fromSpecific` is preferred because it can be lazy for lazy collections. */
Expand All @@ -37,7 +43,7 @@ trait BuildFrom[-From, -A, +C] extends Any { self =>

/** Partially apply a BuildFrom to a Factory */
def toFactory(from: From): Factory[A, C] = new Factory[A, C] {
def fromSpecific(it: IterableOnce[A]): C = self.fromSpecific(from)(it)
def fromSpecific(it: IterableOnce[A]^): C = self.fromSpecific(from)(it)
def newBuilder: Builder[A, C] = self.newBuilder(from)
}
}
Expand All @@ -48,42 +54,42 @@ object BuildFrom extends BuildFromLowPriority1 {
implicit def buildFromMapOps[CC[X, Y] <: Map[X, Y] with MapOps[X, Y, CC, _], K0, V0, K, V]: BuildFrom[CC[K0, V0] with Map[K0, V0], (K, V), CC[K, V] with Map[K, V]] = new BuildFrom[CC[K0, V0], (K, V), CC[K, V]] {
//TODO: Reuse a prototype instance
def newBuilder(from: CC[K0, V0]): Builder[(K, V), CC[K, V]] = (from: MapOps[K0, V0, CC, _]).mapFactory.newBuilder[K, V]
def fromSpecific(from: CC[K0, V0])(it: IterableOnce[(K, V)]): CC[K, V] = (from: MapOps[K0, V0, CC, _]).mapFactory.from(it)
def fromSpecific(from: CC[K0, V0])(it: IterableOnce[(K, V)]^): CC[K, V] = (from: MapOps[K0, V0, CC, _]).mapFactory.from(it)
}

/** Build the source collection type from a SortedMapOps */
implicit def buildFromSortedMapOps[CC[X, Y] <: SortedMap[X, Y] with SortedMapOps[X, Y, CC, _], K0, V0, K : Ordering, V]: BuildFrom[CC[K0, V0] with SortedMap[K0, V0], (K, V), CC[K, V] with SortedMap[K, V]] = new BuildFrom[CC[K0, V0], (K, V), CC[K, V]] {
def newBuilder(from: CC[K0, V0]): Builder[(K, V), CC[K, V]] = (from: SortedMapOps[K0, V0, CC, _]).sortedMapFactory.newBuilder[K, V]
def fromSpecific(from: CC[K0, V0])(it: IterableOnce[(K, V)]): CC[K, V] = (from: SortedMapOps[K0, V0, CC, _]).sortedMapFactory.from(it)
def fromSpecific(from: CC[K0, V0])(it: IterableOnce[(K, V)]^): CC[K, V] = (from: SortedMapOps[K0, V0, CC, _]).sortedMapFactory.from(it)
}

implicit def buildFromBitSet[C <: BitSet with BitSetOps[C]]: BuildFrom[C, Int, C] =
new BuildFrom[C, Int, C] {
def fromSpecific(from: C)(it: IterableOnce[Int]): C = from.bitSetFactory.fromSpecific(it)
def fromSpecific(from: C)(it: IterableOnce[Int]^): C = from.bitSetFactory.fromSpecific(it)
def newBuilder(from: C): Builder[Int, C] = from.bitSetFactory.newBuilder
}

implicit val buildFromString: BuildFrom[String, Char, String] =
new BuildFrom[String, Char, String] {
def fromSpecific(from: String)(it: IterableOnce[Char]): String = Factory.stringFactory.fromSpecific(it)
def fromSpecific(from: String)(it: IterableOnce[Char]^): String = Factory.stringFactory.fromSpecific(it)
def newBuilder(from: String): Builder[Char, String] = Factory.stringFactory.newBuilder
}

implicit val buildFromWrappedString: BuildFrom[WrappedString, Char, WrappedString] =
new BuildFrom[WrappedString, Char, WrappedString] {
def fromSpecific(from: WrappedString)(it: IterableOnce[Char]): WrappedString = WrappedString.fromSpecific(it)
def fromSpecific(from: WrappedString)(it: IterableOnce[Char]^): WrappedString = WrappedString.fromSpecific(it)
def newBuilder(from: WrappedString): mutable.Builder[Char, WrappedString] = WrappedString.newBuilder
}

implicit def buildFromArray[A : ClassTag]: BuildFrom[Array[_], A, Array[A]] =
new BuildFrom[Array[_], A, Array[A]] {
def fromSpecific(from: Array[_])(it: IterableOnce[A]): Array[A] = Factory.arrayFactory[A].fromSpecific(it)
def fromSpecific(from: Array[_])(it: IterableOnce[A]^): Array[A] = Factory.arrayFactory[A].fromSpecific(it)
def newBuilder(from: Array[_]): Builder[A, Array[A]] = Factory.arrayFactory[A].newBuilder
}

implicit def buildFromView[A, B]: BuildFrom[View[A], B, View[B]] =
new BuildFrom[View[A], B, View[B]] {
def fromSpecific(from: View[A])(it: IterableOnce[B]): View[B] = View.from(it)
def fromSpecific(from: View[A])(it: IterableOnce[B]^): View[B] = View.from(it).unsafeAssumePure
def newBuilder(from: View[A]): Builder[B, View[B]] = View.newBuilder
}

Expand All @@ -97,12 +103,12 @@ trait BuildFromLowPriority1 extends BuildFromLowPriority2 {
// test in test/junit/scala/collection/BuildFromTest.scala and discussion in https://github.com/scala/scala/pull/10209
implicit def buildFromSortedSetOps[CC[X] <: SortedSet[X] with SortedSetOps[X, CC, _], A0, A : Ordering]: BuildFrom[CC[A0] with SortedSet[A0], A, CC[A] with SortedSet[A]] = new BuildFrom[CC[A0], A, CC[A]] {
def newBuilder(from: CC[A0]): Builder[A, CC[A]] = (from: SortedSetOps[A0, CC, _]).sortedIterableFactory.newBuilder[A]
def fromSpecific(from: CC[A0])(it: IterableOnce[A]): CC[A] = (from: SortedSetOps[A0, CC, _]).sortedIterableFactory.from(it)
def fromSpecific(from: CC[A0])(it: IterableOnce[A]^): CC[A] = (from: SortedSetOps[A0, CC, _]).sortedIterableFactory.from(it)
}

implicit def fallbackStringCanBuildFrom[A]: BuildFrom[String, A, immutable.IndexedSeq[A]] =
new BuildFrom[String, A, immutable.IndexedSeq[A]] {
def fromSpecific(from: String)(it: IterableOnce[A]): immutable.IndexedSeq[A] = immutable.IndexedSeq.from(it)
def fromSpecific(from: String)(it: IterableOnce[A]^): immutable.IndexedSeq[A] = immutable.IndexedSeq.from(it)
def newBuilder(from: String): Builder[A, immutable.IndexedSeq[A]] = immutable.IndexedSeq.newBuilder[A]
}
}
Expand All @@ -112,11 +118,11 @@ trait BuildFromLowPriority2 {
implicit def buildFromIterableOps[CC[X] <: Iterable[X] with IterableOps[X, CC, _], A0, A]: BuildFrom[CC[A0], A, CC[A]] = new BuildFrom[CC[A0], A, CC[A]] {
//TODO: Reuse a prototype instance
def newBuilder(from: CC[A0]): Builder[A, CC[A]] = (from: IterableOps[A0, CC, _]).iterableFactory.newBuilder[A]
def fromSpecific(from: CC[A0])(it: IterableOnce[A]): CC[A] = (from: IterableOps[A0, CC, _]).iterableFactory.from(it)
def fromSpecific(from: CC[A0])(it: IterableOnce[A]^): CC[A] = (from: IterableOps[A0, CC, _]).iterableFactory.from(it).unsafeAssumePure
}

implicit def buildFromIterator[A]: BuildFrom[Iterator[_], A, Iterator[A]] = new BuildFrom[Iterator[_], A, Iterator[A]] {
def newBuilder(from: Iterator[_]): mutable.Builder[A, Iterator[A]] = Iterator.newBuilder
def fromSpecific(from: Iterator[_])(it: IterableOnce[A]): Iterator[A] = Iterator.from(it)
def fromSpecific(from: Iterator[_])(it: IterableOnce[A]^): Iterator[A] = Iterator.from(it).unsafeAssumePure
}
}
2 changes: 1 addition & 1 deletion scala2-library-cc/src/scala/collection/DefaultMap.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

package scala
package collection

import language.experimental.captureChecking

/** A default map which builds a default `immutable.Map` implementation for all
* transformations.
Expand Down
Loading

0 comments on commit 15d1acd

Please sign in to comment.