From d9e43ecfdfac9ab2523803d77c7e07bd80a1d392 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 12 Jun 2022 23:11:28 -0400 Subject: [PATCH] Revert "Add support for scala-output-version flag in Scala 3" This reverts commit 1e89d713111fc48c11a1a102b4d70e4df0374078. --- main/src/main/scala/sbt/Defaults.scala | 80 ++----------- main/src/main/scala/sbt/Keys.scala | 6 +- .../scala/sbt/internal/ClassLoaders.scala | 4 +- .../build.sbt | 30 ----- .../scala-output-version-redundant-flags/test | 3 - .../scala-output-version/Bar.scala | 5 - .../scala-output-version/build.sbt | 112 ------------------ .../foo/src/main/scala-2.13/Foo.scala | 11 -- .../foo/src/main/scala-3/Foo.scala | 17 --- .../foo/src/test/scala-2.13/FooTest.scala | 7 -- .../foo/src/test/scala-3/FooTest.scala | 19 --- .../scala-output-version/test | 35 ------ 12 files changed, 12 insertions(+), 317 deletions(-) delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/build.sbt delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/test delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/Bar.scala delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/build.sbt delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-2.13/Foo.scala delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-3/Foo.scala delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-2.13/FooTest.scala delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-3/FooTest.scala delete mode 100644 sbt-app/src/sbt-test/dependency-management/scala-output-version/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 8f10c9dba..6e4746a53 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -677,15 +677,6 @@ object Defaults extends BuildCommon { else topLoader }, scalaInstance := scalaInstanceTask.value, - runtimeScalaInstance := Def.taskDyn { - scalaOutputVersion.?.value - .map { version => - scalaInstanceTask0(version = version, isRuntimeInstance = true) - } - .getOrElse { - scalaInstance - } - }.value, crossVersion := (if (crossPaths.value) CrossVersion.binary else CrossVersion.disabled), pluginCrossBuild / sbtBinaryVersion := binarySbtVersion( (pluginCrossBuild / sbtVersion).value @@ -984,49 +975,6 @@ object Defaults extends BuildCommon { old ++ Seq("-Wconf:cat=unused-nowarn:s", "-Xsource:3") else old }, - scalacOptions := { - val old = scalacOptions.value - - // 3 possible sources of Scala output version - val fromCompiler = CrossVersion - .partialVersion(scalaVersion.value) - .map { case (major, minor) => s"${major}.${minor}" } - .getOrElse( - sys.error(s"Wrong value of `scalaVersion`: ${scalaVersion.value}") - ) - - val maybeFromSetting = scalaOutputVersion.?.value.map { version => - CrossVersion - .partialVersion(version) - .map { case (major, minor) => s"${major}.${minor}" } - .getOrElse( - sys.error(s"Wrong value of `scalaOutputVersion`: ${version}") - ) - } - - val maybeFromFlags = old.zipWithIndex.flatMap { - case (opt, idx) => - if (opt.startsWith("-scala-output-version:")) - Some(opt.stripPrefix("-scala-output-version:")) - else if (opt == "-scala-output-version" && idx + 1 < old.length) - Some(old(idx + 1)) - else None - }.lastOption - - // Add -scala-output-version flag when minor Scala versions are different - // unless the flag is already set properly - maybeFromSetting match { - case Some(fromSetting) if fromSetting != fromCompiler => - maybeFromFlags match { - case Some(fromFlags) if fromFlags == fromSetting => - old - case _ => - old ++ Seq("-scala-output-version", fromSetting) - } - case _ => - old - } - }, persistJarClasspath :== true, classpathEntryDefinesClassVF := { (if (persistJarClasspath.value) classpathDefinesClassCache.value @@ -1137,19 +1085,13 @@ object Defaults extends BuildCommon { } def scalaInstanceTask: Initialize[Task[ScalaInstance]] = Def.taskDyn { - scalaInstanceTask0(scalaVersion.value, false) - } - - private def scalaInstanceTask0( - version: String, - isRuntimeInstance: Boolean - ): Initialize[Task[ScalaInstance]] = Def.taskDyn { // if this logic changes, ensure that `unmanagedScalaInstanceOnly` and `update` are changed // appropriately to avoid cycles scalaHome.value match { case Some(h) => scalaInstanceFromHome(h) case None => val scalaProvider = appConfiguration.value.provider.scalaProvider + val version = scalaVersion.value if (version == scalaProvider.version) // use the same class loader as the Scala classes used by sbt Def.task { val allJars = scalaProvider.jars @@ -1167,7 +1109,7 @@ object Defaults extends BuildCommon { case _ => ScalaInstance(version, scalaProvider) } } else - scalaInstanceFromUpdate0(isRuntimeInstance) + scalaInstanceFromUpdate } } @@ -1188,29 +1130,22 @@ object Defaults extends BuildCommon { pre + post } - def scalaInstanceFromUpdate: Initialize[Task[ScalaInstance]] = scalaInstanceFromUpdate0(false) - - private def scalaInstanceFromUpdate0( - isRuntimeInstance: Boolean - ): Initialize[Task[ScalaInstance]] = Def.task { + def scalaInstanceFromUpdate: Initialize[Task[ScalaInstance]] = Def.task { val sv = scalaVersion.value val fullReport = update.value val toolReport = fullReport .configuration(Configurations.ScalaTool) .getOrElse(sys.error(noToolConfiguration(managedScalaInstance.value))) - lazy val runtimeReport = fullReport.configuration(Configurations.Runtime).get - val libraryReport = if (isRuntimeInstance) runtimeReport else toolReport - def libraryFile(id: String): File = { + def file(id: String): File = { val files = for { - m <- libraryReport.modules if m.module.name.startsWith(id) + m <- toolReport.modules if m.module.name.startsWith(id) (art, file) <- m.artifacts if art.`type` == Artifact.DefaultType } yield file files.headOption getOrElse sys.error(s"Missing $id jar file") } - val libraryJars = ScalaArtifacts.libraryIds(sv).map(libraryFile) val allCompilerJars = toolReport.modules.flatMap(_.artifacts.map(_._2)) val allDocJars = fullReport @@ -1218,6 +1153,7 @@ object Defaults extends BuildCommon { .toSeq .flatMap(_.modules) .flatMap(_.artifacts.map(_._2)) + val libraryJars = ScalaArtifacts.libraryIds(sv).map(file) makeScalaInstance( sv, @@ -2096,7 +2032,7 @@ object Defaults extends BuildCommon { def runnerInit: Initialize[Task[ScalaRun]] = Def.task { val tmp = taskTemporaryDirectory.value val resolvedScope = resolvedScoped.value.scope - val si = runtimeScalaInstance.value + val si = scalaInstance.value val s = streams.value val opts = forkOptions.value val options = javaOptions.value @@ -3323,7 +3259,7 @@ object Classpaths { autoScalaLibrary.value && scalaHome.value.isEmpty && managedScalaInstance.value, sbtPlugin.value, scalaOrganization.value, - scalaOutputVersion.?.value.getOrElse(scalaVersion.value) + scalaVersion.value ), // Override the default to handle mixing in the sbtPlugin + scala dependencies. allDependencies := { diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index 68332cd13..392812271 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -186,11 +186,9 @@ object Keys { val compileOptions = taskKey[CompileOptions]("Collects basic options to configure compilers").withRank(DTask) val compileInputs = taskKey[Inputs]("Collects all inputs needed for compilation.").withRank(DTask) val scalaHome = settingKey[Option[File]]("If Some, defines the local Scala installation to use for compilation, running, and testing.").withRank(ASetting) - val scalaInstance = taskKey[ScalaInstance]("Defines the Scala instance to use for compilation").withRank(DTask) - val runtimeScalaInstance = taskKey[ScalaInstance]("Defines the Scala instance used at runtime (also for tests).").withRank(DTask) + val scalaInstance = taskKey[ScalaInstance]("Defines the Scala instance to use for compilation, running, and testing.").withRank(DTask) val scalaOrganization = settingKey[String]("Organization/group ID of the Scala used in the project. Default value is 'org.scala-lang'. This is an advanced setting used for clones of the Scala Language. It should be disregarded in standard use cases.").withRank(CSetting) - val scalaVersion = settingKey[String]("The version of Scala compiler used for building this project.").withRank(APlusSetting) - val scalaOutputVersion = settingKey[String]("The version of Scala standard library used for running this project and declared as its transitive dependency.").withRank(APlusSetting) + val scalaVersion = settingKey[String]("The version of Scala used for building.").withRank(APlusSetting) val scalaBinaryVersion = settingKey[String]("The Scala version substring describing binary compatibility.").withRank(BPlusSetting) val crossScalaVersions = settingKey[Seq[String]]("The versions of Scala used when cross-building.").withRank(BPlusSetting) val crossVersion = settingKey[CrossVersion]("Configures handling of the Scala version when cross-building.").withRank(CSetting) diff --git a/main/src/main/scala/sbt/internal/ClassLoaders.scala b/main/src/main/scala/sbt/internal/ClassLoaders.scala index 0275ae9dd..1c5df8aa0 100644 --- a/main/src/main/scala/sbt/internal/ClassLoaders.scala +++ b/main/src/main/scala/sbt/internal/ClassLoaders.scala @@ -35,7 +35,7 @@ private[sbt] object ClassLoaders { * Get the class loader for a test task. The configuration could be IntegrationTest or Test. */ private[sbt] def testTask: Def.Initialize[Task[ClassLoader]] = Def.task { - val si = runtimeScalaInstance.value + val si = scalaInstance.value val cp = fullClasspath.value.map(_.data) val dependencyStamps = modifiedTimes((dependencyClasspathFiles / outputFileStamps).value).toMap def getLm(f: File): Long = dependencyStamps.getOrElse(f, IO.getModifiedTimeOrZero(f)) @@ -64,7 +64,7 @@ private[sbt] object ClassLoaders { private[sbt] def runner: Def.Initialize[Task[ScalaRun]] = Def.taskDyn { val resolvedScope = resolvedScoped.value.scope - val instance = runtimeScalaInstance.value + val instance = scalaInstance.value val s = streams.value val opts = forkOptions.value val options = javaOptions.value diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/build.sbt b/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/build.sbt deleted file mode 100644 index e1bc21ae3..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/build.sbt +++ /dev/null @@ -1,30 +0,0 @@ -val checkOptions = taskKey[Unit]("") - -lazy val p1 = project - .settings( - scalaVersion := "3.0.2", - checkOptions := { - assert((Compile / scalacOptions).value == Seq()) - assert((Test / scalacOptions).value == Seq()) - } - ) - -lazy val p2 = project - .settings( - scalaVersion := "3.0.2", - scalaOutputVersion := "3.0.2", - checkOptions := { - assert((Compile / scalacOptions).value == Seq()) - assert((Test / scalacOptions).value == Seq()) - } - ) - -lazy val p3 = project - .settings( - scalaVersion := "3.1.2-RC2", - scalaOutputVersion := "3.0.2", - checkOptions := { - assert((Compile / scalacOptions).value == Seq("-scala-output-version", "3.0")) - assert((Test / scalacOptions).value == Seq("-scala-output-version", "3.0")) - } - ) diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/test b/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/test deleted file mode 100644 index 500721a31..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version-redundant-flags/test +++ /dev/null @@ -1,3 +0,0 @@ -> p1 / checkOptions -> p2 / checkOptions -> p3 / checkOptions \ No newline at end of file diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/Bar.scala b/sbt-app/src/sbt-test/dependency-management/scala-output-version/Bar.scala deleted file mode 100644 index 772478e95..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/Bar.scala +++ /dev/null @@ -1,5 +0,0 @@ -object Bar { - def main(args: Array[String]) = { - assert(foo.main.Foo.numbers == Seq(1, 2, 3)) - } -} diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/build.sbt b/sbt-app/src/sbt-test/dependency-management/scala-output-version/build.sbt deleted file mode 100644 index 78ad544f4..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/build.sbt +++ /dev/null @@ -1,112 +0,0 @@ -// cases 1, 2, 3: check for scala version in bar -// case a: check locally published Ivy dependency -// case b: check locally published Maven dependency -// case c: check unpublished sibling module dependency - -val org = "org.example" -val fooName = "sbt-test-scala-output-version-foo" -val revision = "0.0.1-SNAPSHOT" - -ThisBuild / organization := org -ThisBuild / version := revision - -lazy val foo = project.in(file("foo")) - .settings( - name := fooName, - scalaVersion := "3.1.2-RC2", - crossScalaVersions := List("2.13.8", "3.1.2-RC2"), - scalaOutputVersion := "3.0.2", - scalaOutputVersion := { - CrossVersion.partialVersion(scalaVersion.value) match { - case Some((3, _)) => "3.0.2" - case _ => scalaVersion.value - } - }, - libraryDependencies ++= Seq( - "org.scalameta" %% "munit" % "0.7.29" % Test - ), - TaskKey[Unit]("checkIvy") := { - val ivyFile = makeIvyXml.value - val ivyContent = IO.read(ivyFile) - val expectedContent = """""" - val hasCorrectStdlib = ivyContent.contains(expectedContent) - if (!hasCorrectStdlib) sys.error(s"The produced Ivy file is incorrect:\n\n${ivyContent}") - }, - TaskKey[Unit]("checkPom") := { - val pomFile = makePom.value - val pomContent = IO.read(pomFile) - val flatPom = pomContent.filterNot(_.isWhitespace) - val expectedContent = "org.scala-langscala3-library_33.0.2" - val hasCorrectStdlib = flatPom.contains(expectedContent) - if (!hasCorrectStdlib) sys.error(s"The produced POM file is incorrect:\n\n${pomContent}") - } - ) - -val scala3_1 = Seq(scalaVersion := "3.1.1") -val scala3_0 = Seq(scalaVersion := "3.0.2") -val scala2_13 = Seq(scalaVersion := "2.13.8") -val ivyFooDep = Seq( - libraryDependencies ++= Seq( - org %% fooName % revision - ), - resolvers := Seq(Resolver.defaultLocal) -) -val mavenFooDep = Seq( - libraryDependencies ++= Seq( - org %% fooName % revision - ), - resolvers := Seq(Resolver.mavenLocal) -) - -lazy val bar1a = project.in(file("bar1a")) - .settings( - scala3_1, - ivyFooDep - ) - -lazy val bar1b = project.in(file("bar1b")) - .settings( - scala3_1, - mavenFooDep - ) - -lazy val bar1c = project.in(file("bar1c")) - .settings( - scala3_1, - ).dependsOn(foo) - - -lazy val bar2a = project.in(file("bar2a")) - .settings( - scala3_0, - ivyFooDep - ) - -lazy val bar2b = project.in(file("bar2b")) - .settings( - scala3_0, - mavenFooDep - ) - -lazy val bar2c = project.in(file("bar2c")) - .settings( - scala3_0, - ).dependsOn(foo) - - -lazy val bar3a = project.in(file("bar3a")) - .settings( - scala2_13, - ivyFooDep - ) - -lazy val bar3b = project.in(file("bar3b")) - .settings( - scala2_13, - mavenFooDep - ) - -lazy val bar3c = project.in(file("bar3c")) - .settings( - scala2_13, - ).dependsOn(foo) diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-2.13/Foo.scala b/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-2.13/Foo.scala deleted file mode 100644 index 6347cd083..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-2.13/Foo.scala +++ /dev/null @@ -1,11 +0,0 @@ -package foo.main - -object Foo { - val numbers = Seq(1, 2, 3) -} - -object Run { - def main(args: Array[String]) = { - assert(Foo.numbers.length == 3) - } -} diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-3/Foo.scala b/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-3/Foo.scala deleted file mode 100644 index 11ec280a3..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/main/scala-3/Foo.scala +++ /dev/null @@ -1,17 +0,0 @@ -package foo.main - -class MyException extends Exception("MyException") - -@annotation.experimental -object Exceptional: - import language.experimental.saferExceptions - def foo(): Unit throws MyException = // this requires at least 3.1.x to compile - throw new MyException - -object Foo: - val numbers = Seq(1, 2, 3) - -@main def run() = - val canEqualMethods = classOf[CanEqual.type].getMethods.toList - assert( canEqualMethods.exists(_.getName == "canEqualSeq")) // since 3.0.x - assert(!canEqualMethods.exists(_.getName == "canEqualSeqs")) // since 3.1.x diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-2.13/FooTest.scala b/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-2.13/FooTest.scala deleted file mode 100644 index 4102861ae..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-2.13/FooTest.scala +++ /dev/null @@ -1,7 +0,0 @@ -package foo.test - -class FooTest extends munit.FunSuite { - test("foo") { - assertEquals(foo.main.Foo.numbers, Seq(1, 2, 3)) - } -} diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-3/FooTest.scala b/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-3/FooTest.scala deleted file mode 100644 index cc0ee76b6..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/foo/src/test/scala-3/FooTest.scala +++ /dev/null @@ -1,19 +0,0 @@ -package foo.test - -class MyException extends Exception("MyException") - -@annotation.experimental -object Exceptional: - import language.experimental.saferExceptions - def foo(): Unit throws MyException = // this requires at least 3.1.x to compile - throw new MyException - - -class FooTest extends munit.FunSuite: - test("foo") { - assertEquals(foo.main.Foo.numbers, Seq(1, 2, 3)) - - val canEqualMethods = classOf[CanEqual.type].getMethods.toList - assert( canEqualMethods.exists(_.getName == "canEqualSeq")) // since 3.0.x - assert(!canEqualMethods.exists(_.getName == "canEqualSeqs")) // since 3.1.x - } diff --git a/sbt-app/src/sbt-test/dependency-management/scala-output-version/test b/sbt-app/src/sbt-test/dependency-management/scala-output-version/test deleted file mode 100644 index ee66638fb..000000000 --- a/sbt-app/src/sbt-test/dependency-management/scala-output-version/test +++ /dev/null @@ -1,35 +0,0 @@ -$ copy-file Bar.scala bar1a/src/main/scala/Bar.scala -$ copy-file Bar.scala bar1b/src/main/scala/Bar.scala -$ copy-file Bar.scala bar1c/src/main/scala/Bar.scala -$ copy-file Bar.scala bar2a/src/main/scala/Bar.scala -$ copy-file Bar.scala bar2b/src/main/scala/Bar.scala -$ copy-file Bar.scala bar2c/src/main/scala/Bar.scala -$ copy-file Bar.scala bar3a/src/main/scala/Bar.scala -$ copy-file Bar.scala bar3b/src/main/scala/Bar.scala -$ copy-file Bar.scala bar3c/src/main/scala/Bar.scala - -> ++3.1.2-RC2 -> foo / compile -> foo / run -> foo / test -> foo / publishLocal -> foo / checkIvy -> foo / publishM2 -> foo / checkPom - -> ++2.13.8 -> foo / compile -> foo / run -> foo / test -> foo / publishLocal -> foo / publishM2 - -> bar1a / run -> bar1b / run -> bar1c / run -> bar2a / run -> bar2b / run -> bar2c / run -> bar3a / run -> bar3b / run -> bar3c / run