Skip to content

Commit

Permalink
scalafixEnable: support builds overriding scalacOptions
Browse files Browse the repository at this point in the history
Also, scalacOptions are now set in a more specific scope (matching the
one looked up for compiler invocation so that scalafixEnable overrides
them no matter at which scope they are defined), so assertions had to
be updated.
  • Loading branch information
github-brice-jaglin committed Mar 29, 2021
1 parent 42bb77f commit 27d8eb5
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 18 deletions.
13 changes: 12 additions & 1 deletion src/main/scala-sbt-0.13/sbt/internal/sbtscalafix/Compat.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package sbt.internal.sbtscalafix

import sbt.{Compiler, Extracted, Setting, State}
import sbt.{Classpaths, Compiler, Extracted, Setting, State, UpdateReport}
import sbt.inc.IncOptions

object Compat {
Expand Down Expand Up @@ -30,4 +30,15 @@ object Compat {
): Compiler.CompileResult = {
compileResult
}

def autoPlugins(
report: UpdateReport,
scalaVersion: String
): Seq[String] = {
Classpaths.autoPlugins(
report,
Seq(),
Set("jar", "bundle")
)
}
}
14 changes: 13 additions & 1 deletion src/main/scala-sbt-1.0/sbt/internal/sbtscalafix/Compat.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package sbt.internal.sbtscalafix

import sbt.{Extracted, IncOptions, Setting, State}
import sbt.internal.inc.ScalaInstance
import sbt.{Classpaths, Extracted, IncOptions, Setting, State, UpdateReport}
import xsbti.compile.CompileResult

object Compat {
Expand Down Expand Up @@ -32,4 +33,15 @@ object Compat {
): CompileResult = {
compileResult.withHasModified(hasModified)
}

def autoPlugins(
report: UpdateReport,
scalaVersion: String
): Seq[String] = {
Classpaths.autoPlugins(
report,
Seq(),
ScalaInstance.isDotty(scalaVersion)
)
}
}
33 changes: 23 additions & 10 deletions src/main/scala/scalafix/sbt/ScalafixEnable.scala
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,14 @@ object ScalafixEnable {
"Configure libraryDependencies, scalaVersion and scalacOptions for scalafix.",
detail = """1. enables the semanticdb-scalac compiler plugin
|2. sets scalaVersion to latest Scala version supported by scalafix
|3. add -Yrangepos to scalacOptions""".stripMargin
|3. add -Yrangepos to Compile|Test / compile / scalacOptions""".stripMargin
) { s =>
val extracted = Project.extract(s)
val relaxScalacForScalafix = Seq(Compile, Test).flatMap(
inConfig(_)(ScalafixPlugin.relaxScalacOptionsConfigSettings)
val scalacOptionsSettings = Seq(Compile, Test).flatMap(
inConfig(_)(
semanticdbConfigSettings ++
ScalafixPlugin.relaxScalacOptionsConfigSettings
)
)
val settings: Seq[Setting[_]] = for {
(p, fullVersion) <- projectsWithMatchingScalaVersion(s)
Expand All @@ -49,23 +52,33 @@ object ScalafixEnable {
.in(p)
.get(extracted.structure.data)
.exists(_.exists(_.name == "semanticdb-scalac"))
addSemanticdb <- List(
addSemanticdbCompilerPlugin <- List(
scalaVersion.in(p) := fullVersion,
scalacOptions.in(p) ++= List(
"-Yrangepos",
s"-Xplugin-require:semanticdb"
),
libraryDependencies.in(p) += compilerPlugin(
ScalafixPlugin.autoImport.scalafixSemanticdb
)
)
settings <-
inScope(ThisScope.in(p))(relaxScalacForScalafix) ++
(if (!isSemanticdbEnabled) addSemanticdb else List())
inScope(ThisScope.in(p))(scalacOptionsSettings) ++
(if (!isSemanticdbEnabled) addSemanticdbCompilerPlugin else List())
} yield settings

val scalafixReady = Compat.append(extracted, settings, s)

scalafixReady
}

private val semanticdbConfigSettings: Seq[Def.Setting[_]] =
Seq(
scalacOptions.in(compile) := {
val old = scalacOptions.in(compile).value
val options = List(
"-Yrangepos",
"-Xplugin-require:semanticdb"
)
// don't rely on autoCompilerPlugins to inject the plugin as it does not work if scalacOptions is overriden in the build
val plugins = Compat.autoPlugins(update.value, scalaVersion.value)
old ++ (plugins ++ options).diff(old)
}
)
}
30 changes: 25 additions & 5 deletions src/sbt-test/sbt-scalafix/scalafixEnable/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,34 @@ TaskKey[Unit]("check") := {
// nothing should change for the 2.10 project
assert(scalaVersion.in(scala210).value == "2.10.4")
assert(libraryDependencies.in(scala210).value.isEmpty)
assert(scalacOptions.in(scala210).value.isEmpty)
assert(scalacOptions.in(scala210, Compile, compile).value.isEmpty)

// 2.12.0 should be overidden to 2.12.X
assert(scalaVersion.in(overridesSettings).value == V.scala212)
assert(libraryDependencies.in(overridesSettings).value.nonEmpty)
assert(scalacOptions.in(overridesSettings).value.contains("-Yrangepos"))
assert(
scalacOptions
.in(overridesSettings, Compile, compile)
.value
.contains("-Yrangepos")
)

assert(scalacOptions.in(scala211).value.count(_ == "-Yrangepos") == 1)
assert(scalacOptions.in(scala212).value.count(_ == "-Yrangepos") == 1)
assert(scalacOptions.in(scala213).value.count(_ == "-Yrangepos") == 1)
assert(
scalacOptions
.in(scala211, Compile, compile)
.value
.count(_ == "-Yrangepos") == 1
)
assert(
scalacOptions
.in(scala212, Compile, compile)
.value
.count(_ == "-Yrangepos") == 1
)
assert(
scalacOptions
.in(scala213, Test, compile)
.value
.count(_ == "-Yrangepos") == 1
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ object FatalWarningsPlugin extends AutoPlugin {
override def requires: Plugins = ScalafixPlugin

override def projectSettings: Seq[Def.Setting[_]] = Seq(
scalacOptions.in(Test, compile) ++= Seq(
scalacOptions.in(Test, compile) := Seq(
"-Xfatal-warnings",
"-Ywarn-unused"
)
Expand Down

0 comments on commit 27d8eb5

Please sign in to comment.