From 012651cc487d83086091336b47d284354d619b54 Mon Sep 17 00:00:00 2001 From: Brice Jaglin Date: Thu, 24 Mar 2022 12:59:22 +0100 Subject: [PATCH] scalafixEnable: *latest* semanticdb for old scala When there is no semanticdb-scalac available for the build scala version for the scalameta version that scalafix tracks, we can tell the user if it is because it is no longer published or not yet published. When it is no longer published, the latest version should not change, so we can use that one in a repeatable manner, in order to maximize the chances of compatiblity. --- .../scala/scalafix/sbt/ScalafixEnable.scala | 55 +++++++++++++------ .../sbt-scalafix/dependency/build.sbt | 2 +- .../sbt-scalafix/scalafixEnable/build.sbt | 4 +- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/main/scala/scalafix/sbt/ScalafixEnable.scala b/src/main/scala/scalafix/sbt/ScalafixEnable.scala index 52800829..2009b872 100644 --- a/src/main/scala/scalafix/sbt/ScalafixEnable.scala +++ b/src/main/scala/scalafix/sbt/ScalafixEnable.scala @@ -71,7 +71,7 @@ object ScalafixEnable { detail = """1. set semanticdbEnabled := true |2. for scala 2.x, | - set semanticdbCompilerPlugin to the scalameta version tracked by scalafix if available for scalaVersion, - | - otherwise set semanticdbCompilerPlugin to the earliest compatible version available for scalaVersion, + | - otherwise set semanticdbCompilerPlugin to a compatible version available for scalaVersion, | - otherwise force scalaVersion to the latest version supported by the scalameta version tracked by scalafix.""".stripMargin ) { s => val extracted = Project.extract(s) @@ -136,21 +136,44 @@ object ScalafixEnable { semanticdbCompilerPlugin.value .withRevision(recommendedSemanticdbV.toString) ) - case Success(earliestAvailable :: _) => - Seq( - semanticdbCompilerPlugin := { - val v = earliestAvailable.toString - sLog.value.info( - s"Using semanticdb-scalac $v in project " + - s"${project.ref.project} since the version " + - s"${recommendedSemanticdbV} tracked by scalafix " + - s"${BuildInfo.scalafixVersion} is not available for " + - s"scala ${project.scalaVersion0.toString} - " + - s"consider upgrading sbt-scalafix or bumping scala" - ) - semanticdbCompilerPlugin.value.withRevision(v) - } - ) + case Success(earliestAvailable :: tail) => + val futureVersion = + SemanticSelector.apply(s">${recommendedSemanticdbV}") + if (earliestAvailable.matchesSemVer(futureVersion)) { + Seq( + semanticdbCompilerPlugin := { + val v = earliestAvailable.toString + sLog.value.info( + s"Using semanticdb-scalac $v in project " + + s"${project.ref.project} since the version " + + s"${recommendedSemanticdbV} tracked by scalafix " + + s"${BuildInfo.scalafixVersion} will not be " + + s"published for scala " + + s"${project.scalaVersion0.toString} - " + + s"consider upgrading sbt-scalafix" + ) + semanticdbCompilerPlugin.value.withRevision(v) + } + ) + } else { + val latestAvailable = + tail.lastOption.getOrElse(earliestAvailable) + Seq( + semanticdbCompilerPlugin := { + val v = latestAvailable.toString + sLog.value.info( + s"Using semanticdb-scalac $v in project " + + s"${project.ref.project} since the version " + + s"${recommendedSemanticdbV} tracked by scalafix " + + s"${BuildInfo.scalafixVersion} is no longer " + + s"published for scala " + + s"${project.scalaVersion0.toString} - " + + s"consider bumping scala" + ) + semanticdbCompilerPlugin.value.withRevision(v) + } + ) + } } } :+ (semanticdbEnabled := true) settings <- diff --git a/src/sbt-test/sbt-scalafix/dependency/build.sbt b/src/sbt-test/sbt-scalafix/dependency/build.sbt index 2c8a451d..c331380b 100644 --- a/src/sbt-test/sbt-scalafix/dependency/build.sbt +++ b/src/sbt-test/sbt-scalafix/dependency/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.12.12" +scalaVersion := "2.12.7" TaskKey[Unit]("check") := { val a = IO.read((Compile / sourceDirectory).value / "scala" / "A.scala") diff --git a/src/sbt-test/sbt-scalafix/scalafixEnable/build.sbt b/src/sbt-test/sbt-scalafix/scalafixEnable/build.sbt index d5702dac..c6284bef 100644 --- a/src/sbt-test/sbt-scalafix/scalafixEnable/build.sbt +++ b/src/sbt-test/sbt-scalafix/scalafixEnable/build.sbt @@ -15,7 +15,7 @@ lazy val scala211_old = project.settings( // 2.11.x is supported lazy val scala211 = project.settings( - // semanticdb-scalac_2.11.11 no longer available, became available as of 2.0.0 + // semanticdb-scalac_2.11.11 no longer available after 4.1.9 scalaVersion := "2.11.11" ) @@ -46,7 +46,7 @@ TaskKey[Unit]("check") := { assert((scala211 / semanticdbEnabled).value == true) assert((scala211 / scalaVersion).value == "2.11.11") - assert((scala211 / semanticdbCompilerPlugin).value.revision == "4.1.0") + assert((scala211 / semanticdbCompilerPlugin).value.revision == "4.1.9") assert( (scala211 / Compile / compile / scalacOptions).value .count(_ == "-Yrangepos") == 1