Skip to content

Commit

Permalink
Incorporate Scala 3 binary bridge to scripted
Browse files Browse the repository at this point in the history
**Problem**
Scala 3.x and 2.13.x have seceded their compiler brides
from this repository, which means that when we make
changes to Zinc they will no longer be changed in sync.

**Solution**
1. As an awareness campaign this adds scripted test against
   Scala 3.3.1 compiler bridge. Same test fails for Scala 3.4.1.
2. Also as a small quality of life improvement for Zinc
   maintainers, this implements "2.13.x" notation for
   Scala versions, so we don't have to constantly update the
   scripted tests when we update the Scala patch version.
  • Loading branch information
eed3si9n committed Apr 21, 2024
1 parent ae1ec3c commit 46d2131
Show file tree
Hide file tree
Showing 72 changed files with 260 additions and 78 deletions.
35 changes: 34 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,23 @@ lazy val zinc = (projectMatrix in (zincRootPath / "zinc"))
BuildInfoKey.map(compilerBridge213 / scalaVersion)("scalaVersion213" -> _._2),
BuildInfoKey.map(compilerBridge213 / scalaInstance)("scalaJars213" -> _._2.allJars.toList),
BuildInfoKey.map(compilerBridge213 / Compile / classDirectory)("classDirectory213" -> _._2),
BuildInfoKey.map(compilerBridgeScala213Bin / scalaVersion)("scalaVersion213Bin" -> _._2),
BuildInfoKey.map(compilerBridgeScala213Bin / scalaInstance)(
"scalaJars213Bin" -> _._2.allJars.toList
),
BuildInfoKey.map(compilerBridgeScala213Bin / Compile / externalDependencyClasspath)(
"compilerBridge213Bin" -> _._2.toList.head.data
),
BuildInfoKey.map(compilerBridgeScala3Bin / scalaVersion)("scalaVersion3Bin" -> _._2),
BuildInfoKey.map(compilerBridgeScala3Bin / scalaInstance)(
"scalaJars3Bin" -> _._2.allJars.toList
),
BuildInfoKey.map(compilerBridgeScala3Bin / Compile / externalDependencyClasspath)(
"compilerBridge3Bin" -> _._2.toList.head.data
),
BuildInfoKey.map(compilerInterface.jvm(false) / Compile / packageBin)(
"compilerInterface" -> _._2
),
),
Test / classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.Flat,
// so we have full access to com.sun.tools.javac on JDK 17
Expand Down Expand Up @@ -516,12 +533,28 @@ lazy val compilerBridge = (projectMatrix in internalPath / "compiler-bridge")
}.toList),
)
.defaultAxes(VirtualAxis.jvm)
.jvmPlatform(scalaVersions = allScalaVersions)
.jvmPlatform(scalaVersions = compilerBridgeVersions)

lazy val compilerBridge210 = compilerBridge.jvm(scala210)
lazy val compilerBridge211 = compilerBridge.jvm(scala211)
lazy val compilerBridge212 = compilerBridge.jvm(scala212)
lazy val compilerBridge213 = compilerBridge.jvm(scala213)
lazy val compilerBridgeScala213Bin = (project in internalPath / "compilerBridgeScala213Bin")
.settings(
name := "compilerBridgeScala213Bin",
publish / skip := true,
autoScalaLibrary := false,
scalaVersion := scala213,
libraryDependencies += scala2BinaryBridge,
)
lazy val compilerBridgeScala3Bin = (project in internalPath / "compilerBridgeScala3Bin")
.settings(
name := "compilerBridgeScala3Bin",
publish / skip := true,
autoScalaLibrary := false,
scalaVersion := scala3ForBridge,
libraryDependencies += scala3BinaryBridge,
)

