diff --git a/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala b/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala index eb50da5ee0f..c15cc47309a 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala @@ -51,7 +51,7 @@ case class ScalafixProvider( buildHasErrors: AbsolutePath => Boolean, )(implicit ec: ExecutionContext, rc: ReportContext) { import ScalafixProvider._ - private val scalafixCache = TrieMap.empty[ScalaBinaryVersion, Scalafix] + private val scalafixCache = TrieMap.empty[ScalaVersion, Scalafix] private val rulesClassloaderCache = TrieMap.empty[ScalafixRulesClasspathKey, URLClassLoader] @@ -242,6 +242,8 @@ case class ScalafixProvider( |OrganizeImports.removeUnused = true |OrganizeImports.targetDialect = Scala3 | + |ExplicitResultTypes.fetchScala3CompilerArtifactsOnVersionMismatch = true + | |""".stripMargin ) path.toFile().deleteOnExit() @@ -257,6 +259,8 @@ case class ScalafixProvider( |OrganizeImports.removeUnused = false |OrganizeImports.targetDialect = Scala3 | + |ExplicitResultTypes.fetchScala3CompilerArtifactsOnVersionMismatch = true + | |""".stripMargin ) path.toFile().deleteOnExit() @@ -379,7 +383,7 @@ case class ScalafixProvider( } val result = for { - api <- getScalafix(scalaBinaryVersion) + api <- getScalafix(scalaTarget.scalaVersion) urlClassLoaderWithExternalRule <- getRuleClassLoader( scalafixRulesKey, api.getClass.getClassLoader, @@ -484,7 +488,8 @@ case class ScalafixProvider( val isScala3Dialect = isScala3 || isScalaSource val canRemoveUnused = !isScala3 || // https://github.com/scala/scala3/pull/17835 - Seq("3.0", "3.1", "3.2", "3.3") + // https://github.com/scala/scala3/pull/20315 + Seq("3.0", "3.1", "3.2", "3.3.0", "3.3.1", "3.3.2", "3.3.3") .forall(v => !scalaVersion.startsWith(v)) val confFile = scalafixConf(isScala3Dialect, canRemoveUnused) confFile match { @@ -569,15 +574,15 @@ case class ScalafixProvider( } private def getScalafix( - scalaBinaryVersion: ScalaBinaryVersion + scalaVersion: ScalaVersion ): Future[Scalafix] = Future { scalafixCache.getOrElseUpdate( - scalaBinaryVersion, { + scalaVersion, { workDoneProgress.trackBlocking("Downloading scalafix") { val scalafix = - if (scalaBinaryVersion == "2.11") scala211Fallback + if (scalaVersion.startsWith("2.11")) scala211Fallback else - Scalafix.fetchAndClassloadInstance(scalaBinaryVersion) + Scalafix.fetchAndClassloadInstance(scalaVersion) scalafix } }, @@ -613,11 +618,11 @@ case class ScalafixProvider( val rulesDependencies = scalfixRulesKey.usedRulesWithClasspath val organizeImportRule = // Scalafix version that supports Scala 2.11 doesn't have the rule built in - if (scalfixRulesKey.scalaBinaryVersion == "2.11") + if (scalfixRulesKey.scalaVersion.startsWith("2.11")) Some( Dependency.of( "com.github.liancheng", - "organize-imports_" + scalfixRulesKey.scalaBinaryVersion, + "organize-imports_2.11", "0.6.0", ) ) @@ -677,11 +682,10 @@ case class ScalafixProvider( object ScalafixProvider { - type ScalaBinaryVersion = String type ScalaVersion = String case class ScalafixRulesClasspathKey( - scalaBinaryVersion: ScalaBinaryVersion, + scalaVersion: ScalaVersion, usedRulesWithClasspath: Set[Dependency], ) diff --git a/project/V.scala b/project/V.scala index 59d1c684a26..a34d1b9d9f8 100644 --- a/project/V.scala +++ b/project/V.scala @@ -42,7 +42,7 @@ object V { val sbtBloop = bloop val sbtJdiTools = "1.1.1" val scalaCli = "1.5.0" - val scalafix = "0.12.1" + val scalafix = "0.13.0" val scalafmt = "3.7.15" val scalameta = "4.9.9" val scribe = "3.15.0"