From 90f8a5cc1da35e3834978e7bd199d55818632352 Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Sun, 13 Mar 2022 11:39:19 +0000 Subject: [PATCH 1/3] Add Scala 3 to the build --- build.sbt | 29 ++++++++++++++++--- native/src/main/scala/trail/URI.scala | 5 ++-- project/build.properties | 2 +- project/plugins.sbt | 4 +-- shared/src/main/scala/trail/PathElement.scala | 12 ++++++-- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index acf8d04..b55b0b4 100644 --- a/build.sbt +++ b/build.sbt @@ -1,15 +1,16 @@ val Leaf = "0.1.0" val Scala2_11 = "2.11.12" -val Scala2_12 = "2.12.13" -val Scala2_13 = "2.13.4" -val ScalaTest = "3.2.4-M1" +val Scala2_12 = "2.12.15" +val Scala2_13 = "2.13.8" +val Scala3 = "3.1.1" +val ScalaTest = "3.2.11" val SharedSettings = Seq( name := "trail", organization := "tech.sparse", scalaVersion := Scala2_13, - crossScalaVersions := Seq(Scala2_13, Scala2_12, Scala2_11), + crossScalaVersions := Seq(Scala3, Scala2_13, Scala2_12, Scala2_11), scalacOptions := Seq( "-unchecked", "-deprecation", @@ -52,6 +53,20 @@ lazy val trail = crossProject(JSPlatform, JVMPlatform, NativePlatform) ) ) +lazy val trailNative = trail.native.settings( + // ScalaTest is not yet published for Scala 3 Native + libraryDependencies := { + val deps = libraryDependencies.value + + if(isScala3(scalaVersion.value)) + deps.filterNot(_.organization == "org.scalatest") + else deps + }, + Test / test := { + if(isScala3(scalaVersion.value)) {} else (Test / test).value + } +) + lazy val manual = project.in(file("manual")) .dependsOn(trail.jvm) .settings(SharedSettings) @@ -60,3 +75,9 @@ lazy val manual = project.in(file("manual")) publishArtifact := false, libraryDependencies += "tech.sparse" %% "leaf-notebook" % Leaf ) + +def isScala3(ver: String) = + CrossVersion.partialVersion(ver) match { + case Some((3, _)) => true + case _ => false + } diff --git a/native/src/main/scala/trail/URI.scala b/native/src/main/scala/trail/URI.scala index 496bf40..f00d114 100644 --- a/native/src/main/scala/trail/URI.scala +++ b/native/src/main/scala/trail/URI.scala @@ -25,7 +25,7 @@ object URI { if (c == '+') result.append(' ') else if (c == '%') { out.reset() - do { + while({ if (i + 2 >= s.length) throw new IllegalArgumentException("Incomplete % sequence at: " + i) val d1 = Character.digit(s.charAt(i + 1), 16) @@ -35,7 +35,8 @@ object URI { s"Invalid % sequence (${s.substring(i, i + 3)}) at: ${String.valueOf(i)}.") out.write(((d1 << 4) + d2).toByte) i += 3 - } while (i < s.length && s.charAt(i) == '%') + (i < s.length && s.charAt(i) == '%') + }) { } result.append(out.toString("UTF-8")) } else { result.append(c) diff --git a/project/build.properties b/project/build.properties index d91c272..c8fcab5 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.4.6 +sbt.version=1.6.2 diff --git a/project/plugins.sbt b/project/plugins.sbt index dfbeda3..d3405e6 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,5 +2,5 @@ logLevel := Level.Warn addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.0.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.3.1") -addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.9.0") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.4") diff --git a/shared/src/main/scala/trail/PathElement.scala b/shared/src/main/scala/trail/PathElement.scala index 5af4b18..c0890b0 100644 --- a/shared/src/main/scala/trail/PathElement.scala +++ b/shared/src/main/scala/trail/PathElement.scala @@ -1,6 +1,6 @@ package trail -case class Arg[T]()(implicit val codec: Codec[T]) { +class Arg[T]()(implicit val codec: Codec[T]) { override def equals(o: Any): Boolean = o match { case a: Arg[T] => a.codec.equals(codec) @@ -10,6 +10,10 @@ case class Arg[T]()(implicit val codec: Codec[T]) { override def hashCode(): Int = ("trail.Arg", codec).hashCode() } +object Arg { + def apply[T](implicit codec: Codec[T]) = new Arg() +} + case class Param[T](name: String)(implicit val codec: Codec[T]) { override def equals(o: Any): Boolean = o match { @@ -20,7 +24,7 @@ case class Param[T](name: String)(implicit val codec: Codec[T]) { override def hashCode(): Int = ("trail.Param", name, codec).hashCode() } -case class Fragment[T]()(implicit val codec: Codec[T]) { +class Fragment[T](implicit val codec: Codec[T]) { override def equals(o: Any): Boolean = o match { case f: Fragment[T] => f.codec.equals(codec) @@ -29,3 +33,7 @@ case class Fragment[T]()(implicit val codec: Codec[T]) { override def hashCode(): Int = ("trail.Fragment", codec).hashCode() } + +object Fragment { + def apply[T](implicit codec: Codec[T]) = new Fragment[T] +} From 8d916c0987c7446f87b270e94ff8bed4006c5ab8 Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Sun, 13 Mar 2022 11:41:39 +0000 Subject: [PATCH 2/3] Fix Scala.js build --- build.sbt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/build.sbt b/build.sbt index b55b0b4..6ab379e 100644 --- a/build.sbt +++ b/build.sbt @@ -11,11 +11,15 @@ val SharedSettings = Seq( scalaVersion := Scala2_13, crossScalaVersions := Seq(Scala3, Scala2_13, Scala2_12, Scala2_11), - scalacOptions := Seq( - "-unchecked", - "-deprecation", - "-encoding", "utf8" - ), + scalacOptions := { + // Preserve -scalajs flag used by Scala.js on Scala 3 + scalacOptions.value.filter(_ == "-scalajs") ++ + Seq( + "-unchecked", + "-deprecation", + "-encoding", "utf8" + ) + }, pomExtra := https://github.com/sparsetech/trail From c5310703e88753c83a012eb0f51ce50d5b1d6d5e Mon Sep 17 00:00:00 2001 From: Anton Sviridov Date: Wed, 4 May 2022 09:26:45 +0100 Subject: [PATCH 3/3] Reenable tests on Scala 3 Native --- build.sbt | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/build.sbt b/build.sbt index 6ab379e..8693f75 100644 --- a/build.sbt +++ b/build.sbt @@ -3,7 +3,7 @@ val Scala2_11 = "2.11.12" val Scala2_12 = "2.12.15" val Scala2_13 = "2.13.8" val Scala3 = "3.1.1" -val ScalaTest = "3.2.11" +val ScalaTest = "3.2.12" val SharedSettings = Seq( name := "trail", @@ -57,20 +57,6 @@ lazy val trail = crossProject(JSPlatform, JVMPlatform, NativePlatform) ) ) -lazy val trailNative = trail.native.settings( - // ScalaTest is not yet published for Scala 3 Native - libraryDependencies := { - val deps = libraryDependencies.value - - if(isScala3(scalaVersion.value)) - deps.filterNot(_.organization == "org.scalatest") - else deps - }, - Test / test := { - if(isScala3(scalaVersion.value)) {} else (Test / test).value - } -) - lazy val manual = project.in(file("manual")) .dependsOn(trail.jvm) .settings(SharedSettings)