/**
* Tests for the compiler bridge.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,10 +311,10 @@ final class AnalyzingCompiler(

// see https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
private def loadService[A](cls: Class[A], loader: ClassLoader): Option[A] = {
import scala.collection.JavaConverters._
val sl = ServiceLoader.load(cls, loader)
val it = sl.iterator
if (it.hasNext) Some(it.next)
else None
val list = sl.iterator.asScala.toList
list.lastOption
}

private def bridgeInstance(bridgeClassName: String, loader: ClassLoader): (AnyRef, Class[?]) = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class IncHandler(directory: Path, cacheDir: Path, scriptedLog: ManagedLogger, co
val build = initBuild
build.projects.foreach { p =>
val in: Path = p.in.getOrElse(directory / p.name)
val version = p.scalaVersion.getOrElse(scala.util.Properties.versionNumberString)
val version = switchScalaVersion(p.scalaVersion)
val deps = p.dependsOn.toVector.flatten
val project = ProjectStructure(
p.name,
Expand Down
6 changes: 5 additions & 1 deletion project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ object Dependencies {
val scala211 = "2.11.12"
val scala212 = "2.12.19"
val scala213 = "2.13.13"
val scala3ForBridge = "3.3.1"
val scala213ForBridge = "2.13.13"
val defaultScalaVersion = scala212
val allScalaVersions = Seq(defaultScalaVersion, scala210, scala211, scala213)
val compilerBridgeVersions = Seq(scala212, scala210, scala211, scala213)
val scala212_213 = Seq(defaultScalaVersion, scala213)

private val ioVersion = nightlyVersion.getOrElse("1.9.9")
Expand Down Expand Up @@ -83,6 +85,8 @@ object Dependencies {
"com.eed3si9n" %% "sjson-new-scalajson" % contrabandSjsonNewVersion.value
}
val zeroAllocationHashing = "net.openhft" % "zero-allocation-hashing" % "0.16"
val scala2BinaryBridge = "org.scala-lang" % "scala2-sbt-bridge" % scala213ForBridge
val scala3BinaryBridge = "org.scala-lang" % "scala3-sbt-bridge" % scala3ForBridge

def addTestDependencies(p: Project): Project =
p.settings(
Expand Down
4 changes: 2 additions & 2 deletions zinc/src/sbt-test/macros/macro-arg-dep-nested/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"macro-provider"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macro-provider",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"macro-provider"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macro-provider",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
4 changes: 2 additions & 2 deletions zinc/src/sbt-test/macros/macro-arg-dep/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"macro-provider"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macro-provider",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
6 changes: 3 additions & 3 deletions zinc/src/sbt-test/macros/macro-type-change-2/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
"macros",
"A"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macros",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "A",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
6 changes: 3 additions & 3 deletions zinc/src/sbt-test/macros/macro-type-change-3/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
"macros",
"A"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macros",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "A",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
6 changes: 3 additions & 3 deletions zinc/src/sbt-test/macros/macro-type-change-4/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
"macros",
"A"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macros",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "A",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
4 changes: 2 additions & 2 deletions zinc/src/sbt-test/macros/macro-type-change/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"macros"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macros",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
4 changes: 2 additions & 2 deletions zinc/src/sbt-test/macros/macro-use/build.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"projects": [
{ "name": "lib", "scalaVersion": "2.13.13" },
{ "name": "app", "scalaVersion": "2.13.13", "dependsOn": [ "lib" ] }
{ "name": "lib", "scalaVersion": "2.13.x" },
{ "name": "app", "scalaVersion": "2.13.x", "dependsOn": [ "lib" ] }
]
}
4 changes: 2 additions & 2 deletions zinc/src/sbt-test/macros/macro/build.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"macro-provider"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "macro-provider",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"dep"
],
"scalaVersion": "2.13.13"
"scalaVersion": "3.x"
},
{
"name": "dep",
"scalaVersion": "2.13.13"
"scalaVersion": "3.x"
}
]
}
11 changes: 11 additions & 0 deletions zinc/src/sbt-test/pipelining/subproject-pipelining-3/pending
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# done this way because last modified times often have ~1s resolution
> use/compile
$ sleep 1000

# This tests no-op compilation of dep
$ copy-file changes/B2.scala use/B.scala
> use/compile
$ sleep 1000

$ copy-file changes/Break.scala dep/A.scala
-> use/compile
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"dep"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "dep",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"dep"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "dep",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependsOn": [
"dep"
],
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
},
{
"name": "dep",
"scalaVersion": "2.13.13"
"scalaVersion": "2.13.x"
}
]
}
15 changes: 15 additions & 0 deletions zinc/src/sbt-test/pipelining/subproject-pipelining/build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"projects": [
{
"name": "use",
"dependsOn": [
"dep"
],
"scalaVersion": "2.13.x"
},
{
"name": "dep",
"scalaVersion": "2.13.x"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package example

object B {
val y = A.x
val z = 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package example

object Break
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package example

object A {
val x = 3
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pipelining = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package example

object B {
val y = A.x
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pipelining = true
12 changes: 12 additions & 0 deletions zinc/src/sbt-test/source-dependencies/binary-3/build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"projects": [
{
"name": "use",
"scalaVersion": "3.x"
},
{
"name": "dep",
"scalaVersion": "3.x"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
object Break
3 changes: 3 additions & 0 deletions zinc/src/sbt-test/source-dependencies/binary-3/dep/A.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
object A {
val x = 3
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pipelining = false
14 changes: 14 additions & 0 deletions zinc/src/sbt-test/source-dependencies/binary-3/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
> dep/compile

> dep/package
$ copy-file dep/target/dep.jar use/lib/dep.jar

# done this way because last modified times often have ~1s resolution
> use/compile
$ sleep 2000

$ copy-file changes/Break.scala dep/A.scala
> dep/package
$ copy-file dep/target/dep.jar use/lib/dep.jar

-> use/compile

0 comments on commit 46d2131

Please sign in to comment.