diff --git a/build.sbt b/build.sbt index bc822a9d3..de361cf9d 100644 --- a/build.sbt +++ b/build.sbt @@ -30,8 +30,11 @@ lazy val interfaces = project props.put("scalafixVersion", version.value) props.put("scalafixStableVersion", stableVersion.value) props.put("scalametaVersion", scalametaV) - props.put("scala213", scala213) props.put("scala212", scala212) + props.put("scala213", scala213) + props.put("scala33", scala33) + props.put("scala35", scala35) + props.put("scala36", scala36) props.put("scala3LTS", scala3LTS) props.put("scala3Next", scala3Next) val out = diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 20f08452a..506f69b29 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -7,8 +7,11 @@ import sbt._ object Dependencies { val scala212 = sys.props.getOrElse("scala212.nightly", "2.12.20") val scala213 = sys.props.getOrElse("scala213.nightly", "2.13.15") - val scala3Next = sys.props.getOrElse("scala3.nightly", "3.5.2") - val scala3LTS = "3.3.4" + val scala33 = "3.3.4" + val scala35 = "3.5.2" + val scala36 = "3.6.2" + val scala3LTS = scala33 + val scala3Next = sys.props.getOrElse("scala3.nightly", scala36) val bijectionCoreV = "0.9.8" val collectionCompatV = "2.12.0" diff --git a/project/Mima.scala b/project/Mima.scala index 624f53b3d..8da382a07 100644 --- a/project/Mima.scala +++ b/project/Mima.scala @@ -9,7 +9,10 @@ object Mima { ProblemFilters.exclude[Problem]("scalafix.internal.*"), ProblemFilters.exclude[Problem]("scala.meta.internal.*"), // Exceptions - ProblemFilters.exclude[DirectMissingMethodProblem]("scalafix.v0.Signature#Self.syntax") + ProblemFilters.exclude[DirectMissingMethodProblem]("scalafix.v0.Signature#Self.syntax"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("scalafix.interfaces.Scalafix.scala33"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("scalafix.interfaces.Scalafix.scala35"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("scalafix.interfaces.Scalafix.scala36") ) } } diff --git a/project/ScalafixBuild.scala b/project/ScalafixBuild.scala index e7cfc7f79..a060b55df 100644 --- a/project/ScalafixBuild.scala +++ b/project/ScalafixBuild.scala @@ -33,7 +33,14 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { // https://github.com/scalameta/scalameta/issues/2485 lazy val coreScalaVersions = Seq(scala212, scala213) - lazy val cliScalaVersions = Seq(scala212, scala213, scala3LTS, scala3Next) + lazy val cliScalaVersions = Seq( + scala212, + scala213, + scala33, + scala35, + scala36, + scala3Next + ).distinct lazy val cliScalaVersionsWithTargets: Seq[(String, TargetAxis)] = cliScalaVersions.map(sv => (sv, TargetAxis(sv))) ++ Seq(scala213, scala212).flatMap { sv => @@ -138,6 +145,9 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { "supportedScalaVersions" -> cliScalaVersions, "scala212" -> scala212, "scala213" -> scala213, + "scala33" -> scala33, + "scala35" -> scala35, + "scala36" -> scala36, "scala3LTS" -> scala3LTS, "scala3Next" -> scala3Next, sbtVersion @@ -230,8 +240,9 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { developers ++= Developers.list ) - private val PreviousScalaVersion: Map[String, String] = Map( - "3.5.2" -> "3.5.1" + private val PreviousScalaVersion: Map[String, Option[String]] = Map( + "3.5.2" -> Some("3.5.1"), + "3.6.2" -> None ) override def buildSettings: Seq[Setting[_]] = List( @@ -270,7 +281,7 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { // avoid "missing dependency" on artifacts with full scala version when bumping scala versionPolicyIgnored ++= { PreviousScalaVersion.get(scalaVersion.value) match { - case Some(previous) => + case Some(Some(previous)) => // all transitive dependencies with full scala version we know about Seq( "org.scalameta" % s"semanticdb-scalac-core_$previous", @@ -278,7 +289,7 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { "ch.epfl.scala" % s"scalafix-reflect_$previous", "ch.epfl.scala" % s"scalafix-rules_$previous" ) - case None => Seq() + case _ => Seq() } }, versionPolicyIntention := Compatibility.BinaryCompatible, @@ -309,16 +320,23 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { ), mimaPreviousArtifacts := { val currentScalaFullV = scalaVersion.value - val previousScalaFullV = - PreviousScalaVersion.getOrElse(currentScalaFullV, currentScalaFullV) - val previousScalaVCrossName = CrossVersion( - crossVersion.value, - previousScalaFullV, - scalaBinaryVersion.value - ).getOrElse(identity[String] _)(moduleName.value) - Set( - organizationName.value % previousScalaVCrossName % stableVersion.value - ) + val maybePreviousScalaFullV = + PreviousScalaVersion.get(currentScalaFullV) match { + case Some(Some(previous)) => Some(previous) + case None => Some(currentScalaFullV) + case _ => None + } + + maybePreviousScalaFullV.fold(Set.empty[ModuleID]) { previousScalaFullV => + val previousScalaVCrossName = CrossVersion( + crossVersion.value, + previousScalaFullV, + scalaBinaryVersion.value + ).getOrElse(identity[String] _)(moduleName.value) + Set( + organizationName.value % previousScalaVCrossName % stableVersion.value + ) + } }, mimaBinaryIssueFilters ++= Mima.ignoredABIProblems ) diff --git a/scalafix-cli/src/main/scala/scalafix/internal/interfaces/ScalafixImpl.scala b/scalafix-cli/src/main/scala/scalafix/internal/interfaces/ScalafixImpl.scala index 9ca06f82d..2b922d4d5 100644 --- a/scalafix-cli/src/main/scala/scalafix/internal/interfaces/ScalafixImpl.scala +++ b/scalafix-cli/src/main/scala/scalafix/internal/interfaces/ScalafixImpl.scala @@ -34,6 +34,12 @@ final class ScalafixImpl extends Scalafix { Versions.scala212 override def scala213(): String = Versions.scala213 + override def scala33(): String = + Versions.scala33 + override def scala35(): String = + Versions.scala35 + override def scala36(): String = + Versions.scala36 override def scala3LTS(): String = Versions.scala3LTS override def scala3Next(): String = diff --git a/scalafix-interfaces/src/main/java/scalafix/interfaces/Scalafix.java b/scalafix-interfaces/src/main/java/scalafix/interfaces/Scalafix.java index a8059e6ed..a731a5d4c 100644 --- a/scalafix-interfaces/src/main/java/scalafix/interfaces/Scalafix.java +++ b/scalafix-interfaces/src/main/java/scalafix/interfaces/Scalafix.java @@ -70,6 +70,21 @@ public interface Scalafix { */ String scala213(); + /** + * The Scala 3.3 version in {@link #supportedScalaVersions()} + */ + String scala33(); + + /** + * The Scala 3.5 version in {@link #supportedScalaVersions()} + */ + String scala35(); + + /** + * The Scala 3.6 version in {@link #supportedScalaVersions()} + */ + String scala36(); + /** * The Scala 3 LTS version in {@link #supportedScalaVersions()} */ @@ -135,7 +150,11 @@ static Scalafix fetchAndClassloadInstance(String requestedScalaVersion, List Order[List[T]]: + def compare(x: List[T], y: List[T]) = elementOrder.compare(x.head, y.head) diff --git a/scalafix-tests/integration/src/test/scala/scalafix/tests/interfaces/ScalafixSuite.scala b/scalafix-tests/integration/src/test/scala/scalafix/tests/interfaces/ScalafixSuite.scala index e189de24b..b20f0477c 100644 --- a/scalafix-tests/integration/src/test/scala/scalafix/tests/interfaces/ScalafixSuite.scala +++ b/scalafix-tests/integration/src/test/scala/scalafix/tests/interfaces/ScalafixSuite.scala @@ -43,6 +43,9 @@ class ScalafixSuite extends AnyFunSuite { assert(api.scalametaVersion() == Versions.scalameta) assert(api.scala212() == Versions.scala212) assert(api.scala213() == Versions.scala213) + assert(api.scala33() == Versions.scala33) + assert(api.scala35() == Versions.scala35) + assert(api.scala36() == Versions.scala36) assert(api.scala3LTS() == Versions.scala3LTS) assert(api.scala3Next() == Versions.scala3Next) assert( @@ -113,13 +116,23 @@ class ScalafixSuite extends AnyFunSuite { assert(scalafixAPI.scalaVersion() == Versions.scala3LTS) } - test("classload Scala 3 Next with full post-LTS version") { - val scalafixAPI = Scalafix.fetchAndClassloadInstance("3.4.0", repositories) - assert(scalafixAPI.scalaVersion() == Versions.scala3Next) + test("classload Scala 3.5 with full version") { + val scalafixAPI = Scalafix.fetchAndClassloadInstance("3.5.2", repositories) + assert(scalafixAPI.scalaVersion() == Versions.scala35) } - test("classload Scala 3 Next with major.minor post-LTS version") { + test("classload Scala 3.5 with major.minor version") { val scalafixAPI = Scalafix.fetchAndClassloadInstance("3.5", repositories) + assert(scalafixAPI.scalaVersion() == Versions.scala35) + } + + test("classload Scala 3 Next with full version") { + val scalafixAPI = Scalafix.fetchAndClassloadInstance("3.6.2", repositories) + assert(scalafixAPI.scalaVersion() == Versions.scala3Next) + } + + test("classload Scala 3 Next with major.minor version") { + val scalafixAPI = Scalafix.fetchAndClassloadInstance("3.6", repositories) assert(scalafixAPI.scalaVersion() == Versions.scala3Next) } diff --git a/scalafix-tests/output/src/main/scala-3next/test/explicitResultTypes/Scala3_6OrGreater.scala b/scalafix-tests/output/src/main/scala-3next/test/explicitResultTypes/Scala3_6OrGreater.scala new file mode 100644 index 000000000..3fd1760a5 --- /dev/null +++ b/scalafix-tests/output/src/main/scala-3next/test/explicitResultTypes/Scala3_6OrGreater.scala @@ -0,0 +1,11 @@ +package test.explicitResultTypes + +trait Order[T]: + extension (values: Seq[T]) def toSorted: Seq[T] = ??? + def compare(x: T, y: T): Int + +given Order[Int]: + def compare(x: Int, y: Int): Int = ??? + +given listOrdering: [T: Order as elementOrder] => Order[List[T]]: + def compare(x: List[T], y: List[T]): Int = elementOrder.compare(x.head, y.head) diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala b/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala index 756cede83..80b83aa4d 100644 --- a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala +++ b/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala @@ -25,6 +25,9 @@ class InterfacesPropertiesSuite extends AnyFunSuite with BeforeAndAfterAll { check("scalametaVersion", Versions.scalameta) check("scala212", Versions.scala212) check("scala213", Versions.scala213) + check("scala33", Versions.scala33) + check("scala35", Versions.scala35) + check("scala36", Versions.scala36) check("scala3LTS", Versions.scala3LTS) check("scala3Next", Versions.scala3Next)