From b88fe2a769a2c3fcb620cf2710f391623597da20 Mon Sep 17 00:00:00 2001 From: Lukas Rytz Date: Thu, 22 Mar 2018 22:31:04 +0100 Subject: [PATCH 1/3] Changes to cross-compile with the 2.13 collections --- build.sbt | 10 +++++++ .../scala/xml/ScalaVersionSpecific.scala | 22 +++++++++++++++ .../scala/xml/ScalaVersionSpecific.scala | 27 +++++++++++++++++++ .../src/main/scala/scala/xml/NodeBuffer.scala | 5 +--- shared/src/main/scala/scala/xml/NodeSeq.scala | 23 ++++++++-------- 5 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala create mode 100644 shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala diff --git a/build.sbt b/build.sbt index a1b38172d..dd1ffe845 100644 --- a/build.sbt +++ b/build.sbt @@ -23,6 +23,16 @@ lazy val xml = crossProject(JSPlatform, JVMPlatform) else Some("1.1.0") }, + unmanagedSourceDirectories in Compile ++= { + (unmanagedSourceDirectories in Compile).value.map { dir => + val sv = scalaVersion.value + CrossVersion.partialVersion(sv) match { + case Some((2, 13)) if !sv.startsWith("2.13.0-M3") => file(dir.getPath ++ "-2.13") // TODO: remove M3 guard once M4 is out. + case _ => file(dir.getPath ++ "-2.11-2.12") + } + } + }, + apiMappings ++= Map( scalaInstance.value.libraryJar -> url(s"http://www.scala-lang.org/api/${scalaVersion.value}/") diff --git a/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala b/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala new file mode 100644 index 000000000..eee27f621 --- /dev/null +++ b/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala @@ -0,0 +1,22 @@ +package scala.xml + +import scala.collection.SeqLike +import scala.collection.generic.CanBuildFrom + +object ScalaVersionSpecific { + import NodeSeq.Coll + type CBF[-From, -A, +C] = CanBuildFrom[From, A, C] + object NodeSeqCBF extends CanBuildFrom[Coll, Node, NodeSeq] { + def apply(from: Coll) = NodeSeq.newBuilder + def apply() = NodeSeq.newBuilder + } +} + +trait ScalaVersionSpecificNodeSeq extends SeqLike[Node, NodeSeq] { self: NodeSeq => + /** Creates a list buffer as builder for this class */ + override protected[this] def newBuilder = NodeSeq.newBuilder +} + +trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => + override def stringPrefix: String = "NodeBuffer" +} diff --git a/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala b/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala new file mode 100644 index 000000000..6b66691c5 --- /dev/null +++ b/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala @@ -0,0 +1,27 @@ +package scala.xml + +import scala.collection.immutable.StrictOptimizedSeqOps +import scala.collection.{SeqOps, immutable, mutable} +import scala.collection.BuildFrom +import scala.collection.mutable.Builder + +object ScalaVersionSpecific { + import NodeSeq.Coll + type CBF[-From, -A, +C] = BuildFrom[From, A, C] + object NodeSeqCBF extends BuildFrom[Coll, Node, NodeSeq] { + def newBuilder(from: Coll): Builder[Node, NodeSeq] = NodeSeq.newBuilder + def fromSpecificIterable(from: Coll)(it: Iterable[Node]): NodeSeq = (NodeSeq.newBuilder ++= from).result() + } +} + +trait ScalaVersionSpecificNodeSeq + extends SeqOps[Node, immutable.Seq, NodeSeq] + with StrictOptimizedSeqOps[Node, immutable.Seq, NodeSeq] { self: NodeSeq => + override def fromSpecificIterable(coll: Iterable[Node]): NodeSeq = (NodeSeq.newBuilder ++= coll).result() + + override def newSpecificBuilder(): mutable.Builder[Node, NodeSeq] = NodeSeq.newBuilder +} + +trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => + override def className: String = "NodeBuffer" +} diff --git a/shared/src/main/scala/scala/xml/NodeBuffer.scala b/shared/src/main/scala/scala/xml/NodeBuffer.scala index 84692b264..2b0a0c851 100644 --- a/shared/src/main/scala/scala/xml/NodeBuffer.scala +++ b/shared/src/main/scala/scala/xml/NodeBuffer.scala @@ -19,10 +19,7 @@ package xml * * @author Burak Emir */ -class NodeBuffer extends scala.collection.mutable.ArrayBuffer[Node] { - - override def stringPrefix: String = "NodeBuffer" - +class NodeBuffer extends scala.collection.mutable.ArrayBuffer[Node] with ScalaVersionSpecificNodeBuffer { /** * Append given object to this buffer, returns reference on this * `NodeBuffer` for convenience. Some rules apply: diff --git a/shared/src/main/scala/scala/xml/NodeSeq.scala b/shared/src/main/scala/scala/xml/NodeSeq.scala index f93c6249e..97b2ddf2a 100644 --- a/shared/src/main/scala/scala/xml/NodeSeq.scala +++ b/shared/src/main/scala/scala/xml/NodeSeq.scala @@ -9,9 +9,9 @@ package scala package xml -import scala.collection.{ mutable, immutable, generic, SeqLike, AbstractSeq } +import scala.collection.{ mutable, immutable, AbstractSeq } import mutable.{ Builder, ListBuffer } -import generic.{ CanBuildFrom } +import ScalaVersionSpecific.CBF import scala.language.implicitConversions import scala.collection.Seq @@ -25,12 +25,15 @@ object NodeSeq { def fromSeq(s: Seq[Node]): NodeSeq = new NodeSeq { def theSeq = s } + + // --- + // For 2.11 / 2.12 only. Moving the implicit to a parent trait of `object NodeSeq` and keeping it + // in ScalaVersionSpecific doesn't work because the implicit becomes less specific, which leads to + // ambiguities. type Coll = NodeSeq - implicit def canBuildFrom: CanBuildFrom[Coll, Node, NodeSeq] = - new CanBuildFrom[Coll, Node, NodeSeq] { - def apply(from: Coll) = newBuilder - def apply() = newBuilder - } + implicit def canBuildFrom: CBF[Coll, Node, NodeSeq] = ScalaVersionSpecific.NodeSeqCBF + // --- + def newBuilder: Builder[Node, NodeSeq] = new ListBuffer[Node] mapResult fromSeq implicit def seqToNodeSeq(s: Seq[Node]): NodeSeq = fromSeq(s) } @@ -41,11 +44,7 @@ object NodeSeq { * * @author Burak Emir */ -abstract class NodeSeq extends AbstractSeq[Node] with immutable.Seq[Node] with SeqLike[Node, NodeSeq] with Equality with Serializable { - - /** Creates a list buffer as builder for this class */ - override protected[this] def newBuilder = NodeSeq.newBuilder - +abstract class NodeSeq extends AbstractSeq[Node] with immutable.Seq[Node] with ScalaVersionSpecificNodeSeq with Equality with Serializable { def theSeq: Seq[Node] def length = theSeq.length override def iterator = theSeq.iterator From d5f4d920d82e795e05863d856a86464503c6a0b5 Mon Sep 17 00:00:00 2001 From: "Aaron S. Hawley" Date: Wed, 16 May 2018 10:31:46 -0600 Subject: [PATCH 2/3] Use scala 2.13.0-M4 milestone release --- .travis.yml | 6 +++--- README.md | 2 +- build.sbt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8737e6bdd..2a5a17aa3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ jdk: scala: - 2.11.12 - 2.12.6 - - 2.13.0-M3 + - 2.13.0-M4 env: global: @@ -30,13 +30,13 @@ env: matrix: exclude: - - scala: 2.13.0-M3 + - scala: 2.13.0-M4 env: SCALAJS_VERSION=1.0.0-M3 - jdk: oraclejdk9 env: SCALAJS_VERSION=1.0.0-M3 - scala: 2.12.6 jdk: openjdk6 - - scala: 2.13.0-M3 + - scala: 2.13.0-M4 jdk: openjdk6 script: admin/build.sh diff --git a/README.md b/README.md index 33fd765c1..8a5033aab 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ scala-xml [![Travis](https://img.shields.io/travis/scala/scala-xml.svg)](https://travis-ci.org/scala/scala-xml) [![latest release for 2.11](https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-xml_2.11.svg?label=scala+2.11)](http://mvnrepository.com/artifact/org.scala-lang.modules/scala-xml_2.11) [![latest release for 2.12](https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-xml_2.12.svg?label=scala+2.12)](http://mvnrepository.com/artifact/org.scala-lang.modules/scala-xml_2.12) -[![latest release for 2.13.0-M3](https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-xml_2.13.0-M3.svg?label=scala+2.13.0-M3)](http://mvnrepository.com/artifact/org.scala-lang.modules/scala-xml_2.13.0-M3) +[![latest release for 2.13.0-M4](https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-xml_2.13.0-M4.svg?label=scala+2.13.0-M4)](http://mvnrepository.com/artifact/org.scala-lang.modules/scala-xml_2.13.0-M4) [![Gitter](https://badges.gitter.im/Join+Chat.svg)](https://gitter.im/scala/scala-xml) ========= diff --git a/build.sbt b/build.sbt index dd1ffe845..16a3b7b14 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,7 @@ import sbtcrossproject.{crossProject, CrossType} import ScalaModulePlugin._ -crossScalaVersions in ThisBuild := List("2.12.6", "2.11.12", "2.13.0-M3") +crossScalaVersions in ThisBuild := List("2.12.6", "2.11.12", "2.13.0-M4") lazy val xml = crossProject(JSPlatform, JVMPlatform) .withoutSuffixFor(JVMPlatform) @@ -27,7 +27,7 @@ lazy val xml = crossProject(JSPlatform, JVMPlatform) (unmanagedSourceDirectories in Compile).value.map { dir => val sv = scalaVersion.value CrossVersion.partialVersion(sv) match { - case Some((2, 13)) if !sv.startsWith("2.13.0-M3") => file(dir.getPath ++ "-2.13") // TODO: remove M3 guard once M4 is out. + case Some((2, 13)) => file(dir.getPath ++ "-2.13") case _ => file(dir.getPath ++ "-2.11-2.12") } } From 33e5c85aec852205e7b96f2a3cb43745c53f8012 Mon Sep 17 00:00:00 2001 From: Lukas Rytz Date: Fri, 18 May 2018 22:03:54 +0200 Subject: [PATCH 3/3] Make ScalaVersionSpecific non-public --- .../scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala | 6 +++--- .../main/scala-2.13/scala/xml/ScalaVersionSpecific.scala | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala b/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala index eee27f621..417a3bcc6 100644 --- a/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala +++ b/shared/src/main/scala-2.11-2.12/scala/xml/ScalaVersionSpecific.scala @@ -3,7 +3,7 @@ package scala.xml import scala.collection.SeqLike import scala.collection.generic.CanBuildFrom -object ScalaVersionSpecific { +private[xml] object ScalaVersionSpecific { import NodeSeq.Coll type CBF[-From, -A, +C] = CanBuildFrom[From, A, C] object NodeSeqCBF extends CanBuildFrom[Coll, Node, NodeSeq] { @@ -12,11 +12,11 @@ object ScalaVersionSpecific { } } -trait ScalaVersionSpecificNodeSeq extends SeqLike[Node, NodeSeq] { self: NodeSeq => +private[xml] trait ScalaVersionSpecificNodeSeq extends SeqLike[Node, NodeSeq] { self: NodeSeq => /** Creates a list buffer as builder for this class */ override protected[this] def newBuilder = NodeSeq.newBuilder } -trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => +private[xml] trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => override def stringPrefix: String = "NodeBuffer" } diff --git a/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala b/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala index 6b66691c5..fb256ba60 100644 --- a/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala +++ b/shared/src/main/scala-2.13/scala/xml/ScalaVersionSpecific.scala @@ -5,7 +5,7 @@ import scala.collection.{SeqOps, immutable, mutable} import scala.collection.BuildFrom import scala.collection.mutable.Builder -object ScalaVersionSpecific { +private[xml] object ScalaVersionSpecific { import NodeSeq.Coll type CBF[-From, -A, +C] = BuildFrom[From, A, C] object NodeSeqCBF extends BuildFrom[Coll, Node, NodeSeq] { @@ -14,14 +14,13 @@ object ScalaVersionSpecific { } } -trait ScalaVersionSpecificNodeSeq +private[xml] trait ScalaVersionSpecificNodeSeq extends SeqOps[Node, immutable.Seq, NodeSeq] with StrictOptimizedSeqOps[Node, immutable.Seq, NodeSeq] { self: NodeSeq => override def fromSpecificIterable(coll: Iterable[Node]): NodeSeq = (NodeSeq.newBuilder ++= coll).result() - - override def newSpecificBuilder(): mutable.Builder[Node, NodeSeq] = NodeSeq.newBuilder + override def newSpecificBuilder: mutable.Builder[Node, NodeSeq] = NodeSeq.newBuilder } -trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => +private[xml] trait ScalaVersionSpecificNodeBuffer { self: NodeBuffer => override def className: String = "NodeBuffer" }