Skip to content

Commit cfc89b8

Browse files
lrytzashawley
authored andcommitted
Changes to cross-compile with the 2.13 collections
1 parent 7984160 commit cfc89b8

File tree

5 files changed

+73
-16
lines changed

5 files changed

+73
-16
lines changed

build.sbt

+12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ lazy val xml = crossProject.in(file("."))
2525
scalacOptions ++= "-deprecation:false -feature -Xlint:-stars-align,-nullary-unit,_".split("\\s+").to[Seq],
2626
scalacOptions in Test += "-Xxml:coalescing",
2727

28+
mimaPreviousVersion := Some("1.1.0"),
29+
30+
unmanagedSourceDirectories in Compile ++= {
31+
(unmanagedSourceDirectories in Compile).value.map { dir =>
32+
val sv = scalaVersion.value
33+
CrossVersion.partialVersion(sv) match {
34+
case Some((2, 13)) if !sv.startsWith("2.13.0-M3") => file(dir.getPath ++ "-2.13") // TODO: remove M3 guard once M4 is out.
35+
case _ => file(dir.getPath ++ "-2.11-2.12")
36+
}
37+
}
38+
},
39+
2840
apiMappings ++= Map(
2941
scalaInstance.value.libraryJar
3042
-> url(s"http://www.scala-lang.org/api/${scalaVersion.value}/")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package scala.xml
2+
3+
import scala.collection.SeqLike
4+
import scala.collection.generic.CanBuildFrom
5+
6+
object ScalaVersionSpecific {
7+
import NodeSeq.Coll
8+
type CBF[-From, -A, +C] = CanBuildFrom[From, A, C]
9+
object NodeSeqCBF extends CanBuildFrom[Coll, Node, NodeSeq] {
10+
def apply(from: Coll) = NodeSeq.newBuilder
11+
def apply() = NodeSeq.newBuilder
12+
}
13+
}
14+
15+
trait ScalaVersionSpecificNodeSeq extends SeqLike[Node, NodeSeq] { self: NodeSeq =>
16+
/** Creates a list buffer as builder for this class */
17+
override protected[this] def newBuilder = NodeSeq.newBuilder
18+
}
19+
20+
trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer =>
21+
override def stringPrefix: String = "NodeBuffer"
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package scala.xml
2+
3+
import scala.collection.immutable.StrictOptimizedSeqOps
4+
import scala.collection.{SeqOps, immutable, mutable}
5+
import scala.collection.BuildFrom
6+
import scala.collection.mutable.Builder
7+
8+
object ScalaVersionSpecific {
9+
import NodeSeq.Coll
10+
type CBF[-From, -A, +C] = BuildFrom[From, A, C]
11+
object NodeSeqCBF extends BuildFrom[Coll, Node, NodeSeq] {
12+
def newBuilder(from: Coll): Builder[Node, NodeSeq] = NodeSeq.newBuilder
13+
def fromSpecificIterable(from: Coll)(it: Iterable[Node]): NodeSeq = (NodeSeq.newBuilder ++= from).result()
14+
}
15+
}
16+
17+
trait ScalaVersionSpecificNodeSeq
18+
extends SeqOps[Node, immutable.Seq, NodeSeq]
19+
with StrictOptimizedSeqOps[Node, immutable.Seq, NodeSeq] { self: NodeSeq =>
20+
override def fromSpecificIterable(coll: Iterable[Node]): NodeSeq = (NodeSeq.newBuilder ++= coll).result()
21+
22+
override def newSpecificBuilder(): mutable.Builder[Node, NodeSeq] = NodeSeq.newBuilder
23+
}
24+
25+
trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer =>
26+
override def className: String = "NodeBuffer"
27+
}

shared/src/main/scala/scala/xml/NodeBuffer.scala

+1-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ package xml
1919
*
2020
* @author Burak Emir
2121
*/
22-
class NodeBuffer extends scala.collection.mutable.ArrayBuffer[Node] {
23-
24-
override def stringPrefix: String = "NodeBuffer"
25-
22+
class NodeBuffer extends scala.collection.mutable.ArrayBuffer[Node] with ScalaVersionSpecificNodeBuffer {
2623
/**
2724
* Append given object to this buffer, returns reference on this
2825
* `NodeBuffer` for convenience. Some rules apply:

shared/src/main/scala/scala/xml/NodeSeq.scala

+11-12
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
package scala
1010
package xml
1111

12-
import scala.collection.{ mutable, immutable, generic, SeqLike, AbstractSeq }
12+
import scala.collection.{ mutable, immutable, AbstractSeq }
1313
import mutable.{ Builder, ListBuffer }
14-
import generic.{ CanBuildFrom }
14+
import ScalaVersionSpecific.CBF
1515
import scala.language.implicitConversions
1616
import scala.collection.Seq
1717

@@ -25,12 +25,15 @@ object NodeSeq {
2525
def fromSeq(s: Seq[Node]): NodeSeq = new NodeSeq {
2626
def theSeq = s
2727
}
28+
29+
// ---
30+
// For 2.11 / 2.12 only. Moving the implicit to a parent trait of `object NodeSeq` and keeping it
31+
// in ScalaVersionSpecific doesn't work because the implicit becomes less specific, which leads to
32+
// ambiguities.
2833
type Coll = NodeSeq
29-
implicit def canBuildFrom: CanBuildFrom[Coll, Node, NodeSeq] =
30-
new CanBuildFrom[Coll, Node, NodeSeq] {
31-
def apply(from: Coll) = newBuilder
32-
def apply() = newBuilder
33-
}
34+
implicit def canBuildFrom: CBF[Coll, Node, NodeSeq] = ScalaVersionSpecific.NodeSeqCBF
35+
// ---
36+
3437
def newBuilder: Builder[Node, NodeSeq] = new ListBuffer[Node] mapResult fromSeq
3538
implicit def seqToNodeSeq(s: Seq[Node]): NodeSeq = fromSeq(s)
3639
}
@@ -41,11 +44,7 @@ object NodeSeq {
4144
*
4245
* @author Burak Emir
4346
*/
44-
abstract class NodeSeq extends AbstractSeq[Node] with immutable.Seq[Node] with SeqLike[Node, NodeSeq] with Equality with Serializable {
45-
46-
/** Creates a list buffer as builder for this class */
47-
override protected[this] def newBuilder = NodeSeq.newBuilder
48-
47+
abstract class NodeSeq extends AbstractSeq[Node] with immutable.Seq[Node] with ScalaVersionSpecificNodeSeq with Equality with Serializable {
4948
def theSeq: Seq[Node]
5049
def length = theSeq.length
5150
override def iterator = theSeq.iterator

0 commit comments

Comments
 (0)