From 369e64700847e34389318bbf4e39d9b8b6a95387 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Tue, 5 Mar 2024 13:24:31 +0100 Subject: [PATCH] Fix scala 2 compat with -Xsource:3 and scala-collection-compat --- build.sbt | 34 ++++++++----------- .../sbt/internal/util/ConsoleAppender.scala | 2 -- .../scala/sbt/internal/util/ConsoleOut.scala | 8 ++--- .../scala/sbt/internal/util/EscHelpers.scala | 2 -- .../main/scala/sbt/internal/util/JLine3.scala | 10 ------ .../sbt/internal/util/ProgressState.scala | 2 +- .../internal/util/SourcePositionMacro.scala | 1 - .../scala/sbt/internal/util/Relation.scala | 3 +- .../internal/scripted/FilteredLoader.scala | 7 ++-- .../internal/scripted/StatementHandler.scala | 2 +- project/Dependencies.scala | 1 + project/HouseRulesPlugin.scala | 3 +- project/PublishBinPlugin.scala | 4 ++- project/SbtLauncherPlugin.scala | 2 +- 14 files changed, 35 insertions(+), 46 deletions(-) diff --git a/build.sbt b/build.sbt index 82b37f5bb..47a731471 100644 --- a/build.sbt +++ b/build.sbt @@ -55,7 +55,7 @@ Global / excludeLint += scriptedBufferLog Global / excludeLint += checkPluginCross ThisBuild / evictionErrorLevel := Level.Info -def commonBaseSettings: Seq[Setting[_]] = Def.settings( +def commonSettings: Seq[Setting[_]] = Def.settings( headerLicense := Some( HeaderLicense.Custom( """|sbt @@ -68,7 +68,7 @@ def commonBaseSettings: Seq[Setting[_]] = Def.settings( scalaVersion := baseScalaVersion, componentID := None, resolvers += Resolver.typesafeIvyRepo("releases").withName("typesafe-sbt-build-ivy-releases"), - resolvers += Resolver.sonatypeRepo("snapshots"), + resolvers ++= Resolver.sonatypeOssRepos("snapshots"), testFrameworks += TestFramework("hedgehog.sbt.Framework"), testFrameworks += TestFramework("verify.runner.Framework"), Global / concurrentRestrictions += Util.testExclusiveRestriction, @@ -101,20 +101,15 @@ def commonBaseSettings: Seq[Setting[_]] = Def.settings( Test / publishArtifact := false, run / fork := true, ) -def commonSettings: Seq[Setting[_]] = - commonBaseSettings :+ { - libraryDependencies ++= { - if (scalaBinaryVersion.value == "3") { - Nil - } else { - Seq(compilerPlugin(kindProjector)) - } - } - } def utilCommonSettings: Seq[Setting[_]] = Def.settings( baseSettings, - crossScalaVersions := Seq(scala212, scala213, scala3) + crossScalaVersions := Seq(scala212, scala213, scala3), + libraryDependencies += Dependencies.scalaCollectionCompat, + libraryDependencies ++= { + if (scalaBinaryVersion.value == "3") Nil + else Seq(compilerPlugin(kindProjector)) + } ) def minimalSettings: Seq[Setting[_]] = @@ -258,12 +253,12 @@ lazy val bundledLauncherProj = /* ** subproject declarations ** */ -val collectionProj = (project in file("util-collection")) +val collectionProj = project + .in(file("util-collection")) .dependsOn(utilPosition, utilCore) .settings( name := "Collections", testedBaseSettings, - baseSettings, libraryDependencies ++= Seq(sjsonNewScalaJson.value), libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match { case Some((2, major)) if major <= 12 => Seq() @@ -349,7 +344,8 @@ lazy val utilCore = project utilMimaSettings ) -lazy val utilLogging = (project in file("internal") / "util-logging") +lazy val utilLogging = project + .in(file("internal") / "util-logging") .enablePlugins(ContrabandPlugin, JsonCodecPlugin) .dependsOn(utilInterface, utilCore) .settings( @@ -421,9 +417,9 @@ lazy val utilRelation = (project in file("internal") / "util-relation") ) // Persisted caching based on sjson-new -lazy val utilCache = (project in file("util-cache")) +lazy val utilCache = project + .in(file("util-cache")) .settings( - utilCommonSettings, testedBaseSettings, name := "Util Cache", libraryDependencies ++= @@ -1044,7 +1040,7 @@ lazy val sbtClientProj = (project in file("client")) .enablePlugins(NativeImagePlugin) .dependsOn(commandProj) .settings( - commonBaseSettings, + commonSettings, publish / skip := true, name := "sbt-client", mimaPreviousArtifacts := Set.empty, diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index 3d0268045..d464757b8 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -373,8 +373,6 @@ object ConsoleAppender { } private[sbt] def generateName(): String = "out-" + generateId.incrementAndGet - - private[this] def ansiSupported: Boolean = Terminal.console.isAnsiSupported } // See http://stackoverflow.com/questions/24205093/how-to-create-a-custom-appender-in-log4j2 diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala index d1f387ab6..902fbfc43 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala @@ -60,7 +60,7 @@ object ConsoleOut { def systemOutOverwrite(f: (String, String) => Boolean): ConsoleOut = new ConsoleOut { val lockObject: PrintStream = System.out private[this] var last: Option[String] = None - private[this] var current = new java.lang.StringBuffer + private[this] val current = new java.lang.StringBuffer def print(s: String): Unit = synchronized { current.append(s); () } def println(s: String): Unit = synchronized { current.append(s); println() } def println(): Unit = synchronized { @@ -128,7 +128,7 @@ object ConsoleOut { case c => c } def printStreamOut(out: PrintStream): ConsoleOut = new ConsoleOut { - val lockObject = out + val lockObject: AnyRef = out def print(s: String) = out.print(s) def println(s: String) = out.println(s) def println() = out.println() @@ -136,7 +136,7 @@ object ConsoleOut { override def toString: String = s"PrintStreamConsoleOut($out)" } def printWriterOut(out: PrintWriter): ConsoleOut = new ConsoleOut { - val lockObject = out + val lockObject: AnyRef = out def print(s: String) = out.print(s) def println(s: String) = { out.println(s); flush() } def println() = { out.println(); flush() } @@ -144,7 +144,7 @@ object ConsoleOut { override def toString: String = s"PrintWriterConsoleOut($out)" } def bufferedWriterOut(out: BufferedWriter): ConsoleOut = new ConsoleOut { - val lockObject = out + val lockObject: AnyRef = out def print(s: String) = out.write(s) def println(s: String) = { out.write(s); println() } def println() = { out.newLine(); flush() } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala b/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala index 3a43d1f4e..7bd7d7040 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala @@ -143,7 +143,6 @@ object EscHelpers { */ def strip(bytes: Array[Byte], stripAnsi: Boolean, stripColor: Boolean): (Array[Byte], Int) = { val res = Array.fill[Byte](bytes.length)(0) - var i = 0 var index = 0 var state = 0 var limit = 0 @@ -205,7 +204,6 @@ object EscHelpers { def stripColorsAndMoves(s: String): String = { val bytes = s.getBytes val res = Array.fill[Byte](bytes.length)(0) - var i = 0 var index = 0 var state = 0 var limit = 0 diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala index a8c10a62f..ebd92e684 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala @@ -31,8 +31,6 @@ private[sbt] object JLine3 { private[this] val forceWindowsJansiHolder = new AtomicBoolean(false) private[sbt] def forceWindowsJansi(): Unit = forceWindowsJansiHolder.set(true) private[this] def windowsJansi(): org.jline.terminal.Terminal = { - val support = new JansiSupportImpl - val winConsole = support.isWindowsConsole(); val termType = sys.props.get("org.jline.terminal.type").orElse(sys.env.get("TERM")).orNull val term = JansiWinSysTerminal.createTerminal( "console", @@ -220,14 +218,6 @@ private[sbt] object JLine3 { } } } - private def enterRawModeImpl(term: JTerminal): Attributes = { - val prvAttr = term.getAttributes() - val newAttr = new Attributes(prvAttr) - newAttr.setLocalFlags(EnumSet.of(LocalFlag.ICANON, LocalFlag.ECHO, LocalFlag.IEXTEN), false) - newAttr.setInputFlags(EnumSet.of(InputFlag.IXON, InputFlag.ICRNL, InputFlag.INLCR), false) - term.setAttributes(newAttr) - prvAttr - } // We need to set the ENABLE_PROCESS_INPUT flag for ctrl+c to be treated as a signal in windows // https://docs.microsoft.com/en-us/windows/console/setconsolemode private[this] val ENABLE_PROCESS_INPUT = 1 diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala index 9608be5a9..cffa485e9 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala @@ -107,7 +107,7 @@ private[sbt] final class ProgressState( val parts = new String(bytes, "UTF-8").split(System.lineSeparator) def appendLine(l: String, appendNewline: Boolean): Unit = { toWrite ++= l.getBytes("UTF-8") - if (!l.getBytes("UTF-8").endsWith("\r")) toWrite ++= clearScreenBytes + if (!l.getBytes("UTF-8").endsWith("\r".getBytes)) toWrite ++= clearScreenBytes if (appendNewline) toWrite ++= lineSeparatorBytes } parts.dropRight(1).foreach(appendLine(_, true)) diff --git a/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala b/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala index e872a124e..309ce5835 100644 --- a/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala +++ b/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala @@ -7,7 +7,6 @@ package sbt.internal.util -import scala.language.experimental.macros import scala.annotation.tailrec import scala.reflect.macros.blackbox import scala.reflect.internal.util.UndefinedPosition diff --git a/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala b/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala index 15144c3cf..4c9b0b3cf 100644 --- a/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala +++ b/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala @@ -8,6 +8,7 @@ package sbt.internal.util import Relation._ +import scala.collection.compat.* object Relation { @@ -178,7 +179,7 @@ private final class MRelation[A, B](fwd: Map[A, Set[B]], rev: Map[B, Set[A]]) else new MRelation(add(fwd, from, to), to.foldLeft(rev)((map, t) => add(map, t, from :: Nil))) def ++(rs: Iterable[(A, B)]) = rs.foldLeft(this: Relation[A, B]) { _ + _ } - def ++(other: Relation[A, B]) = + def ++(other: Relation[A, B]): Relation[A, B] = new MRelation[A, B](combine(fwd, other.forwardMap), combine(rev, other.reverseMap)) def --(ts: Iterable[A]): Relation[A, B] = ts.foldLeft(this: Relation[A, B]) { _ - _ } diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala index 8c980eb97..16499886e 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala @@ -9,6 +9,9 @@ package sbt package internal package scripted +import java.{ util => ju } +import java.net.URL + final class FilteredLoader(parent: ClassLoader) extends ClassLoader(parent) { @throws(classOf[ClassNotFoundException]) override final def loadClass(className: String, resolve: Boolean): Class[_] = { @@ -17,6 +20,6 @@ final class FilteredLoader(parent: ClassLoader) extends ClassLoader(parent) { else throw new ClassNotFoundException(className) } - override def getResources(name: String) = null - override def getResource(name: String) = null + override def getResources(name: String): ju.Enumeration[URL] = null + override def getResource(name: String): URL = null } diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala index 56a2bfc44..6962cee6a 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala @@ -29,5 +29,5 @@ trait BasicStatementHandler extends StatementHandler { /** Use when a stack trace is not useful */ final class TestFailed(msg: String) extends RuntimeException(msg) { - override def fillInStackTrace = this + override def fillInStackTrace: Throwable = this } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 2f08ef816..14b00b855 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -133,6 +133,7 @@ object Dependencies { } ) val scalaPar = "org.scala-lang.modules" %% "scala-parallel-collections" % "1.0.4" + val scalaCollectionCompat = "org.scala-lang.modules" %% "scala-collection-compat" % "2.11.0" // specify all of log4j modules to prevent misalignment def log4jModule = (n: String) => "org.apache.logging.log4j" % n % "2.17.1" diff --git a/project/HouseRulesPlugin.scala b/project/HouseRulesPlugin.scala index 0c6098b00..5d2da8d9b 100644 --- a/project/HouseRulesPlugin.scala +++ b/project/HouseRulesPlugin.scala @@ -29,7 +29,8 @@ object HouseRulesPlugin extends AutoPlugin { scalacOptions ++= "-Ywarn-dead-code".ifScala2.value.toList, scalacOptions ++= "-Ywarn-numeric-widen".ifScala2.value.toList, scalacOptions ++= "-Ywarn-value-discard".ifScala2.value.toList, - scalacOptions ++= "-Ywarn-unused-import".ifScala2x(v => 11 <= v && v <= 12).value.toList + scalacOptions ++= "-Ywarn-unused-import".ifScala2x(v => 11 <= v && v <= 12).value.toList, + scalacOptions ++= "-Xsource:3".ifScala2.value.toList ) ++ Seq(Compile, Test).flatMap(c => (c / console / scalacOptions) --= Seq("-Ywarn-unused-import", "-Xlint") ) diff --git a/project/PublishBinPlugin.scala b/project/PublishBinPlugin.scala index 5b7c94e1d..e105f66c1 100644 --- a/project/PublishBinPlugin.scala +++ b/project/PublishBinPlugin.scala @@ -21,7 +21,9 @@ object PublishBinPlugin extends AutoPlugin { override val globalSettings = Seq(publishLocalBin := (())) override val projectSettings: Seq[Def.Setting[_]] = Def settings ( - publishLocalBin := Classpaths.publishTask(publishLocalBinConfig).value, + publishLocalBin := Classpaths + .publishOrSkip(publishLocalBinConfig, publishLocalBin / skip) + .value, publishLocalBinConfig := Classpaths.publishConfig( false, // publishMavenStyle.value, Classpaths.deliverPattern(crossTarget.value), diff --git a/project/SbtLauncherPlugin.scala b/project/SbtLauncherPlugin.scala index 65f9f2e67..9dc45626d 100644 --- a/project/SbtLauncherPlugin.scala +++ b/project/SbtLauncherPlugin.scala @@ -47,7 +47,7 @@ object SbtLauncherPlugin extends AutoPlugin { val path = dir.toPath f => if (f != dir) f -> path.relativize(f.toPath).toString :: Nil else Nil } - IO.zip(dir.allPaths.get().flatMap(rebase), target) + IO.zip(dir.allPaths.get().flatMap(rebase), target, None) } target }