From 28495795230a5a3690ef68820c6e8da7bc2daae4 Mon Sep 17 00:00:00 2001 From: rochala Date: Sat, 14 Sep 2024 17:53:14 +0200 Subject: [PATCH] Rebase + fixes to make code compile after rebasing --- .../com.olegych.scastie.api/ScalaTarget.scala | 360 ------------------ .../scala/org/scastie/api/ScalaTarget.scala | 6 +- .../org/scastie/api/SnippetProgress.scala | 1 - build.sbt | 2 +- .../client/components/VersionSelector.scala | 2 +- .../org/scastie/metals/MetalsDispatcher.scala | 7 +- .../org/scastie/metals/ScalaCliParser.scala | 4 +- .../org/scastie/metals/ScalaVersionUtil.scala | 2 +- project/SbtShared.scala | 20 +- .../scala/org/scastie/sbt/SbtActorTest.scala | 7 +- 10 files changed, 15 insertions(+), 396 deletions(-) delete mode 100644 api/src/main/scala/com.olegych.scastie.api/ScalaTarget.scala diff --git a/api/src/main/scala/com.olegych.scastie.api/ScalaTarget.scala b/api/src/main/scala/com.olegych.scastie.api/ScalaTarget.scala deleted file mode 100644 index c7e3f0340..000000000 --- a/api/src/main/scala/com.olegych.scastie.api/ScalaTarget.scala +++ /dev/null @@ -1,360 +0,0 @@ -package com.olegych.scastie.api - -import com.olegych.scastie.buildinfo.BuildInfo - -sealed trait ScalaTarget { - def scalaVersion: String - def targetType: ScalaTargetType - def scaladexRequest: Map[String, String] - def renderSbt(lib: ScalaDependency): String - def sbtConfig: String - def sbtPluginsConfig: String - def sbtRunCommand(worksheetMode: Boolean): String - - def runtimeDependency: Option[ScalaDependency] = - ScalaTarget.runtimeDependencyFrom(this) - - def hasWorksheetMode: Boolean = true - - protected def sbtConfigScalaVersion: String = - s"""scalaVersion := "$scalaVersion"""" - - protected def renderSbtDouble(lib: ScalaDependency): String = { - import lib._ - s""""$groupId" %% "$artifact" % "$version"""" - } - - protected def renderSbtCross(lib: ScalaDependency): String = { - import lib._ - s""""$groupId" %%% "$artifact" % "$version"""" - } - - def binaryScalaVersion: String = { - val digits = scalaVersion.split('.') - if (digits.head == "2") digits.init.mkString(".") - else digits.head - } - - def isJVMTarget = targetType == ScalaTargetType.Scala3 || targetType == ScalaTargetType.Scala2 -} - -object ScalaTarget { - import play.api.libs.json._ - - implicit object ScalaTargetFormat extends Format[ScalaTarget] { - private val formatJvm = Json.format[Jvm] - private val formatJs = Json.format[Js] - private val formatTypelevel = Json.format[Typelevel] - private val formatNative = Json.format[Native] - private val formatScala3: OFormat[Scala3] = { - // Scala3.dottyVersion has been renamed to Scala3.scalaVersion - // so we use the default write - // But when reading we check dotty version if scalaVersion is not defined - val reads = new Reads[Scala3] { - override def reads(json: JsValue): JsResult[Scala3] = json match { - case obj: JsObject => - val dict = obj.value - dict.get("scalaVersion").orElse(dict.get("dottyVersion")) match { - case Some(JsString(ver)) => JsSuccess(Scala3(ver)) - case _ => JsError(Seq()) - } - case _ => JsError(Seq()) - } - } - OFormat(reads, Json.writes[Scala3]) - } - - def writes(target: ScalaTarget): JsValue = { - target match { - case jvm: Jvm => - formatJvm.writes(jvm) ++ JsObject(Seq("tpe" -> JsString("Jvm"))) - case js: Js => - formatJs.writes(js) ++ JsObject(Seq("tpe" -> JsString("Js"))) - case typelevel: Typelevel => - formatTypelevel.writes(typelevel) ++ JsObject(Seq("tpe" -> JsString("Typelevel"))) - case native: Native => - formatNative.writes(native) ++ JsObject(Seq("tpe" -> JsString("Native"))) - case dotty: Scala3 => - formatScala3.writes(dotty) ++ JsObject(Seq("tpe" -> JsString("Scala3"))) - case scli: ScalaCli => JsObject(Seq("tpe" -> JsString("ScalaCli"))) - } - } - - def reads(json: JsValue): JsResult[ScalaTarget] = { - json match { - case obj: JsObject => - val vs = obj.value - vs.get("tpe").orElse(vs.get("$type")) match { - case Some(JsString(tpe)) => - tpe match { - case "Jvm" => formatJvm.reads(json) - case "Js" => formatJs.reads(json) - case "Typelevel" => formatTypelevel.reads(json) - case "Native" => formatNative.reads(json) - case "Scala3" | "Dotty" => formatScala3.reads(json) - case "ScalaCli" => JsSuccess(ScalaCli()) - case _ => JsError(Seq()) - } - case _ => JsError(Seq()) - } - case _ => JsError(Seq()) - } - } - } - - private def runtimeDependencyFrom(target: ScalaTarget): Option[ScalaDependency] = Some( - ScalaDependency( - BuildInfo.organization, - BuildInfo.runtimeProjectName, - target, - BuildInfo.versionRuntime - ) - ) - - def fromScalaVersion(version: String): Option[ScalaTarget] = { - if (version.startsWith("3")) { - if (version == "3") - Some(ScalaTarget.Scala3(BuildInfo.latest3)) - else - Some(ScalaTarget.Scala3(version)) - } else if (version.startsWith("2")) { - if (version == "2") - Some(ScalaTarget.Jvm(BuildInfo.latest213)) - else if (version == "2.13") - Some(ScalaTarget.Jvm(BuildInfo.latest213)) - else if (version == "2.12") - Some(ScalaTarget.Jvm(BuildInfo.latest212)) - else if (version == "2.11") - Some(ScalaTarget.Jvm(BuildInfo.latest211)) - else if (version == "2.10") - Some(ScalaTarget.Jvm(BuildInfo.latest210)) - else - Some(ScalaTarget.Jvm(version)) - } else - None - } - - object Jvm { - def default: ScalaTarget = ScalaTarget.Jvm(scalaVersion = BuildInfo.latest213) - } - - private def partialUnificationSbtPlugin = """addSbtPlugin("org.lyranthe.sbt" % "partial-unification" % "1.1.2")""" - private def hktScalacOptions(scalaVersion: String) = { - val (kpOrg, kpVersion, kpCross) = - if (scalaVersion == "2.13.0-M5") ("org.spire-math", "0.9.9", "binary") - else if (scalaVersion == "2.13.0-RC1") ("org.spire-math", "0.9.10", "binary") - else if (scalaVersion == "2.13.0-RC2") ("org.typelevel", "0.10.1", "binary") - else if (scalaVersion == "2.13.0-RC3") ("org.typelevel", "0.10.2", "binary") - else if (scalaVersion >= "2.13.0") ("org.typelevel", "0.13.3", "full") - else ("org.typelevel", "0.10.3", "binary") - val paradise = - if (scalaVersion.startsWith("2.10")) - """libraryDependencies += compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)""" - else "" - s"""|scalacOptions += "-language:higherKinds" - |addCompilerPlugin("${kpOrg}" %% "kind-projector" % "${kpVersion}" cross CrossVersion.${kpCross}) - |$paradise""".stripMargin - } - - case class Jvm(scalaVersion: String) extends ScalaTarget { - - def targetType: ScalaTargetType = - ScalaTargetType.Scala2 - - def scaladexRequest: Map[String, String] = - Map("target" -> "JVM", "scalaVersion" -> binaryScalaVersion) - - def renderSbt(lib: ScalaDependency): String = - renderSbtDouble(lib) - - def sbtConfig: String = { - val base = sbtConfigScalaVersion + "\n" + hktScalacOptions(scalaVersion) - if (scalaVersion.startsWith("2.13") || scalaVersion.startsWith("2.12")) - base + "\n" + "scalacOptions += \"-Ydelambdafy:inline\"" //workaround https://github.com/scala/bug/issues/10782 - else base - } - - def sbtPluginsConfig: String = partialUnificationSbtPlugin - - def sbtRunCommand(worksheetMode: Boolean): String = if (worksheetMode) "fgRunMain Main" else "fgRun" - - override def toString: String = s"Scala $scalaVersion" - } - - object Typelevel { - def default: ScalaTarget = - ScalaTarget.Typelevel(scalaVersion = "2.12.3-bin-typelevel-4") - } - - case class Typelevel(scalaVersion: String) extends ScalaTarget { - - def targetType: ScalaTargetType = - ScalaTargetType.Typelevel - - def scaladexRequest: Map[String, String] = - Map("target" -> "JVM", "scalaVersion" -> scalaVersion) - - def renderSbt(lib: ScalaDependency): String = - renderSbtDouble(lib) - - def sbtConfig: String = { - s"""|$sbtConfigScalaVersion - |ThisBuild / scalaOrganization := "org.typelevel"""".stripMargin - } - - def sbtPluginsConfig: String = "" - - def sbtRunCommand(worksheetMode: Boolean): String = if (worksheetMode) "fgRunMain Main" else "fgRun" - - override def toString: String = s"Typelevel $scalaVersion" - } - - object Js { - val targetFilename = "fastopt.js" - val sourceMapFilename: String = targetFilename + ".map" - val sourceFilename = "main.scala" - val sourceUUID = "file:///tmp/LxvjvKARSa2U5ctNis9LIA" - - def default = ScalaTarget.Js( - scalaVersion = BuildInfo.jsScalaVersion, - scalaJsVersion = BuildInfo.defaultScalaJsVersion - ) - } - - case class Js(scalaVersion: String, scalaJsVersion: String) extends ScalaTarget { - - def targetType: ScalaTargetType = - ScalaTargetType.JS - - def scaladexRequest: Map[String, String] = Map( - "target" -> "JS", - "scalaVersion" -> binaryScalaVersion, - "scalaJsVersion" -> (if (scalaJsVersion.startsWith("0.")) scalaJsVersion.split('.').init.mkString(".") - else scalaJsVersion.split('.').head) - ) - - def renderSbt(lib: ScalaDependency): String = - s"${renderSbtCross(lib)} cross CrossVersion.for3Use2_13" - - def sbtConfig: String = { - s"""|$sbtConfigScalaVersion - |${if (scalaVersion.startsWith("3")) "" else hktScalacOptions(scalaVersion)} - |enablePlugins(ScalaJSPlugin) - |Compile / fastOptJS / artifactPath := baseDirectory.value / "${ScalaTarget.Js.targetFilename}" - |scalacOptions += { - | val from = (LocalRootProject / baseDirectory).value.toURI.toString - | val to = "${ScalaTarget.Js.sourceUUID}/" - | "-${if (scalaVersion.startsWith("3")) "scalajs-mapSourceURI" else "P:scalajs:mapSourceURI"}:" + from + "->" + to - |}""".stripMargin - } - - def sbtPluginsConfig: String = - s"""addSbtPlugin("org.scala-js" % "sbt-scalajs" % "$scalaJsVersion")""" + "\n" + - (if (!scalaVersion.startsWith("3")) partialUnificationSbtPlugin else "") - - def sbtRunCommand(worksheetMode: Boolean): String = "fastOptJS" - - override def toString: String = s"Scala.Js $scalaVersion $scalaJsVersion" - } - - object Native { - def default: Native = - ScalaTarget.Native( - scalaVersion = "2.11.11", - scalaNativeVersion = "0.3.3" - ) - } - - case class Native(scalaVersion: String, scalaNativeVersion: String) extends ScalaTarget { - - def targetType: ScalaTargetType = - ScalaTargetType.Native - - def scaladexRequest: Map[String, String] = - Map( - "target" -> "NATIVE", - "scalaVersion" -> binaryScalaVersion, - "scalaNativeVersion" -> scalaNativeVersion - ) - - def renderSbt(lib: ScalaDependency): String = - renderSbtCross(lib) - - def sbtConfig: String = sbtConfigScalaVersion - - def sbtPluginsConfig: String = - s"""addSbtPlugin("org.scala-native" % "sbt-scala-native" % "$scalaNativeVersion")""" - - def sbtRunCommand(worksheetMode: Boolean): String = if (worksheetMode) "fgRunMain Main" else "fgRun" - - override def toString: String = - s"Scala-Native $scalaVersion $scalaNativeVersion" - } - - object Scala3 { - def default: ScalaTarget = Scala3(BuildInfo.stableLTS) - - def defaultCode: String = - """|// You can find more examples here: - |// https://github.com/lampepfl/dotty-example-project - |println("Hi Scala 3!") - |""".stripMargin - } - - case class Scala3(scalaVersion: String) extends ScalaTarget { - def targetType: ScalaTargetType = - ScalaTargetType.Scala3 - - def scaladexRequest: Map[String, String] = - Map("target" -> "JVM", "scalaVersion" -> binaryScalaVersion) - - def renderSbt(lib: ScalaDependency): String = { - if (Some(lib) == runtimeDependency) renderSbtDouble(lib) - else if (lib.target.binaryScalaVersion.startsWith("2.13")) - s"${renderSbtDouble(lib)} cross CrossVersion.for3Use2_13" - else renderSbtDouble(lib) - } - - def sbtConfig: String = sbtConfigScalaVersion - - def sbtPluginsConfig: String = "" - - def sbtRunCommand(worksheetMode: Boolean): String = if (worksheetMode) "fgRunMain Main" else "fgRun" - - override def toString: String = - s"Scala $scalaVersion" - } - - object ScalaCli { - def default: ScalaTarget = ScalaCli() - - def defaultCode: String = - """|// Hello! - |// Scastie is compatible with Scala CLI! You can use - |// directives: https://scala-cli.virtuslab.org/docs/guides/using-directives/ - | - |println("Hi Scala CLI <3") - """.stripMargin - } - - case class ScalaCli(scalaBinaryVersion0: String = "") extends ScalaTarget { - override def binaryScalaVersion: String = scalaBinaryVersion0 - - override def scalaVersion: String = "" - - override def targetType: ScalaTargetType = ScalaTargetType.ScalaCli - - override def scaladexRequest: Map[String,String] = - Map("target" -> "JVM") - - override def renderSbt(lib: ScalaDependency): String = "// Non-applicable" - - override def sbtConfig: String = "// Non-applicable" - - override def sbtPluginsConfig: String = "// Non-applicable" - - override def sbtRunCommand(worksheetMode: Boolean): String = ??? - - override def toString: String = "Scala-CLI" - } -} diff --git a/api/src/main/scala/org/scastie/api/ScalaTarget.scala b/api/src/main/scala/org/scastie/api/ScalaTarget.scala index a1d65261c..56559187d 100644 --- a/api/src/main/scala/org/scastie/api/ScalaTarget.scala +++ b/api/src/main/scala/org/scastie/api/ScalaTarget.scala @@ -199,7 +199,7 @@ case class Native(scalaVersion: String, scalaNativeVersion: String) extends SbtS } object Scala3 { - def default: Scala3 = Scala3(BuildInfo.stable3) + def default: Scala3 = Scala3(BuildInfo.stableNext) def defaultCode: String = """|// You can find more examples here: @@ -213,7 +213,7 @@ object Scala3 { case class Scala3(scalaVersion: String) extends SbtScalaTarget { - val targetType: ScalaTargetType = ScalaTargetType.stableLTS + val targetType: ScalaTargetType = ScalaTargetType.Scala3 def scaladexRequest: Map[String, String] = Map("target" -> "JVM", "scalaVersion" -> binaryScalaVersion) @@ -266,7 +266,7 @@ object ScalaCli { implicit val scalaCliEncoder: Encoder[ScalaCli] = deriveEncoder[ScalaCli] implicit val scalaCliDecoder: Decoder[ScalaCli] = deriveDecoder[ScalaCli] - def default: ScalaCli = ScalaCli(BuildInfo.latest3) + def default: ScalaCli = ScalaCli(BuildInfo.stableNext) def defaultCode: String = """|// Hello! diff --git a/api/src/main/scala/org/scastie/api/SnippetProgress.scala b/api/src/main/scala/org/scastie/api/SnippetProgress.scala index e3d7391b8..4c1de28eb 100644 --- a/api/src/main/scala/org/scastie/api/SnippetProgress.scala +++ b/api/src/main/scala/org/scastie/api/SnippetProgress.scala @@ -4,7 +4,6 @@ import io.circe.generic.semiauto._ import io.circe._ import io.circe.syntax._ import org.scastie.runtime.api._ -import org.scastie.api.Error import RuntimeCodecs._ object SnippetProgress { diff --git a/build.sbt b/build.sbt index 5e82fd4e9..0568e62f9 100644 --- a/build.sbt +++ b/build.sbt @@ -142,7 +142,7 @@ lazy val metalsRunner = project ) ) .enablePlugins(JavaServerAppPackaging, sbtdocker.DockerPlugin) - .dependsOn(api.jvm(ScalaVersions.latest3)) + .dependsOn(api.jvm(ScalaVersions.stableNext)) lazy val sbtRunner = project .in(file("sbt-runner")) diff --git a/client/src/main/scala/org/scastie/client/components/VersionSelector.scala b/client/src/main/scala/org/scastie/client/components/VersionSelector.scala index cb794ab5c..563e3b8c9 100644 --- a/client/src/main/scala/org/scastie/client/components/VersionSelector.scala +++ b/client/src/main/scala/org/scastie/client/components/VersionSelector.scala @@ -4,7 +4,7 @@ import org.scastie.api._ import japgolly.scalajs.react._ import vdom.all._ -import com.olegych.scastie.buildinfo.BuildInfo +import org.scastie.buildinfo.BuildInfo case class VersionSelector(scalaTarget: SbtScalaTarget, onChange: ScalaTarget ~=> Callback) { @inline def render: VdomElement = VersionSelector.versionSelectorHook(this) diff --git a/metals-runner/src/main/scala/org/scastie/metals/MetalsDispatcher.scala b/metals-runner/src/main/scala/org/scastie/metals/MetalsDispatcher.scala index db0dd4e48..0bae082cd 100644 --- a/metals-runner/src/main/scala/org/scastie/metals/MetalsDispatcher.scala +++ b/metals-runner/src/main/scala/org/scastie/metals/MetalsDispatcher.scala @@ -22,6 +22,7 @@ import org.scastie.api.ScalaTarget._ import coursierapi.{Dependency, Fetch} import org.slf4j.LoggerFactory import scala.concurrent.ExecutionContext +import com.typesafe.config.ConfigFactory /* * MetalsDispatcher is responsible for managing the lifecycle of presentation compilers. @@ -69,10 +70,8 @@ class MetalsDispatcher[F[_]: Async](cache: Cache[F, ScastieMetalsOptions, Scasti * @param configuration - scastie client configuration * @returns `EitherT[F, FailureType, ScastiePresentationCompiler]` */ - def getCompiler(configuration: ScastieMetalsOptions): EitherT[F, FailureType, ScastiePresentationCompiler] = - if (configuration.scalaTarget.targetType == ScalaTargetType.ScalaCli) then - convertConfigurationFromScalaCli(configuration).flatMap(getCompiler(_)) - else EitherT: + def getCompiler(configuration: ScastieMetalsOptions): EitherT[F, FailureType, ScastiePresentationCompiler] = + EitherT: if !isSupportedVersion(configuration) then Async[F].delay( PresentationCompilerFailure( diff --git a/metals-runner/src/main/scala/org/scastie/metals/ScalaCliParser.scala b/metals-runner/src/main/scala/org/scastie/metals/ScalaCliParser.scala index 01723a99e..23466ca0c 100644 --- a/metals-runner/src/main/scala/org/scastie/metals/ScalaCliParser.scala +++ b/metals-runner/src/main/scala/org/scastie/metals/ScalaCliParser.scala @@ -76,7 +76,7 @@ object ScalaCliParser: case versionString => ScalaVersionUtil.validateStable(versionString, cache, repositories) } - case None => BuildInfo.stable3.asRight + case None => BuildInfo.latestNext.asRight } val maybeToolkitVersion = directiveMap.get("toolkit").map(_.headOption).flatten.map { @@ -90,7 +90,7 @@ object ScalaCliParser: val dependenciesDirectives = (directiveMap.get("dep") ++ directiveMap.get("lib")).flatten val toolkitDependency = maybeToolkitVersion.map(ScalaDependency("org.scala-lang", "toolkit", scalaTarget, _)) - // TODO add runtime lib + // TODO add runtime lib and scalac options val dependencies = dependenciesDirectives.map(_.split(":").toList).collect: // "groupId::artifact:version" diff --git a/metals-runner/src/main/scala/org/scastie/metals/ScalaVersionUtil.scala b/metals-runner/src/main/scala/org/scastie/metals/ScalaVersionUtil.scala index 15797b1c9..f338786c1 100644 --- a/metals-runner/src/main/scala/org/scastie/metals/ScalaVersionUtil.scala +++ b/metals-runner/src/main/scala/org/scastie/metals/ScalaVersionUtil.scala @@ -27,7 +27,7 @@ object ScalaVersionErrors { object ScalaVersionError { private lazy val defaultScalaVersions = - Seq(BuildInfo.latest212, BuildInfo.latest213, BuildInfo.latest3) + Seq(BuildInfo.latest212, BuildInfo.latest213, BuildInfo.latestLTS, BuildInfo.latestNext) lazy val getTheGeneralErrorInfo: String = s""" diff --git a/project/SbtShared.scala b/project/SbtShared.scala index 0437eb53d..8d45df693 100644 --- a/project/SbtShared.scala +++ b/project/SbtShared.scala @@ -18,7 +18,6 @@ configuration matrix object SbtShared { object ScalaVersions { -<<<<<<< HEAD val latest210 = "2.10.7" val latest211 = "2.11.12" val latest212 = "2.12.20" @@ -31,22 +30,9 @@ object SbtShared { val js = latest213 val sbt = latest212 val jvm = latest213 - val cross = List(latest210, latest211, latest212, latest213, old3, js, sbt, jvm).distinct + val cross = + List(latest210, latest211, latest212, latest213, old3, stableLTS, stableNext, js, sbt, jvm).distinct val crossJS = List(latest212, latest213, js).distinct -======= - val latest210 = "2.10.7" - val latest211 = "2.11.12" - val latest212 = "2.12.18" - val latest213 = "2.13.12" - val old3 = "3.0.2" - val stable3 = "3.3.1" - val latest3 = "3.3.2-RC1" - val js = latest213 - val sbt = latest212 - val jvm = latest213 - val cross = List(latest210, latest211, latest212, latest213, old3, stable3, js, sbt, jvm).distinct - val crossJS = List(latest212, latest213, js).distinct ->>>>>>> 8a09c1b7 (initial changes) } object ScalaJSVersions { @@ -138,7 +124,7 @@ object SbtShared { lazy val api = projectMatrix .in(file("api")) .settings(apiSettings) - .jvmPlatform(Seq(ScalaVersions.jvm, ScalaVersions.latest3, ScalaVersions.sbt)) + .jvmPlatform(Seq(ScalaVersions.jvm, ScalaVersions.stableLTS, ScalaVersions.stableNext, ScalaVersions.sbt)) .jsPlatform(Seq(ScalaVersions.js), baseJsSettings) .enablePlugins(BuildInfoPlugin) diff --git a/sbt-runner/src/test/scala/org/scastie/sbt/SbtActorTest.scala b/sbt-runner/src/test/scala/org/scastie/sbt/SbtActorTest.scala index b0cac867a..60912e850 100644 --- a/sbt-runner/src/test/scala/org/scastie/sbt/SbtActorTest.scala +++ b/sbt-runner/src/test/scala/org/scastie/sbt/SbtActorTest.scala @@ -123,13 +123,8 @@ class SbtActorTest() extends TestKit(ActorSystem("SbtActorTest")) with ImplicitS test("Scala.js 3 support") { val scalaJs = -<<<<<<< HEAD - Inputs.default.copy(code = "1 + 1", - target = ScalaTarget.Js.default.copy(scalaVersion = org.scastie.buildinfo.BuildInfo.latestLTS)) -======= SbtInputs.default.copy(code = "1 + 1", - target = Js.default.copy(scalaVersion = org.scastie.buildinfo.BuildInfo.latest3)) ->>>>>>> 4a20eb33 (make tests compile) + target = Js.default.copy(scalaVersion = org.scastie.buildinfo.BuildInfo.latestLTS)) run(scalaJs)(_.isDone) }