mirror of https://github.com/sbt/sbt.git
Implement Scala 2.13-3.0 sandwich
Fixes https://github.com/sbt/sbt/issues/5369 Ref https://contributors.scala-lang.org/t/roadmap-for-the-tasty-reader-for-scala-2/4231 This implements support for inter-project dependencies between Scala 2.13 and Dotty, and vice versa. Scala 2.13 depending on Dotty would require 2.13.4 and above.
This commit is contained in:
parent
b09fd9d640
commit
f8139da192
|
|
@ -3450,14 +3450,38 @@ object Classpaths {
|
||||||
def deliverPattern(outputPath: File): String =
|
def deliverPattern(outputPath: File): String =
|
||||||
(outputPath / "[artifact]-[revision](-[classifier]).[ext]").absolutePath
|
(outputPath / "[artifact]-[revision](-[classifier]).[ext]").absolutePath
|
||||||
|
|
||||||
|
private[sbt] def isScala2Scala3Sandwich(sbv1: String, sbv2: String): Boolean = {
|
||||||
|
def compare(a: String, b: String): Boolean =
|
||||||
|
a == "2.13" && (b.startsWith("0.") || b.startsWith("3.0"))
|
||||||
|
compare(sbv1, sbv2) || compare(sbv2, sbv1)
|
||||||
|
}
|
||||||
|
|
||||||
def projectDependenciesTask: Initialize[Task[Seq[ModuleID]]] =
|
def projectDependenciesTask: Initialize[Task[Seq[ModuleID]]] =
|
||||||
Def.task {
|
Def.task {
|
||||||
|
val sbv = scalaBinaryVersion.value
|
||||||
val ref = thisProjectRef.value
|
val ref = thisProjectRef.value
|
||||||
val data = settingsData.value
|
val data = settingsData.value
|
||||||
val deps = buildDependencies.value
|
val deps = buildDependencies.value
|
||||||
deps.classpath(ref) flatMap { dep =>
|
deps.classpath(ref) flatMap { dep =>
|
||||||
(projectID in dep.project) get data map {
|
val depProjIdOpt = (dep.project / projectID).get(data)
|
||||||
_.withConfigurations(dep.configuration).withExplicitArtifacts(Vector.empty)
|
val depSVOpt = (dep.project / scalaVersion).get(data)
|
||||||
|
val depSBVOpt = (dep.project / scalaBinaryVersion).get(data)
|
||||||
|
val depCrossOpt = (dep.project / crossVersion).get(data)
|
||||||
|
(depProjIdOpt, depSVOpt, depSBVOpt, depCrossOpt) match {
|
||||||
|
case (Some(depProjId), Some(depSV), Some(depSBV), Some(depCross)) =>
|
||||||
|
if (sbv == depSBV || depCross != CrossVersion.binary)
|
||||||
|
Some(
|
||||||
|
depProjId.withConfigurations(dep.configuration).withExplicitArtifacts(Vector.empty)
|
||||||
|
)
|
||||||
|
else if (isScala2Scala3Sandwich(sbv, depSBV) && depCross == CrossVersion.binary)
|
||||||
|
Some(
|
||||||
|
depProjId
|
||||||
|
.withCrossVersion(CrossVersion.constant(depSBV))
|
||||||
|
.withConfigurations(dep.configuration)
|
||||||
|
.withExplicitArtifacts(Vector.empty)
|
||||||
|
)
|
||||||
|
else sys.error(s"scalaBinaryVersion mismatch: expected $sbv but found ${depSBV}")
|
||||||
|
case _ => None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
lazy val dottyVersion = "0.14.0-RC1"
|
ThisBuild / scalaVersion := "0.26.0-RC1"
|
||||||
|
|
||||||
lazy val plugin = project
|
lazy val plugin = project
|
||||||
.in(file("plugin"))
|
.in(file("plugin"))
|
||||||
|
|
@ -6,7 +6,6 @@ lazy val plugin = project
|
||||||
name := "dividezero",
|
name := "dividezero",
|
||||||
version := "0.0.1",
|
version := "0.0.1",
|
||||||
organization := "ch.epfl.lamp",
|
organization := "ch.epfl.lamp",
|
||||||
scalaVersion := dottyVersion,
|
|
||||||
|
|
||||||
scalacOptions ++= Seq(
|
scalacOptions ++= Seq(
|
||||||
"-language:implicitConversions"
|
"-language:implicitConversions"
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.3.1")
|
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.1")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package example
|
||||||
|
|
||||||
|
object D {
|
||||||
|
val x = C.x
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package example
|
||||||
|
|
||||||
|
object C {
|
||||||
|
val x = 1
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
ThisBuild / scalaVersion := "0.23.0"
|
||||||
|
|
||||||
|
ThisBuild / resolvers += "scala-integration" at "https://scala-ci.typesafe.com/artifactory/scala-integration/"
|
||||||
|
// TODO use 2.13.4 when it's out
|
||||||
|
lazy val scala213 = "2.13.4-bin-aeee8f0"
|
||||||
|
|
||||||
|
lazy val root = (project in file("."))
|
||||||
|
.aggregate(fooApp, fooCore, barApp, barCore)
|
||||||
|
|
||||||
|
lazy val fooApp = (project in file("foo-app"))
|
||||||
|
.dependsOn(fooCore)
|
||||||
|
|
||||||
|
lazy val fooCore = (project in file("foo-core"))
|
||||||
|
.settings(
|
||||||
|
scalaVersion := scala213
|
||||||
|
)
|
||||||
|
|
||||||
|
lazy val barApp = (project in file("bar-app"))
|
||||||
|
.dependsOn(barCore)
|
||||||
|
.settings(
|
||||||
|
scalaVersion := scala213
|
||||||
|
)
|
||||||
|
|
||||||
|
lazy val barCore = (project in file("bar-core"))
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package example
|
||||||
|
|
||||||
|
object B {
|
||||||
|
val x = A.x
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package example
|
||||||
|
|
||||||
|
object A {
|
||||||
|
val x = 1
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.1")
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
> fooApp/compile
|
||||||
|
|
||||||
|
> barApp/compile
|
||||||
|
|
@ -1 +1 @@
|
||||||
scalaVersion := "0.14.0-RC1"
|
ThisBuild / scalaVersion := "0.26.0-RC1"
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.3.1")
|
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.1")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue