Skip to content

Commit

Permalink
Support several scalafixScalaBinaryVersion within a build (#380)
Browse files Browse the repository at this point in the history
  • Loading branch information
zarthross authored Dec 19, 2023
1 parent 6e00a88 commit e254237
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 39 deletions.
81 changes: 47 additions & 34 deletions src/main/scala/scalafix/internal/sbt/ScalafixInterface.scala
Original file line number Diff line number Diff line change
Expand Up @@ -116,47 +116,60 @@ object ScalafixInterface {
private lazy val _value = scala.util.Try(thunk())
override def apply(): T = _value.get
}
private val fromToolClasspathMemo: BlockingCache[
(String, Seq[ModuleID], Seq[Repository]),
ScalafixInterface
] = new BlockingCache

def fromToolClasspath(
scalafixBinaryScalaVersion: String,
scalafixDependencies: Seq[ModuleID],
scalafixCustomResolvers: Seq[Repository],
logger: Logger = ConsoleLogger(System.out)
): () => ScalafixInterface =
new LazyValue({ () =>
if (scalafixBinaryScalaVersion.startsWith("3"))
logger.error(
"To use Scalafix on Scala 3 projects, you must unset `scalafixBinaryScalaVersion`. " +
"Rules such as ExplicitResultTypes requiring the project version to match the Scalafix " +
"version are unsupported for the moment."
)
else if (scalafixBinaryScalaVersion == "2.11")
logger.error(
"Scala 2.11 is no longer supported. Please downgrade to the final version supporting " +
"it: sbt-scalafix 0.10.4."
)
val callback = new ScalafixLogger(logger)
val scalafixArguments = ScalafixAPI
.fetchAndClassloadInstance(
fromToolClasspathMemo.getOrElseUpdate(
(
scalafixBinaryScalaVersion,
scalafixCustomResolvers.asJava
)
.newArguments()
.withMainCallback(callback)
val printStream =
new PrintStream(
LoggingOutputStream(
logger,
Level.Info
)
)
new ScalafixInterface(scalafixArguments, Nil)
.withArgs(
Arg.PrintStream(printStream),
Arg.ToolClasspath(
Nil,
scalafixDependencies,
scalafixCustomResolvers
)
)
scalafixDependencies,
scalafixCustomResolvers
), {
if (scalafixBinaryScalaVersion.startsWith("3"))
logger.error(
"To use Scalafix on Scala 3 projects, you must unset `scalafixBinaryScalaVersion`. " +
"Rules such as ExplicitResultTypes requiring the project version to match the Scalafix " +
"version are unsupported for the moment."
)
else if (scalafixBinaryScalaVersion == "2.11")
logger.error(
"Scala 2.11 is no longer supported. Please downgrade to the final version supporting " +
"it: sbt-scalafix 0.10.4."
)
val callback = new ScalafixLogger(logger)
val scalafixArguments = ScalafixAPI
.fetchAndClassloadInstance(
scalafixBinaryScalaVersion,
scalafixCustomResolvers.asJava
)
.newArguments()
.withMainCallback(callback)
val printStream =
new PrintStream(
LoggingOutputStream(
logger,
Level.Info
)
)
new ScalafixInterface(scalafixArguments, Nil)
.withArgs(
Arg.PrintStream(printStream),
Arg.ToolClasspath(
Nil,
scalafixDependencies,
scalafixCustomResolvers
)
)
}
)
})
}
10 changes: 5 additions & 5 deletions src/main/scala/scalafix/sbt/ScalafixPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,11 @@ object ScalafixPlugin extends AutoPlugin {
SettingKey[Boolean]("bspEnabled") := false
)
),
scalafixInterfaceProvider := ScalafixInterface.fromToolClasspath(
scalafixScalaBinaryVersion.value,
scalafixDependencies = scalafixDependencies.value,
scalafixCustomResolvers = scalafixResolvers.value
),
update := {
object SemanticdbScalac {
def unapply(id: ModuleID): Option[String] =
Expand Down Expand Up @@ -211,11 +216,6 @@ object ScalafixPlugin extends AutoPlugin {
),
scalafixDependencies := Nil,
commands += ScalafixEnable.command,
scalafixInterfaceProvider := ScalafixInterface.fromToolClasspath(
(ThisBuild / scalafixScalaBinaryVersion).value,
scalafixDependencies = (ThisBuild / scalafixDependencies).value,
scalafixCustomResolvers = (ThisBuild / scalafixResolvers).value
),
scalafixInterfaceCache := new BlockingCache[
ToolClasspath,
ScalafixInterface
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
rules = [DisableSyntax, OrganizeImports, ExplicitResultTypes]
OrganizeImports.removeUnused = true
ExplicitResultTypes.skipSimpleDefinitions = false
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
rules = [DisableSyntax, OrganizeImports]
OrganizeImports.removeUnused = false
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import _root_.scalafix.sbt.{BuildInfo => Versions}

val scala3Version = "3.3.0"
ThisBuild / semanticdbEnabled := true
ThisBuild / semanticdbVersion := scalafixSemanticdb.revision

lazy val root = project
.in(file("."))
.settings(
scalaVersion := Versions.scala212,
crossScalaVersions := Seq(Versions.scala212, Versions.scala213, scala3Version),
scalacOptions ++= (if (scalaVersion.value.startsWith("2")) Seq("-Ywarn-unused") else Seq()),
scalafixScalaBinaryVersion := {
if (scalaBinaryVersion.value == "3") scalafixScalaBinaryVersion.value
else scalaBinaryVersion.value
},
scalafixConfig := {
if (scalaBinaryVersion.value == "3")
Some(file(".scalafix-3.conf"))
else
Some(file(".scalafix-2.conf"))
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.5.8
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
resolvers += Resolver.sonatypeRepo("public")
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % sys.props("plugin.version"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import scala.Int
import scala.collection.Seq
import scala.collection.AbstractSeq

object Main {
def foo(a: Int) = a + 2.0f
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import scala.Int

object Main {
def foo(a: Int): Float = a + 2.0f
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import scala.Int
import scala.collection.Seq
import scala.collection.AbstractSeq

object Main {
def foo(a: Int) = a + 2.0f
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import scala.Int
import scala.collection.AbstractSeq
import scala.collection.Seq

object Main {
def foo(a: Int) = a + 2.0f
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
> +compile

> +scalafix

$ must-mirror src/main/scala-2/Main.scala src/main/scala-2/Main.scala.expected
$ must-mirror src/main/scala-3/Main.scala src/main/scala-3/Main.scala.expected

0 comments on commit e254237

Please sign in to comment.