diff --git a/build.sbt b/build.sbt index 87bf33116..977a1ad47 100644 --- a/build.sbt +++ b/build.sbt @@ -284,7 +284,22 @@ lazy val unit = projectMatrix ), Test / test := (Test / test) .dependsOn(cli.projectRefs.map(_ / publishLocalTransitive): _*) - .value + .value, + Test / unmanagedSourceDirectories ++= { + val sourceDir = (Test / sourceDirectory).value + val maybeTargetScalaVersion = + TargetAxis + .targetScalaVersion(virtualAxes.value) + .flatMap(CrossVersion.partialVersion(_)) + maybeTargetScalaVersion match { + case Some((n, m)) => + Seq( + sourceDir / s"scala-target$n", + sourceDir / s"scala-target$n.$m" + ) + case _ => Seq() + } + } ) .defaultAxes(VirtualAxis.jvm) .jvmPlatform( diff --git a/project/ScalafixBuild.scala b/project/ScalafixBuild.scala index b9a56c712..aeafeb1d9 100644 --- a/project/ScalafixBuild.scala +++ b/project/ScalafixBuild.scala @@ -129,7 +129,7 @@ object ScalafixBuild extends AutoPlugin with GhpagesKeys { s }, commands += Command.command("ci-3") { s => - "unit2_12Target3/testOnly scalafix.tests.rule.RuleSuite" :: + "unit2_12Target3/test" :: s }, commands += Command.command("ci-213") { s => diff --git a/project/TargetAxis.scala b/project/TargetAxis.scala index 57b246cf5..753c6160f 100644 --- a/project/TargetAxis.scala +++ b/project/TargetAxis.scala @@ -14,8 +14,8 @@ case class TargetAxis(scalaVersion: String) extends VirtualAxis.WeakAxis { object TargetAxis { - private def targetScalaVersion(virtualAxes: Seq[VirtualAxis]): String = - virtualAxes.collectFirst { case a: TargetAxis => a.scalaVersion }.get + def targetScalaVersion(virtualAxes: Seq[VirtualAxis]): Option[String] = + virtualAxes.collectFirst { case a: TargetAxis => a.scalaVersion } /** * When invoked on a ProjectMatrix with a TargetAxis, lookup the project @@ -27,7 +27,7 @@ object TargetAxis { key: TaskKey[T] ): Def.Initialize[Task[T]] = Def.taskDyn { - val sv = targetScalaVersion(virtualAxes.value) + val sv = targetScalaVersion(virtualAxes.value).get val project = matrix.finder().apply(sv) Def.task((project / key).value) } @@ -42,7 +42,7 @@ object TargetAxis { key: SettingKey[T] ): Def.Initialize[T] = Def.settingDyn { - val sv = targetScalaVersion(virtualAxes.value) + val sv = targetScalaVersion(virtualAxes.value).get val project = matrix.finder().apply(sv) Def.setting((project / key).value) } diff --git a/scalafix-tests/unit/src/test/scala-2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala b/scalafix-tests/unit/src/test/scala-target2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala similarity index 97% rename from scalafix-tests/unit/src/test/scala-2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala rename to scalafix-tests/unit/src/test/scala-target2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala index a19f5fa55..56200ae3f 100644 --- a/scalafix-tests/unit/src/test/scala-2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala +++ b/scalafix-tests/unit/src/test/scala-target2.12/scalafix/tests/v0/LegacySyntheticsSuite.scala @@ -3,6 +3,7 @@ package scalafix.tests.v0 import scala.meta._ import scalafix.tests.core.BaseSemanticSuite +// LegacySyntheticsTest cannot be compiled with Scala 2.13 or Scala 3 class LegacySyntheticsSuite extends BaseSemanticSuite("LegacySyntheticsTest") { test("text") { diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/BaseCliSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/BaseCliSuite.scala similarity index 93% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/cli/BaseCliSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/BaseCliSuite.scala index ddff9e17f..d35911f2b 100644 --- a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/BaseCliSuite.scala +++ b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/BaseCliSuite.scala @@ -159,10 +159,16 @@ trait BaseCliSuite extends AnyFunSuite with DiffAssertions { ) } + // The defaults of this helper expect to find test input which is currently + // built only on scala 2.x since building them for Scala 3 would trigger + // test failures as the rules they exercise are not supported on Scala 3. + // TODO: switch defaults to rely on much more simple test input/rules so + // that we don't need to hardcode a scala version here. + val sourceDir = "scalafix-tests/input/src/main/scala-2" + def sourceDirectory: AbsolutePath = props.inputSourceDirectories - // TODO: This test won't work for scala 3. The path is hardcoded - .find(dir => dir.toNIO.endsWith("scala-2")) // Skip scala-2.12 + .find(dir => dir.toNIO.endsWith(sourceDir)) .getOrElse { throw new IllegalArgumentException( props.inputSourceDirectories.toString() @@ -195,8 +201,7 @@ trait BaseCliSuite extends AnyFunSuite with DiffAssertions { test(name, SkipWindows) { val fileIsFixed = expectedExit.isOk val cwd = Files.createTempDirectory("scalafix") - val inputSourceDirectory = - cwd.resolve("scalafix-tests/input/src/main/scala-2/") + val inputSourceDirectory = cwd.resolve(sourceDir) Files.createDirectories(inputSourceDirectory) val root = AbsolutePath(inputSourceDirectory) val out = new ByteArrayOutputStream() diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSemanticSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSemanticSuite.scala similarity index 100% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSemanticSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSemanticSuite.scala diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSuppressSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSuppressSuite.scala similarity index 100% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSuppressSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSuppressSuite.scala diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSyntacticSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSyntacticSuite.scala similarity index 100% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/cli/CliSyntacticSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/cli/CliSyntacticSuite.scala diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/core/PrettyTypeSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/util/PrettyTypeSuite.scala similarity index 97% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/core/PrettyTypeSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/util/PrettyTypeSuite.scala index 2a04dedde..817293406 100644 --- a/scalafix-tests/unit/src/test/scala/scalafix/tests/core/PrettyTypeSuite.scala +++ b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/util/PrettyTypeSuite.scala @@ -29,6 +29,9 @@ class BasePrettyTypeSuite extends BaseSemanticSuite("TypeToTreeInput") { val classpath: Classpath = Classpaths.withDirectories(semanticdbTargetRoots :+ classDir) + + // As of scalameta 4.5.3, this relies on scalap (and not on TASTy), so it + // cannot work against classes compiled with Scala 3 val table: GlobalSymbolTable = GlobalSymbolTable(classpath, includeJdk = true) } diff --git a/scalafix-tests/unit/src/test/scala/scalafix/tests/v1/SymbolSuite.scala b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/v1/SymbolSuite.scala similarity index 83% rename from scalafix-tests/unit/src/test/scala/scalafix/tests/v1/SymbolSuite.scala rename to scalafix-tests/unit/src/test/scala-target2/scalafix/tests/v1/SymbolSuite.scala index bf176bea1..cc7acaf2f 100644 --- a/scalafix-tests/unit/src/test/scala/scalafix/tests/v1/SymbolSuite.scala +++ b/scalafix-tests/unit/src/test/scala-target2/scalafix/tests/v1/SymbolSuite.scala @@ -22,6 +22,9 @@ class SymbolSuite extends munit.FunSuite { case Term.ApplyInfix(_, Term.Name("shouldBe"), _, arg :: Nil) => arg } + // The symbol lookup fails against Scala 3.1.1 SemanticDB as the position + // there excludes surrounding parentheses while 2.x (scalac-semanticdb) and + // the parser include them assertNotEquals(arg.symbol, Symbol.None) } diff --git a/scalafix-tests/unit/src/test/scala-2.12/scalafix/tests/cli/InterfacesPropertiesSuite.scala b/scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala similarity index 100% rename from scalafix-tests/unit/src/test/scala-2.12/scalafix/tests/cli/InterfacesPropertiesSuite.scala rename to scalafix-tests/unit/src/test/scala/scalafix/tests/cli/InterfacesPropertiesSuite.scala