diff --git a/build.sbt b/build.sbt index 7bb4d65eb8..4a2bc7ea76 100644 --- a/build.sbt +++ b/build.sbt @@ -37,11 +37,6 @@ inThisBuild( Resolver.sonatypeRepo("releases"), Resolver.sonatypeRepo("snapshots") ), - libraryDependencies ++= List( - munit.value % Test, - scalacheck % Test, - scalametaTestkit % Test - ), testFrameworks += new TestFramework("munit.Framework") ) ) @@ -64,7 +59,7 @@ commands += Command.command("ci-test") { s => s } -lazy val dynamic = project +lazy val dynamic = crossProject(JVMPlatform, NativePlatform) .in(file("scalafmt-dynamic")) .settings( moduleName := "scalafmt-dynamic", @@ -76,14 +71,24 @@ lazy val dynamic = project "io.get-coursier" % "interface" % "0.0.17", "com.typesafe" % "config" % "1.4.1", munit.value % Test, - scalametaTestkit % Test + scalametaTestkit.value % Test ), scalacOptions ++= scalacJvmOptions.value ) + .nativeSettings( + libraryDependencies ++= List( + // "org.ekrich" %%% "sconfig" % "x.y.z", + "org.ekrich" %%% "sjavatime" % "1.1.5" + ), + nativeLinkStubs := true + ) .dependsOn(interfaces) .enablePlugins(BuildInfoPlugin) -lazy val interfaces = project +lazy val dynamicJVM = dynamic.jvm +lazy val dynamicNative = dynamic.native + +lazy val interfaces = crossProject(JVMPlatform, NativePlatform) .in(file("scalafmt-interfaces")) .settings( moduleName := "scalafmt-interfaces", @@ -100,14 +105,16 @@ lazy val interfaces = project } ) -lazy val core = crossProject(JVMPlatform) +lazy val interfacesJVM = interfaces.jvm +lazy val interfacesNative = interfaces.native + +lazy val core = crossProject(JVMPlatform, NativePlatform) .in(file("scalafmt-core")) .settings( moduleName := "scalafmt-core", buildInfoSettings, scalacOptions ++= scalacJvmOptions.value, libraryDependencies ++= Seq( - metaconfig.value, scalameta.value, // scala-reflect is an undeclared dependency of fansi, see #1252. // Scalafmt itself does not require scala-reflect. @@ -128,21 +135,23 @@ lazy val core = crossProject(JVMPlatform) } } ) - // .jsSettings( - // libraryDependencies ++= List( - // metaconfigHocon.value, - // scalatest.value % Test // must be here for coreJS/test to run anything - // ) - // ) + .nativeSettings( + libraryDependencies ++= List( + metaconfigSconfig.value + ), + nativeLinkStubs := true + ) .jvmSettings( Test / run / fork := true, libraryDependencies ++= List( - metaconfigTypesafe.value + metaconfigTypesafe.value, + metaconfig.value ) ) .enablePlugins(BuildInfoPlugin) + lazy val coreJVM = core.jvm -// lazy val coreJS = core.js +lazy val coreNative = core.native import sbtassembly.AssemblyPlugin.defaultUniversalScript @@ -160,7 +169,7 @@ val scalacJvmOptions = Def.setting { } } -lazy val cli = project +lazy val cli = crossProject(JVMPlatform, NativePlatform) .in(file("scalafmt-cli")) .settings( moduleName := "scalafmt-cli", @@ -175,9 +184,8 @@ lazy val cli = project oldStrategy(x) }, libraryDependencies ++= Seq( - "com.googlecode.java-diff-utils" % "diffutils" % "1.3.0", - "com.martiansoftware" % "nailgun-server" % "0.9.1", - "com.github.scopt" %% "scopt" % "4.0.1", + // "com.googlecode.java-diff-utils" % "diffutils" % "1.3.0", + "com.github.scopt" %%% "scopt" % "4.0.1", // undeclared transitive dependency of coursier-small "org.scala-lang.modules" %% "scala-xml" % "1.3.0" ), @@ -196,28 +204,47 @@ lazy val cli = project .toSeq } ) - .dependsOn(coreJVM, dynamic) + .jvmSettings { + libraryDependencies += "com.martiansoftware" % "nailgun-server" % "0.9.1", + } + .nativeSettings { + nativeLinkStubs := true + } + .dependsOn(core, dynamic) .enablePlugins(GraalVMNativeImagePlugin) -lazy val tests = project +lazy val cliJVM = cli.jvm +lazy val cliNative = cli.native + +lazy val tests = crossProject(JVMPlatform, NativePlatform) .in(file("scalafmt-tests")) .settings( publish / skip := true, libraryDependencies ++= Seq( // Test dependencies - "com.lihaoyi" %% "scalatags" % "0.9.4", - scalametaTestkit, + "com.lihaoyi" %%% "scalatags" % "0.9.4", + scalametaTestkit.value, munit.value ), scalacOptions ++= scalacJvmOptions.value, - javaOptions += "-Dfile.encoding=UTF8", buildInfoPackage := "org.scalafmt.tests", buildInfoKeys := Seq[BuildInfoKey]( - "resourceDirectory" -> (Test / resourceDirectory).value + "resourceDirectory" -> (baseDirectory.value / ".." / "shared" / "src" / "test" / "resources") ) ) .enablePlugins(BuildInfoPlugin) - .dependsOn(coreJVM, dynamic, cli) + .dependsOn(core, dynamic, cli) + .nativeSettings( + nativeConfig ~= { + _.withMode(scalanative.build.Mode.debug) + .withLinkStubs(true) + } + ).jvmSettings( + javaOptions += "-Dfile.encoding=UTF8" + ) + +lazy val testsJVM = tests.jvm +lazy val testsNative = tests.native lazy val benchmarks = project .in(file("scalafmt-benchmarks")) @@ -225,7 +252,7 @@ lazy val benchmarks = project publish / skip := true, moduleName := "scalafmt-benchmarks", libraryDependencies ++= Seq( - scalametaTestkit + scalametaTestkit.value ), run / javaOptions ++= Seq( "-Djava.net.preferIPv4Stack=true", @@ -254,7 +281,7 @@ lazy val docs = project publish / skip := true, mdoc := (Compile / run).evaluated ) - .dependsOn(cli, dynamic) + .dependsOn(cliJVM, dynamicJVM) .enablePlugins(DocusaurusPlugin) val V = "\\d+\\.\\d+\\.\\d+" diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 25818e8a90..0908e2e593 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,7 +6,7 @@ import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._ object Dependencies { val metaconfigV = "0.9.13" - val scalametaV = "4.4.19" + val scalametaV = "4.4.22" val scalacheckV = "1.15.4" val coursier = "1.0.3" val munitV = "0.7.26" @@ -18,13 +18,14 @@ object Dependencies { ) } - val scalametaTestkit = "org.scalameta" %% "testkit" % scalametaV + val scalametaTestkit = Def.setting("org.scalameta" %%% "testkit" % scalametaV) val scalacheck = "org.scalacheck" %% "scalacheck" % scalacheckV val munit = Def.setting("org.scalameta" %%% "munit" % munitV) val scalameta = Def.setting("org.scalameta" %%% "scalameta" % scalametaV excludeAll scalapb.value) val metaconfig = Def.setting("com.geirsson" %%% "metaconfig-core" % metaconfigV) + val metaconfigSconfig = Def.setting("com.geirsson" %%% "metaconfig-sconfig" % metaconfigV) val metaconfigTypesafe = Def.setting("com.geirsson" %%% "metaconfig-typesafe-config" % metaconfigV) val metaconfigHocon = Def.setting("com.geirsson" %%% "metaconfig-hocon" % metaconfigV) diff --git a/project/plugins.sbt b/project/plugins.sbt index e490e797a5..d1d022cb18 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,3 +14,6 @@ addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.5.1") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.9.2") addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.8.1") + +addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.0.0") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.0") diff --git a/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/CliUtils.scala b/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/CliUtils.scala new file mode 100644 index 0000000000..07cc73f769 --- /dev/null +++ b/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/CliUtils.scala @@ -0,0 +1,31 @@ +package org.scalafmt.cli + +import com.martiansoftware.nailgun.NGContext +import org.scalafmt.util.AbsoluteFile + +trait CliUtils { this: Cli => + + def nailMain(nGContext: NGContext): Unit = { + val workingDirectory = + AbsoluteFile.fromPath(nGContext.getWorkingDirectory).getOrElse { + throw new IllegalStateException( + s"Expected absolute path, " + + s"obtained nGContext.getWorkingDirectory = ${nGContext.getWorkingDirectory}" + ) + } + val exit = mainWithOptions( + nGContext.getArgs, + CliOptions.default.copy( + common = CliOptions.default.common.copy( + cwd = workingDirectory, + out = nGContext.out, + in = nGContext.in, + err = nGContext.err + ) + ) + ) + nGContext.exit(exit.code) + } + + protected val isNative: Boolean = false +} diff --git a/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/TermUtils.scala b/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/TermUtils.scala new file mode 100644 index 0000000000..b225dba092 --- /dev/null +++ b/scalafmt-cli/jvm/src/main/scala/org/scalafmt/cli/TermUtils.scala @@ -0,0 +1,12 @@ +package org.scalafmt.cli + +import java.sql.Timestamp + +trait TermUtils { + + private val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + protected def formatTimestamp(ts: Long): String = + format.format(new Timestamp(ts)) + + def noConsole = System.console() == null +} diff --git a/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/CliUtils.scala b/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/CliUtils.scala new file mode 100644 index 0000000000..6bc2470ca8 --- /dev/null +++ b/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/CliUtils.scala @@ -0,0 +1,6 @@ +package org.scalafmt.cli + + +trait CliUtils { + protected val isNative: Boolean = true +} diff --git a/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/TermUtils.scala b/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/TermUtils.scala new file mode 100644 index 0000000000..4458150fdd --- /dev/null +++ b/scalafmt-cli/native/src/main/scala/org/scalafmt/cli/TermUtils.scala @@ -0,0 +1,14 @@ +package org.scalafmt.cli + +import java.time.Instant + +trait TermUtils { + + // TODO print according to format + // private val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + protected def formatTimestamp(ts: Long): String ={ + Instant.ofEpochMilli(ts).toString + + } + def noConsole = true +} diff --git a/scalafmt-cli/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/native-image.properties b/scalafmt-cli/shared/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/native-image.properties similarity index 100% rename from scalafmt-cli/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/native-image.properties rename to scalafmt-cli/shared/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/native-image.properties diff --git a/scalafmt-cli/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/reflection.json b/scalafmt-cli/shared/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/reflection.json similarity index 100% rename from scalafmt-cli/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/reflection.json rename to scalafmt-cli/shared/src/main/resources/META-INF/native-image/org.scalafmt/scalafmt-cli/reflection.json diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/Cli.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/Cli.scala similarity index 83% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/Cli.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/Cli.scala index f920520d65..765242dc8c 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/Cli.scala +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/Cli.scala @@ -1,6 +1,5 @@ package org.scalafmt.cli -import com.martiansoftware.nailgun.NGContext import java.nio.file.{Files, Paths} import org.scalafmt.Versions @@ -9,28 +8,7 @@ import org.scalafmt.util.AbsoluteFile import scala.io.Source import scala.util.control.NoStackTrace -object Cli { - def nailMain(nGContext: NGContext): Unit = { - val workingDirectory = - AbsoluteFile.fromPath(nGContext.getWorkingDirectory).getOrElse { - throw new IllegalStateException( - s"Expected absolute path, " + - s"obtained nGContext.getWorkingDirectory = ${nGContext.getWorkingDirectory}" - ) - } - val exit = mainWithOptions( - nGContext.getArgs, - CliOptions.default.copy( - common = CliOptions.default.common.copy( - cwd = workingDirectory, - out = nGContext.out, - in = nGContext.in, - err = nGContext.err - ) - ) - ) - nGContext.exit(exit.code) - } +class Cli extends CliUtils { private def throwIfError(exit: ExitCode): Unit = { if (exit != ExitCode.Ok) { @@ -38,10 +16,10 @@ object Cli { } } - def main(args: Array[String]): Unit = { - val exit = mainWithOptions(args, CliOptions.default) - sys.exit(exit.code) - } + // def main(args: Array[String]): Unit = { + // val exit = mainWithOptions(args, CliOptions.default) + // sys.exit(exit.code) + // } def exceptionThrowingMain(args: Array[String]): Unit = { val exit = mainWithOptions(args, CliOptions.default) @@ -99,7 +77,7 @@ object Cli { // - `scalafmt-core` if the specified `version` setting match with build version // (or if the `version` is not specified). options.getVersionIfDifferent match { - case Some(v) if isNativeImage => + case Some(v) if isNativeImage || isNative => Left( s"""error: invalid Scalafmt version. | @@ -156,3 +134,19 @@ object Cli { } } } + +object Cli extends Cli { + + def main(args: Array[String]): Unit = { + val workingDirectory = Paths.get(".").toAbsolutePath + val options = CliOptions.default.copy( + common = CommonOptions( + in = System.in, + out = System.out, + err = System.err, + cwd = AbsoluteFile.fromPath(workingDirectory).get + ) + ) + mainWithOptions(args, options) + } +} diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliArgParser.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/CliArgParser.scala similarity index 99% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/CliArgParser.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/CliArgParser.scala index 363809a792..a4bcb893f5 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliArgParser.scala +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/CliArgParser.scala @@ -28,8 +28,7 @@ object CliArgParser { val scoptParser: OptionParser[CliOptions] = new scopt.OptionParser[CliOptions]("scalafmt") { - override def showUsageOnError: Option[Boolean] = Some(false) - + override def showUsageOnError: Option[Boolean] = Some(false) private def printAndExit( includeUsage: Boolean )(ignore: Unit, c: CliOptions): CliOptions = { diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/CliOptions.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/CliOptions.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ExitCode.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ExitCode.scala similarity index 89% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/ExitCode.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ExitCode.scala index b9e7f74f43..c820d58b78 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ExitCode.scala +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ExitCode.scala @@ -1,6 +1,7 @@ package org.scalafmt.cli import scala.collection.mutable +import org.scalafmt.CompatCollections sealed abstract case class ExitCode(code: Int, name: String) { def isOk: Boolean = this == ExitCode.Ok @@ -14,8 +15,7 @@ object ExitCode { // for example how the name is calculated for merged exit codes. private var counter = 0 private val allInternal = mutable.ListBuffer.empty[ExitCode] - private val cache = - new java.util.concurrent.ConcurrentHashMap[Int, ExitCode] + private val cache : mutable.Map[Int, ExitCode] = CompatCollections.concurrentMap[Int, ExitCode] private def generateExitStatus(implicit name: sourcecode.Name) = { val code = counter counter = if (counter == 0) 1 else counter << 1 @@ -44,7 +44,7 @@ object ExitCode { } } def apply(code: Int): ExitCode = { - if (cache.contains(code)) cache.get(code) + if (cache.contains(code)) cache(code) else { val result = new ExitCode(code, codeToName(code)) {} cache.put(code, result) diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/FileFetchMode.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/FileFetchMode.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/FileFetchMode.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/FileFetchMode.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/InputMethod.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/InputMethod.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/InputMethod.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/InputMethod.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/Scalafmt210.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/Scalafmt210.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/Scalafmt210.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/Scalafmt210.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtCliReporter.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtCliReporter.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtCliReporter.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtCliReporter.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala similarity index 88% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala index 93296f65ec..d3193fd0e2 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtCoreRunner.scala @@ -22,18 +22,17 @@ object ScalafmtCoreRunner extends ScalafmtRunner { ExitCode.UnexpectedError } { scalafmtConf => options.common.debug.println(s"parsed config (v${Versions.version})") - val filterMatcher = ProjectFiles.FileMatcher( + lazy val filterMatcher = ProjectFiles.FileMatcher( scalafmtConf.project, options.customExcludes ) - val inputMethods = getInputMethods(options, filterMatcher.matchesFile) if (inputMethods.isEmpty && options.mode.isEmpty && !options.stdIn) throw NoMatchingFiles val counter = new AtomicInteger() - val termDisplay = - newTermDisplay(options, inputMethods, termDisplayMessage) + // val termDisplay = + // newTermDisplay(options, inputMethods, termDisplayMessage) val exitCode = new AtomicReference(ExitCode.Ok) Breaks.breakable { inputMethods.par.foreach { inputMethod => @@ -41,14 +40,14 @@ object ScalafmtCoreRunner extends ScalafmtRunner { exitCode.getAndUpdate(ExitCode.merge(code, _)) if (options.check && !code.isOk) Breaks.break PlatformTokenizerCache.megaCache.clear() - termDisplay.taskProgress( - termDisplayMessage, - counter.incrementAndGet() - ) + // termDisplay.taskProgress( + // termDisplayMessage, + // counter.incrementAndGet() + // ) } } - termDisplay.completedTask(termDisplayMessage, exitCode.get.isOk) - termDisplay.stop() + // termDisplay.completedTask(termDisplayMessage, exitCode.get.isOk) + // termDisplay.stop() exitCode.get() } diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtDynamicRunner.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtDynamicRunner.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtDynamicRunner.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtDynamicRunner.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtRunner.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtRunner.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/ScalafmtRunner.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/ScalafmtRunner.scala diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/TermDisplay.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/TermDisplay.scala similarity index 94% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/TermDisplay.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/TermDisplay.scala index d453fc9bc3..399ea2f9fe 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/TermDisplay.scala +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/TermDisplay.scala @@ -12,8 +12,8 @@ import scala.util.Try import java.io.File import java.io.Writer -import java.sql.Timestamp import java.util.concurrent._ +import org.scalafmt.CompatCollections object Terminal { @@ -64,7 +64,7 @@ object Terminal { } -object TermDisplay { +object TermDisplay extends TermUtils { def defaultFallbackMode: Boolean = { val env0 = sys.env.get("COURSIER_PROGRESS").map(_.toLowerCase).collect { @@ -73,7 +73,7 @@ object TermDisplay { } def compatibilityEnv = sys.env.get("COURSIER_NO_TERM").nonEmpty - def nonInteractive = System.console() == null + def nonInteractive = noConsole def insideEmacs = sys.env.contains("INSIDE_EMACS") def ci = sys.env.contains("CI") @@ -138,10 +138,6 @@ object TermDisplay { } } - private val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - private def formatTimestamp(ts: Long): String = - format.format(new Timestamp(ts)) - private case class CheckUpdateInfo( currentTimeOpt: Option[Long], remoteTimeOpt: Option[Long], @@ -197,10 +193,10 @@ object TermDisplay { private var width = 80 private var currentHeight = 0 - private val q = new LinkedBlockingDeque[Message] + private val q = CompatCollections.concurrentQueue[Message] def update(): Unit = { - if (q.size() == 0) + if (q.size == 0) q.put(Message.Update) } @@ -211,15 +207,15 @@ object TermDisplay { private val downloads = new ArrayBuffer[String] private val doneQueue = new ArrayBuffer[(String, Info)] - val infos = new ConcurrentHashMap[String, Info] + val infos = CompatCollections.concurrentMap[String, Info] def newEntry( url: String, info: Info, fallbackMessage: => String ): Unit = { - assert(!infos.containsKey(url)) - val prev = infos.putIfAbsent(url, info) + assert(!infos.contains(url)) + val prev = infos.put(url, info) assert(prev == null) if (fallbackMode) { @@ -247,8 +243,10 @@ object TermDisplay { val info = infos.remove(url) - if (success) - doneQueue += (url -> update0(info)) + info.foreach { i => + doneQueue += (url -> update0(i)) + } + } if (fallbackMode && success) { @@ -338,7 +336,7 @@ object TermDisplay { doneQueue.clear() val dw = downloads.toVector - .map { url => url -> infos.get(url) } + .map { url => url -> infos(url) } .sortBy { case (_, info) => -info.fraction.sum } (q, dw) @@ -392,7 +390,7 @@ object TermDisplay { case Some(Message.Update) => val downloads0 = downloads.synchronized { downloads.toVector - .map { url => url -> infos.get(url) } + .flatMap { url => infos.get(url).map(i => url -> i) } .sortBy { case (_, info) => -info.fraction.sum } } @@ -481,9 +479,8 @@ class TermDisplay( alreadyDownloaded: Long ): Unit = { val info = updateThread.infos.get(url) - assert(info != null) val newInfo = info match { - case info0: DownloadInfo => + case Some(info0: DownloadInfo) => info0.copy( length = Some(totalLength), previouslyDownloaded = alreadyDownloaded @@ -497,9 +494,9 @@ class TermDisplay( } override def taskProgress(url: String, downloaded: Long): Unit = { val info = updateThread.infos.get(url) - if (info != null) { // We might not want the progress bar. + if (info.isDefined) { // We might not want the progress bar. val newInfo = info match { - case info0: DownloadInfo => + case Some(info0: DownloadInfo) => info0.copy(downloaded = downloaded) case _ => throw new Exception(s"Incoherent display state for $url") diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/WriteMode.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/WriteMode.scala similarity index 100% rename from scalafmt-cli/src/main/scala/org/scalafmt/cli/WriteMode.scala rename to scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/WriteMode.scala diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Chunk.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Chunk.scala new file mode 100644 index 0000000000..297233b4d1 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Chunk.scala @@ -0,0 +1,12 @@ +package org.scalafmt.cli.difflib + +import java.util + +class Chunk[T](position: Int, lines: util.List[T]) { + + def getPosition: Int = position + def getLines: util.List[T] = lines + def size: Int = lines.size() + + override def toString: String = s"Chunk($getPosition, $getLines, $size)" +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Delta.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Delta.scala new file mode 100644 index 0000000000..cb8666eb50 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Delta.scala @@ -0,0 +1,28 @@ +package org.scalafmt.cli.difflib + +sealed abstract class Delta[T](original: Chunk[T], revised: Chunk[T]) { + + sealed abstract class TYPE + object TYPE { + case object CHANGE extends TYPE + case object DELETE extends TYPE + case object INSERT extends TYPE + } + def getType: TYPE + def getOriginal: Chunk[T] = original + def getRevised: Chunk[T] = revised + + override def toString: String = s"Delta($getType, $getOriginal, $getRevised)" +} +class ChangeDelta[T](original: Chunk[T], revised: Chunk[T]) + extends Delta(original, revised) { + override def getType: TYPE = TYPE.CHANGE +} +class InsertDelta[T](original: Chunk[T], revised: Chunk[T]) + extends Delta(original, revised) { + override def getType: TYPE = TYPE.INSERT +} +class DeleteDelta[T](original: Chunk[T], revised: Chunk[T]) + extends Delta(original, revised) { + override def getType: TYPE = TYPE.DELETE +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffAlgorithm.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffAlgorithm.scala new file mode 100644 index 0000000000..5006f98140 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffAlgorithm.scala @@ -0,0 +1,7 @@ +package org.scalafmt.cli.difflib + +import java.util + +trait DiffAlgorithm[T] { + def diff(original: util.List[T], revised: util.List[T]): Patch[T] +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffUtils.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffUtils.scala new file mode 100644 index 0000000000..46ad882bd6 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DiffUtils.scala @@ -0,0 +1,163 @@ +package org.scalafmt.cli.difflib + +import java.util + +object DiffUtils { + def generateUnifiedDiff( + original: String, + revised: String, + originalLines: util.List[String], + patch: Patch[String], + contextSize: Int + ): util.List[String] = { + if (!patch.getDeltas.isEmpty) { + val ret: util.List[String] = new util.ArrayList() + ret.add("--- " + original) + ret.add("+++ " + revised) + val patchDeltas: util.List[Delta[String]] = + new util.ArrayList(patch.getDeltas) + val deltas: util.List[Delta[String]] = new util.ArrayList() + + var delta = patchDeltas.get(0) + deltas.add(delta) + + if (patchDeltas.size() > 1) { + for (i <- 1 until patchDeltas.size) { + val position = delta.getOriginal.getPosition // store + // the + // current + // position + // of + // the first Delta + // Check if the next Delta is too close to the current + // position. + // And if it is, add it to the current set + val nextDelta = patchDeltas.get(i) + if ( + (position + delta.getOriginal.size + contextSize) >= + (nextDelta.getOriginal.getPosition - contextSize) + ) { + deltas.add(nextDelta) + } else { // if it isn't, output the current set, + // then create a new set and add the current Delta to + // it. + val curBlock = processDeltas(originalLines, deltas, contextSize) + ret.addAll(curBlock) + deltas.clear() + deltas.add(nextDelta) + } + delta = nextDelta + } + } + val curBlock = processDeltas(originalLines, deltas, contextSize) + ret.addAll(curBlock) + ret + } else { + new util.ArrayList[String]() + } + } + def diff( + original: util.List[String], + revised: util.List[String] + ): Patch[String] = + new MyersDiff[String]().diff(original, revised) + + private def processDeltas( + origLines: util.List[String], + deltas: util.List[Delta[String]], + contextSize: Int + ) = { + val buffer = new util.ArrayList[String] + var origTotal = 0 // counter for total lines output from Original + var revTotal = 0 + var line = 0 + var curDelta = deltas.get(0) + // NOTE: +1 to overcome the 0-offset Position + var origStart = curDelta.getOriginal.getPosition + 1 - contextSize + if (origStart < 1) origStart = 1 + var revStart = curDelta.getRevised.getPosition + 1 - contextSize + if (revStart < 1) revStart = 1 + // find the start of the wrapper context code + var contextStart = curDelta.getOriginal.getPosition - contextSize + if (contextStart < 0) contextStart = 0 // clamp to the start of the file + // output the context before the first Delta + line = contextStart + while ({ + line < curDelta.getOriginal.getPosition + }) { // + buffer.add(" " + origLines.get(line)) + origTotal += 1 + revTotal += 1 + + line += 1 + } + // output the first Delta + buffer.addAll(getDeltaText(curDelta)) + origTotal += curDelta.getOriginal.getLines.size + revTotal += curDelta.getRevised.getLines.size + var deltaIndex = 1 + while ({ + deltaIndex < deltas.size + }) { // for each of the other Deltas + val nextDelta = deltas.get(deltaIndex) + val intermediateStart = + curDelta.getOriginal.getPosition + curDelta.getOriginal.getLines.size + line = intermediateStart + while ({ + line < nextDelta.getOriginal.getPosition + }) { // output the code between the last Delta and this one + buffer.add(" " + origLines.get(line)) + origTotal += 1 + revTotal += 1 + + line += 1 + } + buffer.addAll(getDeltaText(nextDelta)) // output the Delta + + origTotal += nextDelta.getOriginal.getLines.size + revTotal += nextDelta.getRevised.getLines.size + curDelta = nextDelta + deltaIndex += 1 + } + // Now output the post-Delta context code, clamping the end of the file + contextStart = + curDelta.getOriginal.getPosition + curDelta.getOriginal.getLines.size + line = contextStart + while ({ + (line < (contextStart + contextSize)) && (line < origLines.size) + }) { + buffer.add(" " + origLines.get(line)) + origTotal += 1 + revTotal += 1 + + line += 1 + } + // Create and insert the block header, conforming to the Unified Diff + // standard + val header = new StringBuffer + header.append("@@ -") + header.append(origStart) + header.append(",") + header.append(origTotal) + header.append(" +") + header.append(revStart) + header.append(",") + header.append(revTotal) + header.append(" @@") + buffer.add(0, header.toString) + buffer + } + + private def getDeltaText(delta: Delta[String]) = { + import scala.collection.JavaConverters._ + val buffer = new util.ArrayList[String] + for (line <- delta.getOriginal.getLines.asScala) { + buffer.add("-" + line) + } + for (line <- delta.getRevised.getLines.asScala) { + buffer.add("+" + line) + } + buffer + } + +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DifferentiationFailedException.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DifferentiationFailedException.scala new file mode 100644 index 0000000000..cc3f7774e1 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/DifferentiationFailedException.scala @@ -0,0 +1,3 @@ +package org.scalafmt.cli.difflib + +class DifferentiationFailedException(message: String) extends Exception(message) diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Equalizer.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Equalizer.scala new file mode 100644 index 0000000000..5ea6a13a4d --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Equalizer.scala @@ -0,0 +1,12 @@ +package org.scalafmt.cli.difflib + +trait Equalizer[T] { + def equals(original: T, revised: T): Boolean +} +object Equalizer { + def default[T]: Equalizer[T] = new Equalizer[T] { + override def equals(original: T, revised: T): Boolean = { + original == revised + } + } +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/MyersDiff.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/MyersDiff.scala new file mode 100644 index 0000000000..c81a268184 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/MyersDiff.scala @@ -0,0 +1,132 @@ +package org.scalafmt.cli.difflib + +import java.util + +class MyersDiff[T](equalizer: Equalizer[T]) + extends DiffAlgorithm[T] { + def this() = this(Equalizer.default[T]) + override def diff( + original: util.List[T], + revised: util.List[T] + ): Patch[T] = { + try { + buildRevision(buildPath(original, revised), original, revised) + } catch { + case e: DifferentiationFailedException => + e.printStackTrace() + new Patch[T]() + } + } + private def buildRevision( + _path: PathNode, + orig: util.List[T], + rev: util.List[T] + ): Patch[T] = { + var path = _path + val patch = new Patch[T] + if (path.isSnake) path = path.prev + while ( + path != null && + path.prev != null && + path.prev.j >= 0 + ) { + if (path.isSnake) + throw new IllegalStateException( + "bad diffpath: found snake when looking for diff" + ) + val i = path.i + val j = path.j + path = path.prev + val ianchor = path.i + val janchor = path.j + val original = + new Chunk[T]( + ianchor, + copyOfRange(orig, ianchor, i) + ) + val revised = + new Chunk[T]( + janchor, + copyOfRange(rev, janchor, j) + ) + val delta: Delta[T] = + if (original.size == 0 && revised.size != 0) { + new InsertDelta[T](original, revised) + } else if (original.size > 0 && revised.size == 0) { + new DeleteDelta[T](original, revised) + } else { + new ChangeDelta[T](original, revised) + } + patch.addDelta(delta) + if (path.isSnake) { + path = path.prev + } + } + patch + } + + private def copyOfRange(original: util.List[T], fromIndex: Int, to: Int) = + new util.ArrayList[T](original.subList(fromIndex, to)) + + def buildPath( + orig: util.List[T], + rev: util.List[T] + ): PathNode = { + + val N = orig.size() + val M = rev.size() + + val MAX = N + M + 1 + val size = 1 + 2 * MAX + val middle = size / 2 + val diagonal = new Array[PathNode](size) + + diagonal(middle + 1) = new Snake(0, -1, null) + var d = 0 + while (d < MAX) { + var k = -d + while (k <= d) { + val kmiddle = middle + k + val kplus = kmiddle + 1 + val kminus = kmiddle - 1 + var prev: PathNode = null + var i = 0 + if ((k == -d) || (k != d && diagonal(kminus).i < diagonal(kplus).i)) { + i = diagonal(kplus).i + prev = diagonal(kplus) + } else { + i = diagonal(kminus).i + 1 + prev = diagonal(kminus) + } + diagonal(kminus) = null // no longer used + + var j = i - k + var node: PathNode = new DiffNode(i, j, prev) + // orig and rev are zero-based + // but the algorithm is one-based + // that's why there's no +1 when indexing the sequences + while ( + i < N && + j < M && + equalizer.equals(orig.get(i), rev.get(j)) + ) { + i += 1 + j += 1 + } + if (i > node.i) { + node = new Snake(i, j, node) + } + diagonal(kmiddle) = node + if (i >= N && j >= M) { + return diagonal(kmiddle) + } + + k += 2 + } + diagonal(middle + d - 1) = null + d += 1 + } + // According to Myers, this cannot happen + throw new DifferentiationFailedException("could not find a diff path") + } +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Patch.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Patch.scala new file mode 100644 index 0000000000..13f5f3d319 --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/Patch.scala @@ -0,0 +1,21 @@ +package org.scalafmt.cli.difflib + +import java.util +import java.util.{Collections, Comparator} + +class Patch[T] { + private val deltas: util.List[Delta[T]] = new util.ArrayList() + private val comparator: Comparator[Delta[T]] = new Comparator[Delta[T]] { + override def compare(o1: Delta[T], o2: Delta[T]): Int = + o1.getOriginal.getPosition.compareTo(o2.getOriginal.getPosition) + } + def addDelta(delta: Delta[T]): Unit = { + deltas.add(delta) + } + def getDeltas: util.List[Delta[T]] = { + Collections.sort(deltas, comparator) + deltas + } + + override def toString: String = s"Patch($deltas)" +} diff --git a/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/PathNode.scala b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/PathNode.scala new file mode 100644 index 0000000000..06ba155e1e --- /dev/null +++ b/scalafmt-cli/shared/src/main/scala/org/scalafmt/cli/difflib/PathNode.scala @@ -0,0 +1,38 @@ +package org.scalafmt.cli.difflib + +sealed abstract class PathNode(val i: Int, val j: Int, val prev: PathNode) { + + def isSnake: Boolean + final def isBootstrap: Boolean = { + i < 0 || j < 0 + } + final def previousSnake: PathNode = { + if (isBootstrap) null + else if (!isSnake && prev != null) prev.previousSnake + else this + } + + override def toString: String = { + val buf = new StringBuffer("[") + var node = this + while (node != null) { + buf.append("(") + buf.append(Integer.toString(node.i)) + buf.append(",") + buf.append(Integer.toString(node.j)) + buf.append(")") + node = node.prev + } + buf.append("]") + buf.toString + } +} + +final class DiffNode(i: Int, j: Int, prev: PathNode) + extends PathNode(i, j, if (prev == null) null else prev.previousSnake) { + override def isSnake: Boolean = false +} + +final class Snake(i: Int, j: Int, prev: PathNode) extends PathNode(i, j, prev) { + override def isSnake: Boolean = true +} diff --git a/scalafmt-core/shared/src/main/scala-2.11/org/scalafmt/CompatCollections.scala b/scalafmt-core/js/src/main/scala-2.11/org/scalafmt/CompatCollections.scala similarity index 100% rename from scalafmt-core/shared/src/main/scala-2.11/org/scalafmt/CompatCollections.scala rename to scalafmt-core/js/src/main/scala-2.11/org/scalafmt/CompatCollections.scala diff --git a/scalafmt-core/shared/src/main/scala-2.12/org/scalafmt/CompatCollections.scala b/scalafmt-core/js/src/main/scala-2.12/org/scalafmt/CompatCollections.scala similarity index 100% rename from scalafmt-core/shared/src/main/scala-2.12/org/scalafmt/CompatCollections.scala rename to scalafmt-core/js/src/main/scala-2.12/org/scalafmt/CompatCollections.scala diff --git a/scalafmt-core/shared/src/main/scala-2.13/org/scalafmt/CompatCollections.scala b/scalafmt-core/js/src/main/scala-2.13/org/scalafmt/CompatCollections.scala similarity index 100% rename from scalafmt-core/shared/src/main/scala-2.13/org/scalafmt/CompatCollections.scala rename to scalafmt-core/js/src/main/scala-2.13/org/scalafmt/CompatCollections.scala diff --git a/scalafmt-core/jvm/src/main/scala-2.11/org/scalafmt/CompatCollections.scala b/scalafmt-core/jvm/src/main/scala-2.11/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..cf487c4b1c --- /dev/null +++ b/scalafmt-core/jvm/src/main/scala-2.11/org/scalafmt/CompatCollections.scala @@ -0,0 +1,11 @@ +package org.scalafmt + +import scala.collection.mutable +import scala.collection.concurrent.TrieMap + +object CompatCollections { + val JavaConverters = scala.collection.JavaConverters + val ParConverters = scala.collection.parallel.CollectionConverters + def concurrentMap[K,V]: mutable.Map[K, V] = TrieMap.empty[K, V] + def concurrentQueue[K]: LinkedBlockingDeque[K] = new LinkedBlockingDeque[K] +} diff --git a/scalafmt-core/jvm/src/main/scala-2.12/org/scalafmt/CompatCollections.scala b/scalafmt-core/jvm/src/main/scala-2.12/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..cf487c4b1c --- /dev/null +++ b/scalafmt-core/jvm/src/main/scala-2.12/org/scalafmt/CompatCollections.scala @@ -0,0 +1,11 @@ +package org.scalafmt + +import scala.collection.mutable +import scala.collection.concurrent.TrieMap + +object CompatCollections { + val JavaConverters = scala.collection.JavaConverters + val ParConverters = scala.collection.parallel.CollectionConverters + def concurrentMap[K,V]: mutable.Map[K, V] = TrieMap.empty[K, V] + def concurrentQueue[K]: LinkedBlockingDeque[K] = new LinkedBlockingDeque[K] +} diff --git a/scalafmt-core/jvm/src/main/scala-2.13/org/scalafmt/CompatCollections.scala b/scalafmt-core/jvm/src/main/scala-2.13/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..d439719094 --- /dev/null +++ b/scalafmt-core/jvm/src/main/scala-2.13/org/scalafmt/CompatCollections.scala @@ -0,0 +1,12 @@ +package org.scalafmt + +import scala.collection.mutable +import scala.collection.concurrent.TrieMap +import java.util.concurrent.LinkedBlockingDeque + +object CompatCollections { + val JavaConverters = scala.jdk.CollectionConverters + val ParConverters = scala.collection.parallel.CollectionConverters + def concurrentMap[K,V]: mutable.Map[K, V] = TrieMap.empty[K, V] + def concurrentQueue[K]: LinkedBlockingDeque[K] = new LinkedBlockingDeque[K] +} diff --git a/scalafmt-core/jvm/src/main/scala/org/scalafmt/config/PlatformConfig.scala b/scalafmt-core/jvm/src/main/scala/org/scalafmt/config/PlatformConfig.scala index c644de99e8..e26288d39b 100644 --- a/scalafmt-core/jvm/src/main/scala/org/scalafmt/config/PlatformConfig.scala +++ b/scalafmt-core/jvm/src/main/scala/org/scalafmt/config/PlatformConfig.scala @@ -1,6 +1,7 @@ package org.scalafmt.config object PlatformConfig { + def isNative = false implicit val parser = metaconfig.typesafeconfig.typesafeConfigMetaconfigParser } diff --git a/scalafmt-core/jvm/src/main/scala/org/scalafmt/internal/PlatformCompat.scala b/scalafmt-core/jvm/src/main/scala/org/scalafmt/internal/PlatformCompat.scala new file mode 100644 index 0000000000..ff0bf98d15 --- /dev/null +++ b/scalafmt-core/jvm/src/main/scala/org/scalafmt/internal/PlatformCompat.scala @@ -0,0 +1,77 @@ +package org.scalafmt.internal + +import java.util.regex.Pattern +import scala.util.matching.Regex + +object PlatformCompat { + + @inline + val trailingSpace = + Pattern.compile("\\h++$", Pattern.MULTILINE) + + @inline + val slcDelim = Pattern.compile("\\h++") + + @inline + val mlcHeader = + Pattern.compile("^/\\*\\h*+(?:\n\\h*+[*]*+\\h*+)?") + @inline + val mlcLineDelim = + Pattern.compile("\\h*+\n\\h*+[*]*+\\h*+") + @inline + val mlcParagraphEnd = Pattern.compile("[.:!?=]$") + @inline + val mlcParagraphBeg = Pattern.compile("^(?:[-*@=]|\\d++[.:])") + + @inline + val leadingAsteriskSpace = + Pattern.compile("(?<=\n)\\h*+(?=[*][^*])") + @inline + val docstringLine = + Pattern.compile( + "^(?:\\h*+\\*)?(\\h*+)(.*?)\\h*+$", + Pattern.MULTILINE + ) + @inline + val onelineDocstring = { + val empty = "\\h*+(\n\\h*+\\*?\\h*+)*" + Pattern.compile( + s"^/\\*\\*$empty([^*\n\\h](?:[^\n]*[^\n\\h])?)$empty\\*/$$" + ) + } + @inline + val docstringLeadingSpace = Pattern.compile("^\\h++") + + @inline + def compileStripMarginPattern(pipe: Char) = + Pattern.compile(s"(?<=\n)\\h*+(?=\\${pipe})") + + // see: https://ammonite.io/#Save/LoadSession + @inline + private val ammonitePattern: Regex = "(?:\\s*\\n@(?=\\s))+".r + + @inline + val stripMarginPattern = + Pattern.compile("\n(\\h*+\\|)?([^\n]*+)") + + @inline + def replaceAllStripMargin( + stripMarginPattern: Pattern, + text: String, + spaces: String, + pipe: Char + ): String = + stripMarginPattern.matcher(text).replaceAll(spaces) + + @inline + def replaceAllLeadingAsterisk( + leadingAsteriskSpace: Pattern, + trimmed: String, + spaces: String + ): String = + leadingAsteriskSpace.matcher(trimmed).replaceAll(spaces) + + @inline + def splitByAmmonitePattern(code: String): Array[String] = + ammonitePattern.split(code) +} diff --git a/scalafmt-core/native/src/main/scala-2.11/org/scalafmt/CompatCollections.scala b/scalafmt-core/native/src/main/scala-2.11/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..bfb42bd73f --- /dev/null +++ b/scalafmt-core/native/src/main/scala-2.11/org/scalafmt/CompatCollections.scala @@ -0,0 +1,22 @@ +package org.scalafmt + +import scala.collection.mutable + +object CompatCollections { + val JavaConverters = scala.jdk.CollectionConverters + + object ParConverters { + implicit class XIterable[T](col: Iterable[T]) { + def par = col + } + } + + def concurrentMap[K,V]: mutable.Map[K, V] = mutable.Map.empty[K,V] + + class ConcurrentQueue[K] extends mutable.Queue[K] { + def put(k : K) = super.enqueue(k) + def poll(t: Long, unit : TimeUnit) = super.dequeue() + } + def concurrentQueue[K] = new ConcurrentQueue[K] + +} \ No newline at end of file diff --git a/scalafmt-core/native/src/main/scala-2.12/org/scalafmt/CompatCollections.scala b/scalafmt-core/native/src/main/scala-2.12/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..bfb42bd73f --- /dev/null +++ b/scalafmt-core/native/src/main/scala-2.12/org/scalafmt/CompatCollections.scala @@ -0,0 +1,22 @@ +package org.scalafmt + +import scala.collection.mutable + +object CompatCollections { + val JavaConverters = scala.jdk.CollectionConverters + + object ParConverters { + implicit class XIterable[T](col: Iterable[T]) { + def par = col + } + } + + def concurrentMap[K,V]: mutable.Map[K, V] = mutable.Map.empty[K,V] + + class ConcurrentQueue[K] extends mutable.Queue[K] { + def put(k : K) = super.enqueue(k) + def poll(t: Long, unit : TimeUnit) = super.dequeue() + } + def concurrentQueue[K] = new ConcurrentQueue[K] + +} \ No newline at end of file diff --git a/scalafmt-core/native/src/main/scala-2.13/org/scalafmt/CompatCollections.scala b/scalafmt-core/native/src/main/scala-2.13/org/scalafmt/CompatCollections.scala new file mode 100644 index 0000000000..7faeb36ac6 --- /dev/null +++ b/scalafmt-core/native/src/main/scala-2.13/org/scalafmt/CompatCollections.scala @@ -0,0 +1,22 @@ +package org.scalafmt + +import scala.collection.mutable +import java.util.concurrent.TimeUnit + +object CompatCollections { + val JavaConverters = scala.jdk.CollectionConverters + + // Scala native doesn't support concurrency + object ParConverters { + implicit class XIterable[T](col: Iterable[T]) { + def par = col + } + } + def concurrentMap[K,V]: mutable.Map[K, V] = mutable.Map.empty[K,V] + + class ConcurrentQueue[K] extends mutable.Queue[K] { + def put(k : K) = super.enqueue(k) + def poll(t: Long, unit : TimeUnit) = super.dequeue() + } + def concurrentQueue[K] = new ConcurrentQueue[K] +} diff --git a/scalafmt-core/native/src/main/scala/org/scalafmt/config/Platform.config b/scalafmt-core/native/src/main/scala/org/scalafmt/config/Platform.config new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scalafmt-core/native/src/main/scala/org/scalafmt/config/PlatformConfig.scala b/scalafmt-core/native/src/main/scala/org/scalafmt/config/PlatformConfig.scala new file mode 100644 index 0000000000..93aa3a2e46 --- /dev/null +++ b/scalafmt-core/native/src/main/scala/org/scalafmt/config/PlatformConfig.scala @@ -0,0 +1,8 @@ +package org.scalafmt.config + +object PlatformConfig { + + def isNative = true + implicit val parser = + metaconfig.sconfig.sConfigMetaconfigParser +} diff --git a/scalafmt-core/native/src/main/scala/org/scalafmt/internal/PlatformCompat.scala b/scalafmt-core/native/src/main/scala/org/scalafmt/internal/PlatformCompat.scala new file mode 100644 index 0000000000..1ea99a38c9 --- /dev/null +++ b/scalafmt-core/native/src/main/scala/org/scalafmt/internal/PlatformCompat.scala @@ -0,0 +1,209 @@ +package org.scalafmt.internal + +import scala.util.matching.Regex +import java.util.regex.Pattern + +/* Before text matching (?=re), after text matching (?<=re) + and more are incompatible in Scala Native, so custom functions + have to be used. + https://github.com/google/re2/wiki/Syntax */ + +object PlatformCompat { + + /* Replaces '\\h', which is incompatible in Scala Native. + Does not check the correctness of the input regex string. */ + private def fixHorizontalSpaceInRegex(reg: String) = { + + @inline + def replacingInsideClass = + "\t \u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000" + + @inline + def replacingOutsideClass = + s"[$replacingInsideClass]" + + val sb = new StringBuilder() + var isInClass = false + var isEscaped = false + + for (char <- reg) { + char match { + case '\\' if !isEscaped => + isEscaped = true + case 'h' if isEscaped => + sb.append( + if (isInClass) replacingInsideClass + else replacingOutsideClass + ) + isEscaped = false + case '[' if !isEscaped => + sb.append('[') + isInClass = true + case ']' if !isEscaped => + sb.append(']') + isInClass = false + case other => + if (isEscaped) { + isEscaped = false + sb.append('\\') + } + sb.append(other) + } + } + sb.toString() + } + + @inline + val trailingSpace = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("\\h+$"), + Pattern.MULTILINE + ) + + @inline + val slcDelim = + Pattern.compile(PlatformCompat.fixHorizontalSpaceInRegex("\\h+")) + + @inline + val mlcHeader = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("^/\\*\\h*(?:\n\\h*[*]*\\h*)?") + ) + @inline + val mlcLineDelim = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("\\h*\n\\h*[*]*\\h*") + ) + @inline + val mlcParagraphEnd = Pattern.compile("[.:!?=]$") + @inline + val mlcParagraphBeg = Pattern.compile("^(?:[-*@=]|\\d+[.:])") + + @inline + val leadingAsteriskSpace = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("\n\\h*[*][^*]"), + Pattern.MULTILINE + ) + @inline + val docstringLine = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("^(?:\\h*\\*)?(\\h*)(.*?)\\h*$"), + Pattern.MULTILINE + ) + + @inline + val onelineDocstring = { + val empty = + PlatformCompat.fixHorizontalSpaceInRegex("\\h*(\n\\h*(?:\\*\\h*)?)*") + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex( + s"^/\\*\\*$empty([^*\n\\h](?:[^\n]*[^\n\\h])?)$empty\\*/$$" + ) + ) + } + @inline + val docstringLeadingSpace = + Pattern.compile(PlatformCompat.fixHorizontalSpaceInRegex("^\\h+")) + + @inline + def compileStripMarginPattern(pipe: Char) = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex(s"\n+\\h*?\\${pipe}"), + Pattern.MULTILINE + ) + + // see: https://ammonite.io/#Save/LoadSession + @inline + val ammonitePattern: Regex = + // lookahead is not support in native + "(?:\\s*\\n@)".r + + @inline + val stripMarginPattern = + Pattern.compile( + PlatformCompat.fixHorizontalSpaceInRegex("\n(\\h*\\|)?([^\n]*)"), + Pattern.MULTILINE + ) + + // startAfterPattern and endBeforePattern should be unique in basePattern + // basePattern = startAfterPattern + matched pattern + endBeforePattern + private def replaceAll( + basePattern: Pattern, + startAfterPattern: Pattern, + endBeforePattern: Pattern, + baseText: String, + replacingText: String + ): String = { + val sb = new StringBuilder() + val matcher = basePattern.matcher(baseText) + var currPosition = 0 + while (matcher.find()) { + val start = matcher.start() + val end = matcher.end() + + sb.append(baseText.substring(currPosition, start)) + + val subtext = baseText.substring(start, end) + val startAfterMatcher = startAfterPattern.matcher(subtext) + val endBeforeMatcher = endBeforePattern.matcher(subtext) + + startAfterMatcher.find() + endBeforeMatcher.find() + + sb.append(startAfterMatcher.group()) + sb.append(replacingText) + sb.append(endBeforeMatcher.group()) + + currPosition = end + } + + sb.append(baseText.substring(currPosition)) + sb.toString() + } + + def replaceAllStripMargin( + stripMarginPattern: Pattern, + text: String, + spaces: String, + pipe: Char + ): String = { + val startAfter = Pattern.compile("\n+") + val endBefore = Pattern.compile(s"\\${pipe}") + + replaceAll(stripMarginPattern, startAfter, endBefore, text, spaces) + } + + def replaceAllLeadingAsterisk( + leadingAsteriskSpace: Pattern, + trimmed: String, + spaces: String + ): String = { + val startAfter = Pattern.compile("\n") + val endBefore = Pattern.compile("([*][^*])") + + replaceAll(leadingAsteriskSpace, startAfter, endBefore, trimmed, spaces) + } + + def splitByAmmonitePattern(code: String): Array[String] = { + def whitespacePattern = Pattern.compile("\\s") + val actualMatches = ammonitePattern + .findAllMatchIn(code) + .filter(regexMatch => + regexMatch.end < code.length && whitespacePattern + .matcher(Character.toString(code.charAt(regexMatch.end))) + .find() + ) + .toArray + + val res = new scala.collection.mutable.ArrayBuffer[String]() + var currPosition = 0 + for (actualMatch <- actualMatches) { + if (currPosition != actualMatch.start) + res.append(code.substring(currPosition, actualMatch.start)) + currPosition = actualMatch.end + } + res.append(code.substring(currPosition)) + res.toArray + } +} diff --git a/scalafmt-core/native/src/main/scala/org/scalafmt/internal/package.scala b/scalafmt-core/native/src/main/scala/org/scalafmt/internal/package.scala new file mode 100644 index 0000000000..97e0bcf34f --- /dev/null +++ b/scalafmt-core/native/src/main/scala/org/scalafmt/internal/package.scala @@ -0,0 +1,5 @@ +package org.scalafmt + +package object internal { + type PriorityQueue[T] = scala.collection.mutable.PriorityQueue[T] +} diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala index 9442a750c7..1ad5dbf53c 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala @@ -7,7 +7,6 @@ import scala.meta.Input import scala.util.Failure import scala.util.Success import scala.util.Try -import scala.util.matching.Regex import org.scalafmt.config.Config import org.scalafmt.Error.PreciseIncomplete @@ -19,6 +18,7 @@ import org.scalafmt.internal.FormatOps import org.scalafmt.internal.FormatWriter import org.scalafmt.rewrite.Rewrite import org.scalafmt.util.FileOps +import org.scalafmt.internal.PlatformCompat /** WARNING. This API is discouraged when integrating with Scalafmt from a build tool * or editor plugin. It is recommended to use the `scalafmt-dynamic` module instead. @@ -90,24 +90,22 @@ object Scalafmt { iter(Seq.empty) } - // see: https://ammonite.io/#Save/LoadSession - private val ammonitePattern: Regex = "(?:\\s*\\n@(?=\\s))+".r - private def doFormat( code: String, style: ScalafmtConfig, file: String, range: Set[Range] = Set.empty - ): Try[String] = - if (!FileOps.isAmmonite(file)) doFormatOne(code, style, file, range) - else { - // XXX: we won't support ranges as we don't keep track of lines - val chunks = ammonitePattern.split(code) - if (chunks.length <= 1) doFormatOne(code, style, file, range) - else - flatMapAll(chunks.iterator)(doFormatOne(_, style, file)) - .map(_.mkString("\n@\n")) - } + ): Try[String] = if (!FileOps.isAmmonite(file)) + doFormatOne(code, style, file, range) + else { + // XXX: we won't support ranges as we don't keep track of lines + // see: https://ammonite.io/#Save/LoadSession + val chunks = PlatformCompat.splitByAmmonitePattern(code) + if (chunks.length <= 1) doFormatOne(code, style, file, range) + else + flatMapAll(chunks.iterator)(doFormatOne(_, style, file)) + .map(_.mkString("\n@\n")) + } private def doFormatOne( code: String, diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Config.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Config.scala index 1cd6712318..b250e7788c 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Config.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Config.scala @@ -4,6 +4,9 @@ import java.io.File import metaconfig._ import org.scalafmt.config.PlatformConfig._ +import scala.meta.internal.io.FileIO +import scala.meta.io.AbsolutePath +import java.nio.charset.StandardCharsets // NOTE: these methods are intended for internal usage and are subject to // binary and source breaking changes between any release. For a stable API @@ -14,10 +17,12 @@ object Config { def hoconStringToConf(input: String, path: Option[String]): Configured[Conf] = Input.String(input).parse(path) - def hoconFileToConf(input: File, path: Option[String]): Configured[Conf] = + def hoconFileToConf(input: File, path: Option[String]): Configured[Conf] = { + val string = FileIO.slurp(AbsolutePath(input.toPath()), StandardCharsets.UTF_8) Configured - .fromExceptionThrowing(Input.File(input)) + .fromExceptionThrowing(Input.String(string)) .andThen(_.parse(path)) + } def fromHoconString(string: String): Configured[ScalafmtConfig] = fromHoconString(string, None) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ProjectFiles.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ProjectFiles.scala index 94c64f68f6..caf3a5e822 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ProjectFiles.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ProjectFiles.scala @@ -40,7 +40,7 @@ object ProjectFiles { val defaultIncludePaths = Seq("glob:**.scala", "glob:**.sbt", "glob:**.sc") - private sealed abstract class PathMatcher { + sealed abstract class PathMatcher { def matches(path: file.Path): Boolean } @@ -59,16 +59,47 @@ object ProjectFiles { ) } + def nio(glob: String) = { + if (PlatformConfig.isNative) + new Regex(createRegexFromGlob(glob)) + else + new Nio(glob) + } + private def create(seq: Seq[String], f: String => PathMatcher) = seq.map(_.asFilename).distinct.map(f) - private def nio(seq: Seq[String]) = create(seq, new Nio(_)) + private def nio(seq: Seq[String]) = { + if (PlatformConfig.isNative) + create(seq, p => new Regex(createRegexFromGlob(p))) + else + create(seq, new Nio(_)) + } private def regex(seq: Seq[String]) = create(seq, new Regex(_)) - private final class Nio(pattern: String) extends PathMatcher { + // TODO basic, might need rework https://stackoverflow.com/questions/1247772/is-there-an-equivalent-of-java-util-regex-for-glob-type-patterns + private def createRegexFromGlob(glob: String): String = { + val out = new StringBuilder + out.append("^") + + for (ch <- glob.stripPrefix("glob:")) { + val changed = ch match { + case '*' => ".*" + case '?' => "." + case '.' => "\\." + case '\\' => "\\\\" + case other => other.toString() + } + out.append(changed) + } + out.append('$') + out.toString() + } + + final class Nio(pattern: String) extends PathMatcher { private val matcher = fs.getPathMatcher(pattern) def matches(path: file.Path): Boolean = matcher.matches(path) } - private final class Regex(regex: String) extends PathMatcher { + final class Regex(regex: String) extends PathMatcher { private val pattern = java.util.regex.Pattern.compile(regex) def matches(path: file.Path): Boolean = pattern.matcher(path.toString).find() diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ScalafmtConfig.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ScalafmtConfig.scala index 004599aba8..2ac9f33f5a 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ScalafmtConfig.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/ScalafmtConfig.scala @@ -156,10 +156,9 @@ case class ScalafmtConfig( def forSbt: ScalafmtConfig = copy(runner = runner.forSbt) private lazy val expandedFileOverride = Try { - val fs = file.FileSystems.getDefault fileOverride.values.map { case (pattern, conf) => val style = ScalafmtConfig.decoder.read(Some(this), conf).get - fs.getPathMatcher(pattern.asFilename) -> style + ProjectFiles.FileMatcher.nio(pattern.asFilename) -> style } } def getConfigFor(filename: String): ScalafmtConfig = { diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala index d64da2c978..8523a21d3d 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala @@ -407,7 +407,12 @@ class FormatWriter(formatOps: FormatOps) { } tupleOpt.fold(text) { case (pipe, indent) => val spaces = getIndentation(indent) - getStripMarginPattern(pipe).matcher(text).replaceAll(spaces) + PlatformCompat.replaceAllStripMargin( + getStripMarginPattern(pipe), + text, + spaces, + pipe + ) } } @@ -589,7 +594,13 @@ class FormatWriter(formatOps: FormatOps) { sb.append(" */") } else { val trimmed = removeTrailingWhiteSpace(text) - sb.append(leadingAsteriskSpace.matcher(trimmed).replaceAll(spaces)) + sb.append( + PlatformCompat.replaceAllLeadingAsterisk( + leadingAsteriskSpace, + trimmed, + spaces + ) + ) } } @@ -1400,7 +1411,8 @@ object FormatWriter { private def getIndentation(len: Int): String = if (len < indentations.length) indentations(len) else " " * len - private val trailingSpace = Pattern.compile("\\h++$", Pattern.MULTILINE) + private val trailingSpace = PlatformCompat.trailingSpace + private def removeTrailingWhiteSpace(str: String): String = { trailingSpace.matcher(str).replaceAll("") } @@ -1409,31 +1421,24 @@ object FormatWriter { regex.splitAsStream(value).iterator().asScala // "slc" stands for single-line comment - private val slcDelim = Pattern.compile("\\h++") + private val slcDelim = PlatformCompat.slcDelim // "mlc" stands for multi-line comment - private val mlcHeader = Pattern.compile("^/\\*\\h*+(?:\n\\h*+[*]*+\\h*+)?") - private val mlcLineDelim = Pattern.compile("\\h*+\n\\h*+[*]*+\\h*+") - private val mlcParagraphEnd = Pattern.compile("[.:!?=]$") - private val mlcParagraphBeg = Pattern.compile("^(?:[-*@=]|\\d++[.:])") - - private val leadingAsteriskSpace = Pattern.compile("(?<=\n)\\h*+(?=[*][^*])") - private val docstringLine = - Pattern.compile("^(?:\\h*+\\*)?(\\h*+)(.*?)\\h*+$", Pattern.MULTILINE) - private val onelineDocstring = { - val empty = "\\h*+(\n\\h*+\\*?\\h*+)*" - Pattern.compile(s"^/\\*\\*$empty([^*\n\\h](?:[^\n]*[^\n\\h])?)$empty\\*/$$") - } - private val docstringLeadingSpace = Pattern.compile("^\\h++") + private val mlcHeader = PlatformCompat.mlcHeader + private val mlcLineDelim = PlatformCompat.mlcLineDelim + private val mlcParagraphEnd = PlatformCompat.mlcParagraphEnd + private val mlcParagraphBeg = PlatformCompat.mlcParagraphBeg - @inline - private def getStripMarginPattern(pipe: Char) = - if (pipe == '|') leadingPipeSpace else compileStripMarginPattern(pipe) + private val leadingAsteriskSpace = PlatformCompat.leadingAsteriskSpace + private val docstringLine = PlatformCompat.docstringLine + private val onelineDocstring = PlatformCompat.onelineDocstring + private val docstringLeadingSpace = PlatformCompat.docstringLeadingSpace @inline - private def compileStripMarginPattern(pipe: Char) = - Pattern.compile(s"(?<=\n)\\h*+(?=\\${pipe})") + private def getStripMarginPattern(pipe: Char) = + if (pipe == '|') leadingPipeSpace + else PlatformCompat.compileStripMarginPattern(pipe) - private val leadingPipeSpace = compileStripMarginPattern('|') + private val leadingPipeSpace = PlatformCompat.compileStripMarginPattern('|') /** [[https://dotty.epfl.ch/docs/reference/other-new-features/indentation.html#the-end-marker]] */ private def getEndMarkerLabel(tree: Tree): String = tree match { diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala index 4717c5229b..2f9db0c3d7 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala @@ -1,7 +1,6 @@ package org.scalafmt.internal import java.util.regex.Matcher -import java.util.regex.Pattern import scala.annotation.tailrec import scala.meta.tokens.Token @@ -308,8 +307,7 @@ object State { } } - private val stripMarginPattern = - Pattern.compile("\n(\\h*+\\|)?([^\n]*+)") + private val stripMarginPattern = PlatformCompat.stripMarginPattern def getColumns( ft: FormatToken, diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/AbsoluteFile.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/AbsoluteFile.scala index f9b47a7090..277f4f4bbd 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/AbsoluteFile.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/AbsoluteFile.scala @@ -1,6 +1,7 @@ package org.scalafmt.util import java.io.File +import java.nio.file.Path /** Wrapper around java.io.File with an absolute path. */ sealed abstract case class AbsoluteFile(jfile: File) { @@ -22,10 +23,18 @@ object AbsoluteFile { def fromFile(file: File, workingDir: AbsoluteFile): AbsoluteFile = { new AbsoluteFile(FileOps.makeAbsolute(workingDir.jfile)(file)) {} } + def fromPath(path: String): Option[AbsoluteFile] = { val file = new File(path) if (file.isAbsolute) Some(new AbsoluteFile(file) {}) else None } + + def fromPath(path: Path): Option[AbsoluteFile] = { + val file = path.toFile + if (file.isAbsolute) Some(new AbsoluteFile(file) {}) + else None + } + def userDir = new AbsoluteFile(new File(System.getProperty("user.dir"))) {} } diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/GitOps.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/GitOps.scala index 57edace0e2..3f2df8841c 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/GitOps.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/GitOps.scala @@ -4,6 +4,8 @@ import scala.sys.process.ProcessLogger import scala.util.Try import scala.util.control.NonFatal import java.io.File +import java.io.BufferedReader +import java.io.InputStreamReader trait GitOps { def status: Seq[AbsoluteFile] @@ -20,10 +22,21 @@ class GitOpsImpl(private[util] val workingDirectory: AbsoluteFile) val lastError = new StringBuilder val swallowStderr = ProcessLogger(_ => (), err => lastError.append(err)) try { - sys.process - .Process(cmd, workingDirectory.jfile) - .!!(swallowStderr) - .trim + //TODO make it nicer + val processBuilder = new ProcessBuilder() + val out = new StringBuilder() + processBuilder.command(cmd: _*); + var process = processBuilder.start() + + val reader = + new BufferedReader(new InputStreamReader(process.getInputStream())) + + var line = reader.readLine() + while (line != null) { + out.append(line + "\n") + line = reader.readLine() + } + out.toString() } catch { case NonFatal(e) => throw new IllegalStateException( diff --git a/scalafmt-dynamic/src/main/resources/META-INF/services/org.scalafmt.interfaces.Scalafmt b/scalafmt-dynamic/shared/src/main/resources/META-INF/services/org.scalafmt.interfaces.Scalafmt similarity index 100% rename from scalafmt-dynamic/src/main/resources/META-INF/services/org.scalafmt.interfaces.Scalafmt rename to scalafmt-dynamic/shared/src/main/resources/META-INF/services/org.scalafmt.interfaces.Scalafmt diff --git a/scalafmt-dynamic/src/main/scala-2.11/org/scalafmt/dynamic/package.scala b/scalafmt-dynamic/shared/src/main/scala-2.11/org/scalafmt/dynamic/package.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala-2.11/org/scalafmt/dynamic/package.scala rename to scalafmt-dynamic/shared/src/main/scala-2.11/org/scalafmt/dynamic/package.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ConsoleScalafmtReporter.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ConsoleScalafmtReporter.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ConsoleScalafmtReporter.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ConsoleScalafmtReporter.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamic.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamic.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamic.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamic.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicDownloader.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicDownloader.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicDownloader.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicDownloader.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicError.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicError.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicError.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtDynamicError.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtReflect.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtReflect.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtReflect.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtReflect.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtReflectConfig.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtReflectConfig.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtReflectConfig.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtReflectConfig.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtVersion.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtVersion.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/ScalafmtVersion.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/ScalafmtVersion.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala similarity index 65% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala index ff4a31c59b..7319dc26b3 100644 --- a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala +++ b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/PositionExceptionImpl.scala @@ -13,8 +13,8 @@ case class PositionExceptionImpl( ) extends PositionException(longMessage, cause) { def start: Int = pos.start def end: Int = pos.end - override def startLine: Int = pos.startLine - override def startCharacter: Int = pos.startCharacter - override def endLine: Int = pos.endLine - override def endCharacter: Int = pos.endCharacter + override def startLine(): Int = pos.startLine + override def startCharacter(): Int = pos.startCharacter + override def endLine(): Int = pos.endLine + override def endCharacter(): Int = pos.endCharacter } diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/RangePosition.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/RangePosition.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/RangePosition.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/RangePosition.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/ReflectionException.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/ReflectionException.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/ReflectionException.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/ReflectionException.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/ScalafmtException.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/ScalafmtException.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/ScalafmtException.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/ScalafmtException.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/VersionMismatch.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/VersionMismatch.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/exceptions/VersionMismatch.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/exceptions/VersionMismatch.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/utils/ReentrantCache.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/utils/ReentrantCache.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/utils/ReentrantCache.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/utils/ReentrantCache.scala diff --git a/scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/utils/ReflectUtils.scala b/scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/utils/ReflectUtils.scala similarity index 100% rename from scalafmt-dynamic/src/main/scala/org/scalafmt/dynamic/utils/ReflectUtils.scala rename to scalafmt-dynamic/shared/src/main/scala/org/scalafmt/dynamic/utils/ReflectUtils.scala diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/PositionException.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/PositionException.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/PositionException.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/PositionException.java diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/Scalafmt.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/Scalafmt.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/Scalafmt.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/Scalafmt.java diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtClassLoader.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtClassLoader.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtClassLoader.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtClassLoader.java diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtReporter.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtReporter.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtReporter.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtReporter.java diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtSession.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtSession.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtSession.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtSession.java diff --git a/scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtSessionFactory.java b/scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtSessionFactory.java similarity index 100% rename from scalafmt-interfaces/src/main/java/org/scalafmt/interfaces/ScalafmtSessionFactory.java rename to scalafmt-interfaces/jvm/src/main/java/org/scalafmt/interfaces/ScalafmtSessionFactory.java diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/PositionException.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/PositionException.scala new file mode 100644 index 0000000000..8963672497 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/PositionException.scala @@ -0,0 +1,34 @@ +package org.scalafmt.interfaces + +import java.nio.file.Path + +/** An exception that happened at a position in a source file such as a parse error. + */ +abstract class PositionException(message: String, cause: Throwable) + extends Exception(message, cause) { + + override def fillInStackTrace(): Throwable = synchronized { + return this; + } + + /** @return The file where the error occurred. + */ + def file(): Path; + + /** @return The text contents of the file being formatted. + */ + def code(): String; + + /** @return The fully formatted error message including line content and caret. + */ + def longMessage(): String + + /** @return Only the error message itself without line content and caret. + */ + def shortMessage(): String + + def startLine(): Int + def startCharacter(): Int + def endLine(): Int + def endCharacter(): Int +} diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/Scalafmt.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/Scalafmt.scala new file mode 100644 index 0000000000..83fd4e97b9 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/Scalafmt.scala @@ -0,0 +1,87 @@ +package org.scalafmt.interfaces + +import java.nio.file.Path +import java.util +import java.util.NoSuchElementException +import java.util.ServiceLoader + +/** A stable public interface to run Scalafmt. + * + * This interface is designed for integrations such as editor plugins and build tools. + * An implementation of this interface is available in the module 'scalafmt-dynamic'. + * + * It is recommended to use this interface over the org.scalafmt.Scalafmt object + * for several reasons: + * + * - this API is guaranteed to be binary compatible with all future versions of Scalafmt. + * - it downloads the Scalafmt version matching the 'version' setting in .scalafmt.conf. + * All versions down to v1.2.0 are supported. + * - it respects the 'project.{excludeFilters,includeFilters}' setting in .scalafmt.conf. + * - it uses the correct parser for `*.sbt` and `*.sc` files. + * - it automatically caches parsing of configuration files avoiding redundant work when possible. + * - it has two external library dependencies (com.geirsson:coursier-small and com.typesafe:config), + * which is a smaller dependency footprint compared to scalafmt-core. + */ + +trait Scalafmt { + + /** Format a single file with the given .scalafmt.conf configuration. + * + * @param config the absolute path to the configuration file. This file must exist or + * an exception will be thrown. + * @param file relative or absolute path to the file being formatted. Used only for the path + * name, the file does not have to exist on disk. + * @param code the text contents to format. + * @return the formatted contents if formatting was successful, otherwise the original text + * contents. + */ + def format(config: Path, file: Path, code: String): String + + /** Whether to respect the 'project.{excludeFilters,includeFilters}' setting in .scalafmt.conf. + * + * @param respectExcludeFilters If true (default), returns the original file contents when + * formatting a file that does not matches the project settings + * in .scalafmt.conf. If false, formats every file that is passed + * to the {@link #format(Path, Path, String)} method regardless + * of .scalafmt.conf settings. + */ + def withRespectProjectFilters(respectExcludeFilters: Boolean): Scalafmt + + /** Whether to respect the 'version' setting in .scalafmt.conf. + * + * @param respectVersion If true (default), refuses to format files when the 'version' setting + * is missing in .scalafmt.conf and users must update .scalafmt.conf to + * format files. If false, falls back to the default version provided + * via {@link #withDefaultVersion(String)}. + */ + def withRespectVersion(respectVersion: Boolean): Scalafmt + + /** The fallback Scalafmt version to use when there is no 'version' setting in .scalafmt.conf. + * + * The default version is ignored when {@link #withRespectVersion(boolean)} is true. + */ + def withDefaultVersion(defaultVersion: String): Scalafmt + + /** Use this reporter to report errors and information messages. + */ + def withReporter(reporter: ScalafmtReporter): Scalafmt + + /** Use this repositories to resolve dependencies. + */ + def withMavenRepositories(repositories: String*): Scalafmt + + /** Clear internal caches such as classloaded Scalafmt instances. + */ + def clear(): Unit +} + +object Scalafmt { + + /** Classload a new instance of this Scalafmt instance. + * + * @param loader the classloader containing the 'scalafmt-dynamic' module. + * + * @throws NoSuchElementException if the classloader does not have the 'scalafmt-dynamic' module. + */ + def create(loader: ClassLoader): Scalafmt = throw new Exception("Can't use different version for native CLI") +} diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtClassLoader.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtClassLoader.scala new file mode 100644 index 0000000000..e06a9ba2e2 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtClassLoader.scala @@ -0,0 +1,15 @@ +package org.scalafmt.interfaces + +/** A classloader that shares only scalafmt-interfaces classes from the parent classloader. + * + * This classloader is intended to be used as a parent when class-loading scalafmt-dynamic. + * By using this classloader as a parent, it's possible to cast runtime instances from + * the scalafmt-dynamic classloader into `org.scalafmt.interfaces.Scalafmt` from this classloader. + */ +class ScalafmtClassLoader(var parent: ClassLoader) extends ClassLoader(null) { + @throws[ClassNotFoundException] + override protected def findClass(name: String) = if ( + name.startsWith("org.scalafmt.interfaces") + ) parent.loadClass(name) + else super.findClass(name) +} diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtReporter.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtReporter.scala new file mode 100644 index 0000000000..ba7c76c946 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtReporter.scala @@ -0,0 +1,66 @@ +package org.scalafmt.interfaces + +import java.io.OutputStreamWriter +import java.io.PrintWriter +import java.nio.file.Path + +/** A reporter to handle error and information messages from Scalafmt. + */ +trait ScalafmtReporter { + + /** An error occurred while trying to process this file. + * + * @param file can be either a Scala source file or .scalafmt.conf. + * @param message the error message. + */ + def error(file: Path, message: String): Unit + + /** An exception occurred while trying to process this file. + * + * @param file can be either a Scala source file or .scalafmt.conf. + * @param e the exception that occurred, has type {@link PositionException} + * when the error appeared as a position. + */ + def error(file: Path, e: Throwable): Unit + + /** An exception occurred while trying to process this file. + * + * @param file can be either a Scala source file or .scalafmt.conf. + * @param message additional error message + * @param e the exception that occurred, has type {@link PositionException} + * when the error appeared as a position. + */ + def error(file: Path, message: String, e: Throwable): Unit = + error(file, new RuntimeException(message, e)) + + /** This file was not formatted because it's excluded by project settings from .scalafmt.conf. + * + * @param file the file path that was not formatted. + */ + def excluded(file: Path): Unit + + /** This .scalafmt.conf file is missing the 'version' setting. + * + * @param config the .scalafmt.conf file. + * @param defaultVersion the configured default Scalafmt version. + */ + def missingVersion(config: Path, defaultVersion: String): Unit = { + val message = String.format( + "missing setting 'version'. To fix this problem, add the following line to .scalafmt.conf: 'version=%s'.", + defaultVersion + ) + error(config, message) + } + + /** The .scalafmt.conf file was parsed with the given Scalafmt version. + */ + def parsedConfig(config: Path, scalafmtVersion: String): Unit + + /** Use {@link #downloadOutputStreamWriter} instead. + */ + @deprecated def downloadWriter(): PrintWriter + + /** Use this writer for printing progress while downloading new Scalafmt versions. + */ + def downloadOutputStreamWriter(): OutputStreamWriter +} diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSession.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSession.scala new file mode 100644 index 0000000000..dfbe5bd035 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSession.scala @@ -0,0 +1,22 @@ +package org.scalafmt.interfaces + +import java.nio.file.Path + +/** A session based on a fixed configuration. + */ +trait ScalafmtSession { + + /** Format a single file with the given configuration. + * + * @param file relative or absolute path to the file being formatted. Used only for the path + * name, the file does not have to exist on disk. + * @param code the text contents to format. + * @return the formatted contents if formatting was successful, otherwise the original text + * contents. + */ + def format(file: Path, code: String): String + + /** Whether the path matches the 'project.{excludeFilters,includeFilters}' setting. + */ + def matchesProjectFilters(file: Path): Boolean +} diff --git a/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSessionFactory.scala b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSessionFactory.scala new file mode 100644 index 0000000000..38696fcc06 --- /dev/null +++ b/scalafmt-interfaces/native/src/main/scala/org/scalafmt/interfaces/ScalafmtSessionFactory.scala @@ -0,0 +1,10 @@ +package org.scalafmt.interfaces + +import java.nio.file.Path + +trait ScalafmtSessionFactory { + + /** Create a ScalafmtSession to format a batch of files using fixed configuration. + */ + def createSession(config: Path): ScalafmtSession +} diff --git a/scalafmt-tests/src/main/scala/org/scalafmt/util/ScalaFile.scala b/scalafmt-tests/jvm/src/main/scala/org/scalafmt/util/ScalaFile.scala similarity index 96% rename from scalafmt-tests/src/main/scala/org/scalafmt/util/ScalaFile.scala rename to scalafmt-tests/jvm/src/main/scala/org/scalafmt/util/ScalaFile.scala index 51915bf802..e58e597c26 100644 --- a/scalafmt-tests/src/main/scala/org/scalafmt/util/ScalaFile.scala +++ b/scalafmt-tests/jvm/src/main/scala/org/scalafmt/util/ScalaFile.scala @@ -3,7 +3,6 @@ package org.scalafmt.util import java.io.File import java.net.URL -import org.apache.commons.io.FileUtils import org.rauschig.jarchivelib.ArchiverFactory case class ScalaFile(filename: String, projectUrl: String, commit: String) { @@ -76,9 +75,9 @@ object ScalaFile { } private def downloadReposTar(destination: File): Unit = { - val fileToDownload = new URL(reposTarballUrl) + import sys.process._ println(s"Downloading $reposTarballUrl...") - FileUtils.copyURLToFile(fileToDownload, destination) + new URL(reposTarballUrl).#>(destination).!! println("Download finished.") } diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtProps.scala b/scalafmt-tests/jvm/src/test/scala/org/scalafmt/ScalafmtProps.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtProps.scala rename to scalafmt-tests/jvm/src/test/scala/org/scalafmt/ScalafmtProps.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/ExperimentResult.scala b/scalafmt-tests/jvm/src/test/scala/org/scalafmt/util/ExperimentResult.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/ExperimentResult.scala rename to scalafmt-tests/jvm/src/test/scala/org/scalafmt/util/ExperimentResult.scala diff --git a/scalafmt-tests/src/test/resources/Test.manual b/scalafmt-tests/shared/src/test/resources/Test.manual similarity index 100% rename from scalafmt-tests/src/test/resources/Test.manual rename to scalafmt-tests/shared/src/test/resources/Test.manual diff --git a/scalafmt-tests/src/test/resources/align/AlignByRightName.stat b/scalafmt-tests/shared/src/test/resources/align/AlignByRightName.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/AlignByRightName.stat rename to scalafmt-tests/shared/src/test/resources/align/AlignByRightName.stat diff --git a/scalafmt-tests/src/test/resources/align/ArrowEnumeratorGenerator.stat b/scalafmt-tests/shared/src/test/resources/align/ArrowEnumeratorGenerator.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/ArrowEnumeratorGenerator.stat rename to scalafmt-tests/shared/src/test/resources/align/ArrowEnumeratorGenerator.stat diff --git a/scalafmt-tests/src/test/resources/align/BeforeCommentWithinMethodChain.stat b/scalafmt-tests/shared/src/test/resources/align/BeforeCommentWithinMethodChain.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/BeforeCommentWithinMethodChain.stat rename to scalafmt-tests/shared/src/test/resources/align/BeforeCommentWithinMethodChain.stat diff --git a/scalafmt-tests/src/test/resources/align/DefaultWithAlign.stat b/scalafmt-tests/shared/src/test/resources/align/DefaultWithAlign.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/DefaultWithAlign.stat rename to scalafmt-tests/shared/src/test/resources/align/DefaultWithAlign.stat diff --git a/scalafmt-tests/src/test/resources/align/MixedTokens.stat b/scalafmt-tests/shared/src/test/resources/align/MixedTokens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/MixedTokens.stat rename to scalafmt-tests/shared/src/test/resources/align/MixedTokens.stat diff --git a/scalafmt-tests/src/test/resources/align/NoSpace.stat b/scalafmt-tests/shared/src/test/resources/align/NoSpace.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/NoSpace.stat rename to scalafmt-tests/shared/src/test/resources/align/NoSpace.stat diff --git a/scalafmt-tests/src/test/resources/align/TrollAlignment.stat b/scalafmt-tests/shared/src/test/resources/align/TrollAlignment.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/TrollAlignment.stat rename to scalafmt-tests/shared/src/test/resources/align/TrollAlignment.stat diff --git a/scalafmt-tests/src/test/resources/align/addSbtPlugin.source b/scalafmt-tests/shared/src/test/resources/align/addSbtPlugin.source similarity index 100% rename from scalafmt-tests/src/test/resources/align/addSbtPlugin.source rename to scalafmt-tests/shared/src/test/resources/align/addSbtPlugin.source diff --git a/scalafmt-tests/src/test/resources/align/comment-wrapping.source b/scalafmt-tests/shared/src/test/resources/align/comment-wrapping.source similarity index 100% rename from scalafmt-tests/src/test/resources/align/comment-wrapping.source rename to scalafmt-tests/shared/src/test/resources/align/comment-wrapping.source diff --git a/scalafmt-tests/src/test/resources/align/defaultTokenOwners.stat b/scalafmt-tests/shared/src/test/resources/align/defaultTokenOwners.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/defaultTokenOwners.stat rename to scalafmt-tests/shared/src/test/resources/align/defaultTokenOwners.stat diff --git a/scalafmt-tests/src/test/resources/align/duplicateAlign.stat b/scalafmt-tests/shared/src/test/resources/align/duplicateAlign.stat similarity index 100% rename from scalafmt-tests/src/test/resources/align/duplicateAlign.stat rename to scalafmt-tests/shared/src/test/resources/align/duplicateAlign.stat diff --git a/scalafmt-tests/src/test/resources/binPack/LambdaParameterFalse.stat b/scalafmt-tests/shared/src/test/resources/binPack/LambdaParameterFalse.stat similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/LambdaParameterFalse.stat rename to scalafmt-tests/shared/src/test/resources/binPack/LambdaParameterFalse.stat diff --git a/scalafmt-tests/src/test/resources/binPack/LiteralList.stat b/scalafmt-tests/shared/src/test/resources/binPack/LiteralList.stat similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/LiteralList.stat rename to scalafmt-tests/shared/src/test/resources/binPack/LiteralList.stat diff --git a/scalafmt-tests/src/test/resources/binPack/LiteralListNoByte.stat b/scalafmt-tests/shared/src/test/resources/binPack/LiteralListNoByte.stat similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/LiteralListNoByte.stat rename to scalafmt-tests/shared/src/test/resources/binPack/LiteralListNoByte.stat diff --git a/scalafmt-tests/src/test/resources/binPack/ParentConstructors.stat b/scalafmt-tests/shared/src/test/resources/binPack/ParentConstructors.stat similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/ParentConstructors.stat rename to scalafmt-tests/shared/src/test/resources/binPack/ParentConstructors.stat diff --git a/scalafmt-tests/src/test/resources/binPack/TermNameList b/scalafmt-tests/shared/src/test/resources/binPack/TermNameList similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/TermNameList rename to scalafmt-tests/shared/src/test/resources/binPack/TermNameList diff --git a/scalafmt-tests/src/test/resources/binPack/TermNameList.stat b/scalafmt-tests/shared/src/test/resources/binPack/TermNameList.stat similarity index 100% rename from scalafmt-tests/src/test/resources/binPack/TermNameList.stat rename to scalafmt-tests/shared/src/test/resources/binPack/TermNameList.stat diff --git a/scalafmt-tests/src/test/resources/default/Advanced.stat b/scalafmt-tests/shared/src/test/resources/default/Advanced.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Advanced.stat rename to scalafmt-tests/shared/src/test/resources/default/Advanced.stat diff --git a/scalafmt-tests/src/test/resources/default/Apply.stat b/scalafmt-tests/shared/src/test/resources/default/Apply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Apply.stat rename to scalafmt-tests/shared/src/test/resources/default/Apply.stat diff --git a/scalafmt-tests/src/test/resources/default/ApplyInfix.stat b/scalafmt-tests/shared/src/test/resources/default/ApplyInfix.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/ApplyInfix.stat rename to scalafmt-tests/shared/src/test/resources/default/ApplyInfix.stat diff --git a/scalafmt-tests/src/test/resources/default/Case.case b/scalafmt-tests/shared/src/test/resources/default/Case.case similarity index 100% rename from scalafmt-tests/src/test/resources/default/Case.case rename to scalafmt-tests/shared/src/test/resources/default/Case.case diff --git a/scalafmt-tests/src/test/resources/default/Case.stat b/scalafmt-tests/shared/src/test/resources/default/Case.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Case.stat rename to scalafmt-tests/shared/src/test/resources/default/Case.stat diff --git a/scalafmt-tests/src/test/resources/default/Class.stat b/scalafmt-tests/shared/src/test/resources/default/Class.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Class.stat rename to scalafmt-tests/shared/src/test/resources/default/Class.stat diff --git a/scalafmt-tests/src/test/resources/default/Comment.stat b/scalafmt-tests/shared/src/test/resources/default/Comment.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Comment.stat rename to scalafmt-tests/shared/src/test/resources/default/Comment.stat diff --git a/scalafmt-tests/src/test/resources/default/DefDef.stat b/scalafmt-tests/shared/src/test/resources/default/DefDef.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/DefDef.stat rename to scalafmt-tests/shared/src/test/resources/default/DefDef.stat diff --git a/scalafmt-tests/src/test/resources/default/Fidelity.source b/scalafmt-tests/shared/src/test/resources/default/Fidelity.source similarity index 100% rename from scalafmt-tests/src/test/resources/default/Fidelity.source rename to scalafmt-tests/shared/src/test/resources/default/Fidelity.source diff --git a/scalafmt-tests/src/test/resources/default/Fidelity.stat b/scalafmt-tests/shared/src/test/resources/default/Fidelity.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Fidelity.stat rename to scalafmt-tests/shared/src/test/resources/default/Fidelity.stat diff --git a/scalafmt-tests/src/test/resources/default/For.stat b/scalafmt-tests/shared/src/test/resources/default/For.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/For.stat rename to scalafmt-tests/shared/src/test/resources/default/For.stat diff --git a/scalafmt-tests/src/test/resources/default/Idempotency.stat b/scalafmt-tests/shared/src/test/resources/default/Idempotency.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Idempotency.stat rename to scalafmt-tests/shared/src/test/resources/default/Idempotency.stat diff --git a/scalafmt-tests/src/test/resources/default/If.stat b/scalafmt-tests/shared/src/test/resources/default/If.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/If.stat rename to scalafmt-tests/shared/src/test/resources/default/If.stat diff --git a/scalafmt-tests/src/test/resources/default/Lambda.stat b/scalafmt-tests/shared/src/test/resources/default/Lambda.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Lambda.stat rename to scalafmt-tests/shared/src/test/resources/default/Lambda.stat diff --git a/scalafmt-tests/src/test/resources/default/SearchState.stat b/scalafmt-tests/shared/src/test/resources/default/SearchState.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/SearchState.stat rename to scalafmt-tests/shared/src/test/resources/default/SearchState.stat diff --git a/scalafmt-tests/src/test/resources/default/Select.stat b/scalafmt-tests/shared/src/test/resources/default/Select.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Select.stat rename to scalafmt-tests/shared/src/test/resources/default/Select.stat diff --git a/scalafmt-tests/src/test/resources/default/Semicolon.stat b/scalafmt-tests/shared/src/test/resources/default/Semicolon.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Semicolon.stat rename to scalafmt-tests/shared/src/test/resources/default/Semicolon.stat diff --git a/scalafmt-tests/src/test/resources/default/String.stat b/scalafmt-tests/shared/src/test/resources/default/String.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/String.stat rename to scalafmt-tests/shared/src/test/resources/default/String.stat diff --git a/scalafmt-tests/src/test/resources/default/Super.stat b/scalafmt-tests/shared/src/test/resources/default/Super.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Super.stat rename to scalafmt-tests/shared/src/test/resources/default/Super.stat diff --git a/scalafmt-tests/src/test/resources/default/TermParam.stat b/scalafmt-tests/shared/src/test/resources/default/TermParam.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/TermParam.stat rename to scalafmt-tests/shared/src/test/resources/default/TermParam.stat diff --git a/scalafmt-tests/src/test/resources/default/TestingClassNameDoNotEdit.scalafmt b/scalafmt-tests/shared/src/test/resources/default/TestingClassNameDoNotEdit.scalafmt similarity index 100% rename from scalafmt-tests/src/test/resources/default/TestingClassNameDoNotEdit.scalafmt rename to scalafmt-tests/shared/src/test/resources/default/TestingClassNameDoNotEdit.scalafmt diff --git a/scalafmt-tests/src/test/resources/default/Trait.stat b/scalafmt-tests/shared/src/test/resources/default/Trait.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Trait.stat rename to scalafmt-tests/shared/src/test/resources/default/Trait.stat diff --git a/scalafmt-tests/src/test/resources/default/Try.stat b/scalafmt-tests/shared/src/test/resources/default/Try.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Try.stat rename to scalafmt-tests/shared/src/test/resources/default/Try.stat diff --git a/scalafmt-tests/src/test/resources/default/TypeArguments.stat b/scalafmt-tests/shared/src/test/resources/default/TypeArguments.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/TypeArguments.stat rename to scalafmt-tests/shared/src/test/resources/default/TypeArguments.stat diff --git a/scalafmt-tests/src/test/resources/default/TypeWith.stat b/scalafmt-tests/shared/src/test/resources/default/TypeWith.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/TypeWith.stat rename to scalafmt-tests/shared/src/test/resources/default/TypeWith.stat diff --git a/scalafmt-tests/src/test/resources/default/Unicode.stat b/scalafmt-tests/shared/src/test/resources/default/Unicode.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Unicode.stat rename to scalafmt-tests/shared/src/test/resources/default/Unicode.stat diff --git a/scalafmt-tests/src/test/resources/default/Unindent.stat b/scalafmt-tests/shared/src/test/resources/default/Unindent.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Unindent.stat rename to scalafmt-tests/shared/src/test/resources/default/Unindent.stat diff --git a/scalafmt-tests/src/test/resources/default/Val.stat b/scalafmt-tests/shared/src/test/resources/default/Val.stat similarity index 100% rename from scalafmt-tests/src/test/resources/default/Val.stat rename to scalafmt-tests/shared/src/test/resources/default/Val.stat diff --git a/scalafmt-tests/src/test/resources/literals/Double.stat b/scalafmt-tests/shared/src/test/resources/literals/Double.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/Double.stat rename to scalafmt-tests/shared/src/test/resources/literals/Double.stat diff --git a/scalafmt-tests/src/test/resources/literals/Float.stat b/scalafmt-tests/shared/src/test/resources/literals/Float.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/Float.stat rename to scalafmt-tests/shared/src/test/resources/literals/Float.stat diff --git a/scalafmt-tests/src/test/resources/literals/Long.stat b/scalafmt-tests/shared/src/test/resources/literals/Long.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/Long.stat rename to scalafmt-tests/shared/src/test/resources/literals/Long.stat diff --git a/scalafmt-tests/src/test/resources/literals/Unchanged.stat b/scalafmt-tests/shared/src/test/resources/literals/Unchanged.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/Unchanged.stat rename to scalafmt-tests/shared/src/test/resources/literals/Unchanged.stat diff --git a/scalafmt-tests/src/test/resources/literals/hex.stat b/scalafmt-tests/shared/src/test/resources/literals/hex.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/hex.stat rename to scalafmt-tests/shared/src/test/resources/literals/hex.stat diff --git a/scalafmt-tests/src/test/resources/literals/scientific.stat b/scalafmt-tests/shared/src/test/resources/literals/scientific.stat similarity index 100% rename from scalafmt-tests/src/test/resources/literals/scientific.stat rename to scalafmt-tests/shared/src/test/resources/literals/scientific.stat diff --git a/scalafmt-tests/src/test/resources/newdefault/CaseNoAlign.stat b/scalafmt-tests/shared/src/test/resources/newdefault/CaseNoAlign.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newdefault/CaseNoAlign.stat rename to scalafmt-tests/shared/src/test/resources/newdefault/CaseNoAlign.stat diff --git a/scalafmt-tests/src/test/resources/newdefault/ColumnWidth.stat b/scalafmt-tests/shared/src/test/resources/newdefault/ColumnWidth.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newdefault/ColumnWidth.stat rename to scalafmt-tests/shared/src/test/resources/newdefault/ColumnWidth.stat diff --git a/scalafmt-tests/src/test/resources/newdefault/SearchState.stat b/scalafmt-tests/shared/src/test/resources/newdefault/SearchState.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newdefault/SearchState.stat rename to scalafmt-tests/shared/src/test/resources/newdefault/SearchState.stat diff --git a/scalafmt-tests/src/test/resources/newlines/AlwaysBeforeCurlyBraceLambdaParams.stat b/scalafmt-tests/shared/src/test/resources/newlines/AlwaysBeforeCurlyBraceLambdaParams.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/AlwaysBeforeCurlyBraceLambdaParams.stat rename to scalafmt-tests/shared/src/test/resources/newlines/AlwaysBeforeCurlyBraceLambdaParams.stat diff --git a/scalafmt-tests/src/test/resources/newlines/OffByOneParameterlessMethod.stat b/scalafmt-tests/shared/src/test/resources/newlines/OffByOneParameterlessMethod.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/OffByOneParameterlessMethod.stat rename to scalafmt-tests/shared/src/test/resources/newlines/OffByOneParameterlessMethod.stat diff --git a/scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaAlways.stat b/scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaAlways.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaAlways.stat rename to scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaAlways.stat diff --git a/scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaNever.stat b/scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaNever.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaNever.stat rename to scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaNever.stat diff --git a/scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaPreserve.stat b/scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaPreserve.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaPreserve.stat rename to scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaPreserve.stat diff --git a/scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaSquash.stat b/scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaSquash.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/afterCurlyLambdaSquash.stat rename to scalafmt-tests/shared/src/test/resources/newlines/afterCurlyLambdaSquash.stat diff --git a/scalafmt-tests/src/test/resources/newlines/alwaysBeforeElseAfterCurlyIf.stat b/scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeElseAfterCurlyIf.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/alwaysBeforeElseAfterCurlyIf.stat rename to scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeElseAfterCurlyIf.stat diff --git a/scalafmt-tests/src/test/resources/newlines/alwaysBeforeMultilineDef.stat b/scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeMultilineDef.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/alwaysBeforeMultilineDef.stat rename to scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeMultilineDef.stat diff --git a/scalafmt-tests/src/test/resources/newlines/alwaysBeforeTopLevelStatements.source b/scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeTopLevelStatements.source similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/alwaysBeforeTopLevelStatements.source rename to scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeTopLevelStatements.source diff --git a/scalafmt-tests/src/test/resources/newlines/alwaysBeforeTopLevelStatements.stat b/scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeTopLevelStatements.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/alwaysBeforeTopLevelStatements.stat rename to scalafmt-tests/shared/src/test/resources/newlines/alwaysBeforeTopLevelStatements.stat diff --git a/scalafmt-tests/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingF.stat b/scalafmt-tests/shared/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingF.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingF.stat rename to scalafmt-tests/shared/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingF.stat diff --git a/scalafmt-tests/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingT.stat b/scalafmt-tests/shared/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingT.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingT.stat rename to scalafmt-tests/shared/src/test/resources/newlines/beforeConfigSingleArgParenLambdaParamsF_danglingT.stat diff --git a/scalafmt-tests/src/test/resources/newlines/newlineBetweenCurlyAndCatchFinally.stat b/scalafmt-tests/shared/src/test/resources/newlines/newlineBetweenCurlyAndCatchFinally.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/newlineBetweenCurlyAndCatchFinally.stat rename to scalafmt-tests/shared/src/test/resources/newlines/newlineBetweenCurlyAndCatchFinally.stat diff --git a/scalafmt-tests/src/test/resources/newlines/source.source b/scalafmt-tests/shared/src/test/resources/newlines/source.source similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/source.source rename to scalafmt-tests/shared/src/test/resources/newlines/source.source diff --git a/scalafmt-tests/src/test/resources/newlines/source_classic.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/source_classic.stat rename to scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat diff --git a/scalafmt-tests/src/test/resources/newlines/source_fold.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_fold.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/source_fold.stat rename to scalafmt-tests/shared/src/test/resources/newlines/source_fold.stat diff --git a/scalafmt-tests/src/test/resources/newlines/source_keep.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/source_keep.stat rename to scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat diff --git a/scalafmt-tests/src/test/resources/newlines/source_unfold.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_unfold.stat similarity index 100% rename from scalafmt-tests/src/test/resources/newlines/source_unfold.stat rename to scalafmt-tests/shared/src/test/resources/newlines/source_unfold.stat diff --git a/scalafmt-tests/src/test/resources/optIn/Annotation.stat b/scalafmt-tests/shared/src/test/resources/optIn/Annotation.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/Annotation.stat rename to scalafmt-tests/shared/src/test/resources/optIn/Annotation.stat diff --git a/scalafmt-tests/src/test/resources/optIn/AnnotationParam.stat b/scalafmt-tests/shared/src/test/resources/optIn/AnnotationParam.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/AnnotationParam.stat rename to scalafmt-tests/shared/src/test/resources/optIn/AnnotationParam.stat diff --git a/scalafmt-tests/src/test/resources/optIn/BreakChainOnFirstMethodDot.stat b/scalafmt-tests/shared/src/test/resources/optIn/BreakChainOnFirstMethodDot.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/BreakChainOnFirstMethodDot.stat rename to scalafmt-tests/shared/src/test/resources/optIn/BreakChainOnFirstMethodDot.stat diff --git a/scalafmt-tests/src/test/resources/optIn/SelectChain.stat b/scalafmt-tests/shared/src/test/resources/optIn/SelectChain.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/SelectChain.stat rename to scalafmt-tests/shared/src/test/resources/optIn/SelectChain.stat diff --git a/scalafmt-tests/src/test/resources/optIn/SelectChains.stat b/scalafmt-tests/shared/src/test/resources/optIn/SelectChains.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/SelectChains.stat rename to scalafmt-tests/shared/src/test/resources/optIn/SelectChains.stat diff --git a/scalafmt-tests/src/test/resources/optIn/SelfAnnotation.stat b/scalafmt-tests/shared/src/test/resources/optIn/SelfAnnotation.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/SelfAnnotation.stat rename to scalafmt-tests/shared/src/test/resources/optIn/SelfAnnotation.stat diff --git a/scalafmt-tests/src/test/resources/optIn/forceBlankLineBeforeDocstring.stat b/scalafmt-tests/shared/src/test/resources/optIn/forceBlankLineBeforeDocstring.stat similarity index 100% rename from scalafmt-tests/src/test/resources/optIn/forceBlankLineBeforeDocstring.stat rename to scalafmt-tests/shared/src/test/resources/optIn/forceBlankLineBeforeDocstring.stat diff --git a/scalafmt-tests/src/test/resources/readme.md b/scalafmt-tests/shared/src/test/resources/readme.md similarity index 100% rename from scalafmt-tests/src/test/resources/readme.md rename to scalafmt-tests/shared/src/test/resources/readme.md diff --git a/scalafmt-tests/src/test/resources/rewrite/AsciiSortImports.stat b/scalafmt-tests/shared/src/test/resources/rewrite/AsciiSortImports.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/AsciiSortImports.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/AsciiSortImports.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/AvoidInfix.stat b/scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/AvoidInfix.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/AvoidInfix2.stat b/scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix2.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/AvoidInfix2.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix2.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/AvoidInfix3.stat b/scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix3.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/AvoidInfix3.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/AvoidInfix3.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/ExpandImportSelectors.stat b/scalafmt-tests/shared/src/test/resources/rewrite/ExpandImportSelectors.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/ExpandImportSelectors.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/ExpandImportSelectors.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/PreferCurlyForYields.stat b/scalafmt-tests/shared/src/test/resources/rewrite/PreferCurlyForYields.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/PreferCurlyForYields.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/PreferCurlyForYields.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/PreferCurlyFors.stat b/scalafmt-tests/shared/src/test/resources/rewrite/PreferCurlyFors.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/PreferCurlyFors.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/PreferCurlyFors.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces-ParenLambdas.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-ParenLambdas.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces-ParenLambdas.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-ParenLambdas.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces-case.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-case.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces-case.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-case.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces-if.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces-if.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces-precedence.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-precedence.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces-precedence.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-precedence.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces2.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces2.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces2.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces2.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBraces748.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces748.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBraces748.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces748.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantBracesStrInterpolation.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBracesStrInterpolation.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantBracesStrInterpolation.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantBracesStrInterpolation.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/RedundantParens.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantParens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/RedundantParens.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/RedundantParens.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/SortImports.stat b/scalafmt-tests/shared/src/test/resources/rewrite/SortImports.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortImports.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/SortImports.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers.stat b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers1.source b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers1.source similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers1.source rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers1.source diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiersScala3.stat b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiersScala3.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiersScala3.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiersScala3.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers_Default.source b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_Default.source similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers_Default.source rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_Default.source diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers_Mod_With_No_Token.source b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_Mod_With_No_Token.source similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers_Mod_With_No_Token.source rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_Mod_With_No_Token.source diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers_bug_1148.stat b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_bug_1148.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers_bug_1148.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_bug_1148.stat diff --git a/scalafmt-tests/src/test/resources/rewrite/SortModifiers_bug_1148_implicit_first_in_order.stat b/scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_bug_1148_implicit_first_in_order.stat similarity index 100% rename from scalafmt-tests/src/test/resources/rewrite/SortModifiers_bug_1148_implicit_first_in_order.stat rename to scalafmt-tests/shared/src/test/resources/rewrite/SortModifiers_bug_1148_implicit_first_in_order.stat diff --git a/scalafmt-tests/src/test/resources/scala3/ContextFunction.stat b/scalafmt-tests/shared/src/test/resources/scala3/ContextFunction.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/ContextFunction.stat rename to scalafmt-tests/shared/src/test/resources/scala3/ContextFunction.stat diff --git a/scalafmt-tests/src/test/resources/scala3/DependentFunction.stat b/scalafmt-tests/shared/src/test/resources/scala3/DependentFunction.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/DependentFunction.stat rename to scalafmt-tests/shared/src/test/resources/scala3/DependentFunction.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Derives.stat b/scalafmt-tests/shared/src/test/resources/scala3/Derives.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Derives.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Derives.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Dialect.stat b/scalafmt-tests/shared/src/test/resources/scala3/Dialect.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Dialect.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Dialect.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Enum.stat b/scalafmt-tests/shared/src/test/resources/scala3/Enum.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Enum.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Enum.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Export.stat b/scalafmt-tests/shared/src/test/resources/scala3/Export.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Export.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Export.stat diff --git a/scalafmt-tests/src/test/resources/scala3/ExportGivens.stat b/scalafmt-tests/shared/src/test/resources/scala3/ExportGivens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/ExportGivens.stat rename to scalafmt-tests/shared/src/test/resources/scala3/ExportGivens.stat diff --git a/scalafmt-tests/src/test/resources/scala3/ExtendsComma.stat b/scalafmt-tests/shared/src/test/resources/scala3/ExtendsComma.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/ExtendsComma.stat rename to scalafmt-tests/shared/src/test/resources/scala3/ExtendsComma.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Extension.stat b/scalafmt-tests/shared/src/test/resources/scala3/Extension.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Extension.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Extension.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Given.stat b/scalafmt-tests/shared/src/test/resources/scala3/Given.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Given.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Given.stat diff --git a/scalafmt-tests/src/test/resources/scala3/GivenPatterns.stat b/scalafmt-tests/shared/src/test/resources/scala3/GivenPatterns.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/GivenPatterns.stat rename to scalafmt-tests/shared/src/test/resources/scala3/GivenPatterns.stat diff --git a/scalafmt-tests/src/test/resources/scala3/ImportingGivens.stat b/scalafmt-tests/shared/src/test/resources/scala3/ImportingGivens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/ImportingGivens.stat rename to scalafmt-tests/shared/src/test/resources/scala3/ImportingGivens.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Infix.stat b/scalafmt-tests/shared/src/test/resources/scala3/Infix.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Infix.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Infix.stat diff --git a/scalafmt-tests/src/test/resources/scala3/InlineTransparent.stat b/scalafmt-tests/shared/src/test/resources/scala3/InlineTransparent.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/InlineTransparent.stat rename to scalafmt-tests/shared/src/test/resources/scala3/InlineTransparent.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Issues.stat b/scalafmt-tests/shared/src/test/resources/scala3/Issues.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Issues.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Issues.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Macro.stat b/scalafmt-tests/shared/src/test/resources/scala3/Macro.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Macro.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Macro.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Match.stat b/scalafmt-tests/shared/src/test/resources/scala3/Match.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Match.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Match.stat diff --git a/scalafmt-tests/src/test/resources/scala3/MatchType.stat b/scalafmt-tests/shared/src/test/resources/scala3/MatchType.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/MatchType.stat rename to scalafmt-tests/shared/src/test/resources/scala3/MatchType.stat diff --git a/scalafmt-tests/src/test/resources/scala3/OpaqueType.stat b/scalafmt-tests/shared/src/test/resources/scala3/OpaqueType.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/OpaqueType.stat rename to scalafmt-tests/shared/src/test/resources/scala3/OpaqueType.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Open.stat b/scalafmt-tests/shared/src/test/resources/scala3/Open.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Open.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Open.stat diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat b/scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat rename to scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces.stat diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat b/scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_fold.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat rename to scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_fold.stat diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat b/scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_keep.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat rename to scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_keep.stat diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat b/scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_unfold.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat rename to scalafmt-tests/shared/src/test/resources/scala3/OptionalBraces_unfold.stat diff --git a/scalafmt-tests/src/test/resources/scala3/PolyFunction.stat b/scalafmt-tests/shared/src/test/resources/scala3/PolyFunction.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/PolyFunction.stat rename to scalafmt-tests/shared/src/test/resources/scala3/PolyFunction.stat diff --git a/scalafmt-tests/src/test/resources/scala3/RenameImportExport.stat b/scalafmt-tests/shared/src/test/resources/scala3/RenameImportExport.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/RenameImportExport.stat rename to scalafmt-tests/shared/src/test/resources/scala3/RenameImportExport.stat diff --git a/scalafmt-tests/src/test/resources/scala3/StarImport.stat b/scalafmt-tests/shared/src/test/resources/scala3/StarImport.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/StarImport.stat rename to scalafmt-tests/shared/src/test/resources/scala3/StarImport.stat diff --git a/scalafmt-tests/src/test/resources/scala3/TraitParams.stat b/scalafmt-tests/shared/src/test/resources/scala3/TraitParams.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/TraitParams.stat rename to scalafmt-tests/shared/src/test/resources/scala3/TraitParams.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Type.stat b/scalafmt-tests/shared/src/test/resources/scala3/Type.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Type.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Type.stat diff --git a/scalafmt-tests/src/test/resources/scala3/TypeLambda.stat b/scalafmt-tests/shared/src/test/resources/scala3/TypeLambda.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/TypeLambda.stat rename to scalafmt-tests/shared/src/test/resources/scala3/TypeLambda.stat diff --git a/scalafmt-tests/src/test/resources/scala3/UnionIntersectionType.stat b/scalafmt-tests/shared/src/test/resources/scala3/UnionIntersectionType.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/UnionIntersectionType.stat rename to scalafmt-tests/shared/src/test/resources/scala3/UnionIntersectionType.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Using.stat b/scalafmt-tests/shared/src/test/resources/scala3/Using.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Using.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Using.stat diff --git a/scalafmt-tests/src/test/resources/scala3/Vararg.stat b/scalafmt-tests/shared/src/test/resources/scala3/Vararg.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scala3/Vararg.stat rename to scalafmt-tests/shared/src/test/resources/scala3/Vararg.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/Advanced.stat b/scalafmt-tests/shared/src/test/resources/scalajs/Advanced.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/Advanced.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/Advanced.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/Apply.stat b/scalafmt-tests/shared/src/test/resources/scalajs/Apply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/Apply.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/Apply.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/Class.stat b/scalafmt-tests/shared/src/test/resources/scalajs/Class.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/Class.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/Class.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/DefDef.stat b/scalafmt-tests/shared/src/test/resources/scalajs/DefDef.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/DefDef.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/DefDef.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/For.stat b/scalafmt-tests/shared/src/test/resources/scalajs/For.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/For.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/For.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/If.stat b/scalafmt-tests/shared/src/test/resources/scalajs/If.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/If.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/If.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/Import.source b/scalafmt-tests/shared/src/test/resources/scalajs/Import.source similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/Import.source rename to scalafmt-tests/shared/src/test/resources/scalajs/Import.source diff --git a/scalafmt-tests/src/test/resources/scalajs/TermApply.stat b/scalafmt-tests/shared/src/test/resources/scalajs/TermApply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/TermApply.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/TermApply.stat diff --git a/scalafmt-tests/src/test/resources/scalajs/Type.stat b/scalafmt-tests/shared/src/test/resources/scalajs/Type.stat similarity index 100% rename from scalafmt-tests/src/test/resources/scalajs/Type.stat rename to scalafmt-tests/shared/src/test/resources/scalajs/Type.stat diff --git a/scalafmt-tests/src/test/resources/spaces/AfterKeywordBeforeParen.stat b/scalafmt-tests/shared/src/test/resources/spaces/AfterKeywordBeforeParen.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/AfterKeywordBeforeParen.stat rename to scalafmt-tests/shared/src/test/resources/spaces/AfterKeywordBeforeParen.stat diff --git a/scalafmt-tests/src/test/resources/spaces/AfterSymbolicDefs.stat b/scalafmt-tests/shared/src/test/resources/spaces/AfterSymbolicDefs.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/AfterSymbolicDefs.stat rename to scalafmt-tests/shared/src/test/resources/spaces/AfterSymbolicDefs.stat diff --git a/scalafmt-tests/src/test/resources/spaces/BeforeContextBoundColonIfMultipleBounds.stat b/scalafmt-tests/shared/src/test/resources/spaces/BeforeContextBoundColonIfMultipleBounds.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/BeforeContextBoundColonIfMultipleBounds.stat rename to scalafmt-tests/shared/src/test/resources/spaces/BeforeContextBoundColonIfMultipleBounds.stat diff --git a/scalafmt-tests/src/test/resources/spaces/BeforeContextBoundColonTrue.stat b/scalafmt-tests/shared/src/test/resources/spaces/BeforeContextBoundColonTrue.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/BeforeContextBoundColonTrue.stat rename to scalafmt-tests/shared/src/test/resources/spaces/BeforeContextBoundColonTrue.stat diff --git a/scalafmt-tests/src/test/resources/spaces/Constructor.stat b/scalafmt-tests/shared/src/test/resources/spaces/Constructor.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/Constructor.stat rename to scalafmt-tests/shared/src/test/resources/spaces/Constructor.stat diff --git a/scalafmt-tests/src/test/resources/spaces/Hacking.stat b/scalafmt-tests/shared/src/test/resources/spaces/Hacking.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/Hacking.stat rename to scalafmt-tests/shared/src/test/resources/spaces/Hacking.stat diff --git a/scalafmt-tests/src/test/resources/spaces/ImportCurlyBraces.source b/scalafmt-tests/shared/src/test/resources/spaces/ImportCurlyBraces.source similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/ImportCurlyBraces.source rename to scalafmt-tests/shared/src/test/resources/spaces/ImportCurlyBraces.source diff --git a/scalafmt-tests/src/test/resources/spaces/InByNameTypes.stat b/scalafmt-tests/shared/src/test/resources/spaces/InByNameTypes.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/InByNameTypes.stat rename to scalafmt-tests/shared/src/test/resources/spaces/InByNameTypes.stat diff --git a/scalafmt-tests/src/test/resources/spaces/InParentheses.stat b/scalafmt-tests/shared/src/test/resources/spaces/InParentheses.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/InParentheses.stat rename to scalafmt-tests/shared/src/test/resources/spaces/InParentheses.stat diff --git a/scalafmt-tests/src/test/resources/spaces/InterpolatedStringCurlyBraces.stat b/scalafmt-tests/shared/src/test/resources/spaces/InterpolatedStringCurlyBraces.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/InterpolatedStringCurlyBraces.stat rename to scalafmt-tests/shared/src/test/resources/spaces/InterpolatedStringCurlyBraces.stat diff --git a/scalafmt-tests/src/test/resources/spaces/NeverAroundInfixTypes.stat b/scalafmt-tests/shared/src/test/resources/spaces/NeverAroundInfixTypes.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/NeverAroundInfixTypes.stat rename to scalafmt-tests/shared/src/test/resources/spaces/NeverAroundInfixTypes.stat diff --git a/scalafmt-tests/src/test/resources/spaces/Scalatest.stat b/scalafmt-tests/shared/src/test/resources/spaces/Scalatest.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/Scalatest.stat rename to scalafmt-tests/shared/src/test/resources/spaces/Scalatest.stat diff --git a/scalafmt-tests/src/test/resources/spaces/TrailingWhiteSpace.stat b/scalafmt-tests/shared/src/test/resources/spaces/TrailingWhiteSpace.stat similarity index 100% rename from scalafmt-tests/src/test/resources/spaces/TrailingWhiteSpace.stat rename to scalafmt-tests/shared/src/test/resources/spaces/TrailingWhiteSpace.stat diff --git a/scalafmt-tests/src/test/resources/test/BlocksInSingleArg.stat b/scalafmt-tests/shared/src/test/resources/test/BlocksInSingleArg.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/BlocksInSingleArg.stat rename to scalafmt-tests/shared/src/test/resources/test/BlocksInSingleArg.stat diff --git a/scalafmt-tests/src/test/resources/test/Class.stat b/scalafmt-tests/shared/src/test/resources/test/Class.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/Class.stat rename to scalafmt-tests/shared/src/test/resources/test/Class.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndent.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndent.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndent.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndent.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite0.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite0.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite0.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite0.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite1.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite1.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite1.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite1.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite5.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite5.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndentCaseSite5.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndentCaseSite5.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndentHalfDanglingParens.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndentHalfDanglingParens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndentHalfDanglingParens.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndentHalfDanglingParens.stat diff --git a/scalafmt-tests/src/test/resources/test/ContinuationIndentNoDanglingParens.stat b/scalafmt-tests/shared/src/test/resources/test/ContinuationIndentNoDanglingParens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/ContinuationIndentNoDanglingParens.stat rename to scalafmt-tests/shared/src/test/resources/test/ContinuationIndentNoDanglingParens.stat diff --git a/scalafmt-tests/src/test/resources/test/Dangling.stat b/scalafmt-tests/shared/src/test/resources/test/Dangling.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/Dangling.stat rename to scalafmt-tests/shared/src/test/resources/test/Dangling.stat diff --git a/scalafmt-tests/src/test/resources/test/Dialect.source b/scalafmt-tests/shared/src/test/resources/test/Dialect.source similarity index 100% rename from scalafmt-tests/src/test/resources/test/Dialect.source rename to scalafmt-tests/shared/src/test/resources/test/Dialect.source diff --git a/scalafmt-tests/src/test/resources/test/DynamicStyle.stat b/scalafmt-tests/shared/src/test/resources/test/DynamicStyle.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/DynamicStyle.stat rename to scalafmt-tests/shared/src/test/resources/test/DynamicStyle.stat diff --git a/scalafmt-tests/src/test/resources/test/ImportSingleLine.source b/scalafmt-tests/shared/src/test/resources/test/ImportSingleLine.source similarity index 100% rename from scalafmt-tests/src/test/resources/test/ImportSingleLine.source rename to scalafmt-tests/shared/src/test/resources/test/ImportSingleLine.source diff --git a/scalafmt-tests/src/test/resources/test/IndentOperator.stat b/scalafmt-tests/shared/src/test/resources/test/IndentOperator.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/IndentOperator.stat rename to scalafmt-tests/shared/src/test/resources/test/IndentOperator.stat diff --git a/scalafmt-tests/src/test/resources/test/IndentOperatorFormatInfix.stat b/scalafmt-tests/shared/src/test/resources/test/IndentOperatorFormatInfix.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/IndentOperatorFormatInfix.stat rename to scalafmt-tests/shared/src/test/resources/test/IndentOperatorFormatInfix.stat diff --git a/scalafmt-tests/src/test/resources/test/IndentYieldKeyword.stat b/scalafmt-tests/shared/src/test/resources/test/IndentYieldKeyword.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/IndentYieldKeyword.stat rename to scalafmt-tests/shared/src/test/resources/test/IndentYieldKeyword.stat diff --git a/scalafmt-tests/src/test/resources/test/Issue1509.stat b/scalafmt-tests/shared/src/test/resources/test/Issue1509.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/Issue1509.stat rename to scalafmt-tests/shared/src/test/resources/test/Issue1509.stat diff --git a/scalafmt-tests/src/test/resources/test/JavaDoc.stat b/scalafmt-tests/shared/src/test/resources/test/JavaDoc.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/JavaDoc.stat rename to scalafmt-tests/shared/src/test/resources/test/JavaDoc.stat diff --git a/scalafmt-tests/src/test/resources/test/NoAlign.stat b/scalafmt-tests/shared/src/test/resources/test/NoAlign.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/NoAlign.stat rename to scalafmt-tests/shared/src/test/resources/test/NoAlign.stat diff --git a/scalafmt-tests/src/test/resources/test/OperatorSpray.stat b/scalafmt-tests/shared/src/test/resources/test/OperatorSpray.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/OperatorSpray.stat rename to scalafmt-tests/shared/src/test/resources/test/OperatorSpray.stat diff --git a/scalafmt-tests/src/test/resources/test/StripMargin.stat b/scalafmt-tests/shared/src/test/resources/test/StripMargin.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/StripMargin.stat rename to scalafmt-tests/shared/src/test/resources/test/StripMargin.stat diff --git a/scalafmt-tests/src/test/resources/test/Type747.stat b/scalafmt-tests/shared/src/test/resources/test/Type747.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/Type747.stat rename to scalafmt-tests/shared/src/test/resources/test/Type747.stat diff --git a/scalafmt-tests/src/test/resources/test/Unicode.stat b/scalafmt-tests/shared/src/test/resources/test/Unicode.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/Unicode.stat rename to scalafmt-tests/shared/src/test/resources/test/Unicode.stat diff --git a/scalafmt-tests/src/test/resources/test/UnindentTopLevelOperatorsOperatorSpray.stat b/scalafmt-tests/shared/src/test/resources/test/UnindentTopLevelOperatorsOperatorSpray.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/UnindentTopLevelOperatorsOperatorSpray.stat rename to scalafmt-tests/shared/src/test/resources/test/UnindentTopLevelOperatorsOperatorSpray.stat diff --git a/scalafmt-tests/src/test/resources/test/arityThreshold.source b/scalafmt-tests/shared/src/test/resources/test/arityThreshold.source similarity index 100% rename from scalafmt-tests/src/test/resources/test/arityThreshold.source rename to scalafmt-tests/shared/src/test/resources/test/arityThreshold.source diff --git a/scalafmt-tests/src/test/resources/test/i1116.stat b/scalafmt-tests/shared/src/test/resources/test/i1116.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/i1116.stat rename to scalafmt-tests/shared/src/test/resources/test/i1116.stat diff --git a/scalafmt-tests/src/test/resources/test/i1245.stat b/scalafmt-tests/shared/src/test/resources/test/i1245.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/i1245.stat rename to scalafmt-tests/shared/src/test/resources/test/i1245.stat diff --git a/scalafmt-tests/src/test/resources/test/i1300.stat b/scalafmt-tests/shared/src/test/resources/test/i1300.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/i1300.stat rename to scalafmt-tests/shared/src/test/resources/test/i1300.stat diff --git a/scalafmt-tests/src/test/resources/test/i1439.stat b/scalafmt-tests/shared/src/test/resources/test/i1439.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/i1439.stat rename to scalafmt-tests/shared/src/test/resources/test/i1439.stat diff --git a/scalafmt-tests/src/test/resources/test/i1527.stat b/scalafmt-tests/shared/src/test/resources/test/i1527.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/i1527.stat rename to scalafmt-tests/shared/src/test/resources/test/i1527.stat diff --git a/scalafmt-tests/src/test/resources/test/includeNoParensInSelectChains.stat b/scalafmt-tests/shared/src/test/resources/test/includeNoParensInSelectChains.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/includeNoParensInSelectChains.stat rename to scalafmt-tests/shared/src/test/resources/test/includeNoParensInSelectChains.stat diff --git a/scalafmt-tests/src/test/resources/test/poorMansTrailingCommasInConfigStyle.stat b/scalafmt-tests/shared/src/test/resources/test/poorMansTrailingCommasInConfigStyle.stat similarity index 100% rename from scalafmt-tests/src/test/resources/test/poorMansTrailingCommasInConfigStyle.stat rename to scalafmt-tests/shared/src/test/resources/test/poorMansTrailingCommasInConfigStyle.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlways.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlways.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlways.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlways.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysAlignMore.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysAlignMore.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysAlignMore.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysAlignMore.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysComments.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysComments.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysComments.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysComments.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysDanglingParens.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysDanglingParens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysDanglingParens.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysDanglingParens.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysOwners.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysOwners.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysOwners.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysOwners.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysSingleLine.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysSingleLine.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysSingleLine.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysSingleLine.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysVerticalMultilineAtDefnSite.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysVerticalMultilineAtDefnSite.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasAlwaysVerticalMultilineAtDefnSite.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasAlwaysVerticalMultilineAtDefnSite.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultiple.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultiple.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultiple.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultiple.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleAlignMore.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleAlignMore.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleAlignMore.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleAlignMore.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleComments.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleComments.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleComments.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleComments.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleDanglingParens.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleDanglingParens.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasMultipleDanglingParens.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasMultipleDanglingParens.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNever.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNever.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNever.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNever.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverComments.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverComments.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverComments.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverComments.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverCommentsAlignMore.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverCommentsAlignMore.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverCommentsAlignMore.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverCommentsAlignMore.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverSingleLine.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverSingleLine.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasNeverSingleLine.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasNeverSingleLine.stat diff --git a/scalafmt-tests/src/test/resources/trailing-commas/trailingCommasPreserve.stat b/scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasPreserve.stat similarity index 100% rename from scalafmt-tests/src/test/resources/trailing-commas/trailingCommasPreserve.stat rename to scalafmt-tests/shared/src/test/resources/trailing-commas/trailingCommasPreserve.stat diff --git a/scalafmt-tests/src/test/resources/unit/Advanced.source b/scalafmt-tests/shared/src/test/resources/unit/Advanced.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Advanced.source rename to scalafmt-tests/shared/src/test/resources/unit/Advanced.source diff --git a/scalafmt-tests/src/test/resources/unit/Annotations.stat b/scalafmt-tests/shared/src/test/resources/unit/Annotations.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Annotations.stat rename to scalafmt-tests/shared/src/test/resources/unit/Annotations.stat diff --git a/scalafmt-tests/src/test/resources/unit/Apply.stat b/scalafmt-tests/shared/src/test/resources/unit/Apply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Apply.stat rename to scalafmt-tests/shared/src/test/resources/unit/Apply.stat diff --git a/scalafmt-tests/src/test/resources/unit/ApplyInfix.stat b/scalafmt-tests/shared/src/test/resources/unit/ApplyInfix.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/ApplyInfix.stat rename to scalafmt-tests/shared/src/test/resources/unit/ApplyInfix.stat diff --git a/scalafmt-tests/src/test/resources/unit/Argument.source b/scalafmt-tests/shared/src/test/resources/unit/Argument.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Argument.source rename to scalafmt-tests/shared/src/test/resources/unit/Argument.source diff --git a/scalafmt-tests/src/test/resources/unit/Basic.source b/scalafmt-tests/shared/src/test/resources/unit/Basic.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Basic.source rename to scalafmt-tests/shared/src/test/resources/unit/Basic.source diff --git a/scalafmt-tests/src/test/resources/unit/Case.case b/scalafmt-tests/shared/src/test/resources/unit/Case.case similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Case.case rename to scalafmt-tests/shared/src/test/resources/unit/Case.case diff --git a/scalafmt-tests/src/test/resources/unit/Case.stat b/scalafmt-tests/shared/src/test/resources/unit/Case.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Case.stat rename to scalafmt-tests/shared/src/test/resources/unit/Case.stat diff --git a/scalafmt-tests/src/test/resources/unit/ColumnWidth.source b/scalafmt-tests/shared/src/test/resources/unit/ColumnWidth.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/ColumnWidth.source rename to scalafmt-tests/shared/src/test/resources/unit/ColumnWidth.source diff --git a/scalafmt-tests/src/test/resources/unit/Comment.stat b/scalafmt-tests/shared/src/test/resources/unit/Comment.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Comment.stat rename to scalafmt-tests/shared/src/test/resources/unit/Comment.stat diff --git a/scalafmt-tests/src/test/resources/unit/Cond.stat b/scalafmt-tests/shared/src/test/resources/unit/Cond.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Cond.stat rename to scalafmt-tests/shared/src/test/resources/unit/Cond.stat diff --git a/scalafmt-tests/src/test/resources/unit/DefDef.stat b/scalafmt-tests/shared/src/test/resources/unit/DefDef.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/DefDef.stat rename to scalafmt-tests/shared/src/test/resources/unit/DefDef.stat diff --git a/scalafmt-tests/src/test/resources/unit/Dialect.stat b/scalafmt-tests/shared/src/test/resources/unit/Dialect.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Dialect.stat rename to scalafmt-tests/shared/src/test/resources/unit/Dialect.stat diff --git a/scalafmt-tests/src/test/resources/unit/For.stat b/scalafmt-tests/shared/src/test/resources/unit/For.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/For.stat rename to scalafmt-tests/shared/src/test/resources/unit/For.stat diff --git a/scalafmt-tests/src/test/resources/unit/FormatOff.stat b/scalafmt-tests/shared/src/test/resources/unit/FormatOff.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/FormatOff.stat rename to scalafmt-tests/shared/src/test/resources/unit/FormatOff.stat diff --git a/scalafmt-tests/src/test/resources/unit/If.stat b/scalafmt-tests/shared/src/test/resources/unit/If.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/If.stat rename to scalafmt-tests/shared/src/test/resources/unit/If.stat diff --git a/scalafmt-tests/src/test/resources/unit/Import.source b/scalafmt-tests/shared/src/test/resources/unit/Import.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Import.source rename to scalafmt-tests/shared/src/test/resources/unit/Import.source diff --git a/scalafmt-tests/src/test/resources/unit/Interpolate.stat b/scalafmt-tests/shared/src/test/resources/unit/Interpolate.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Interpolate.stat rename to scalafmt-tests/shared/src/test/resources/unit/Interpolate.stat diff --git a/scalafmt-tests/src/test/resources/unit/Lambda.stat b/scalafmt-tests/shared/src/test/resources/unit/Lambda.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Lambda.stat rename to scalafmt-tests/shared/src/test/resources/unit/Lambda.stat diff --git a/scalafmt-tests/src/test/resources/unit/Lit.stat b/scalafmt-tests/shared/src/test/resources/unit/Lit.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Lit.stat rename to scalafmt-tests/shared/src/test/resources/unit/Lit.stat diff --git a/scalafmt-tests/src/test/resources/unit/Mod.stat b/scalafmt-tests/shared/src/test/resources/unit/Mod.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Mod.stat rename to scalafmt-tests/shared/src/test/resources/unit/Mod.stat diff --git a/scalafmt-tests/src/test/resources/unit/Package.source b/scalafmt-tests/shared/src/test/resources/unit/Package.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Package.source rename to scalafmt-tests/shared/src/test/resources/unit/Package.source diff --git a/scalafmt-tests/src/test/resources/unit/Symbol.stat b/scalafmt-tests/shared/src/test/resources/unit/Symbol.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Symbol.stat rename to scalafmt-tests/shared/src/test/resources/unit/Symbol.stat diff --git a/scalafmt-tests/src/test/resources/unit/Template.source b/scalafmt-tests/shared/src/test/resources/unit/Template.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Template.source rename to scalafmt-tests/shared/src/test/resources/unit/Template.source diff --git a/scalafmt-tests/src/test/resources/unit/TermApply.stat b/scalafmt-tests/shared/src/test/resources/unit/TermApply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/TermApply.stat rename to scalafmt-tests/shared/src/test/resources/unit/TermApply.stat diff --git a/scalafmt-tests/src/test/resources/unit/TermUpdate.stat b/scalafmt-tests/shared/src/test/resources/unit/TermUpdate.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/TermUpdate.stat rename to scalafmt-tests/shared/src/test/resources/unit/TermUpdate.stat diff --git a/scalafmt-tests/src/test/resources/unit/Trait.source b/scalafmt-tests/shared/src/test/resources/unit/Trait.source similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Trait.source rename to scalafmt-tests/shared/src/test/resources/unit/Trait.source diff --git a/scalafmt-tests/src/test/resources/unit/Type.stat b/scalafmt-tests/shared/src/test/resources/unit/Type.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Type.stat rename to scalafmt-tests/shared/src/test/resources/unit/Type.stat diff --git a/scalafmt-tests/src/test/resources/unit/TypeArgument.stat b/scalafmt-tests/shared/src/test/resources/unit/TypeArgument.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/TypeArgument.stat rename to scalafmt-tests/shared/src/test/resources/unit/TypeArgument.stat diff --git a/scalafmt-tests/src/test/resources/unit/UnaryApply.stat b/scalafmt-tests/shared/src/test/resources/unit/UnaryApply.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/UnaryApply.stat rename to scalafmt-tests/shared/src/test/resources/unit/UnaryApply.stat diff --git a/scalafmt-tests/src/test/resources/unit/Val.stat b/scalafmt-tests/shared/src/test/resources/unit/Val.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Val.stat rename to scalafmt-tests/shared/src/test/resources/unit/Val.stat diff --git a/scalafmt-tests/src/test/resources/unit/Xml.stat b/scalafmt-tests/shared/src/test/resources/unit/Xml.stat similarity index 100% rename from scalafmt-tests/src/test/resources/unit/Xml.stat rename to scalafmt-tests/shared/src/test/resources/unit/Xml.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/VerticalMultilineDefnSite.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/VerticalMultilineDefnSite.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/VerticalMultilineDefnSite.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/VerticalMultilineDefnSite.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/afterImplicitKW.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/afterImplicitKW.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/afterImplicitKW.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/afterImplicitKW.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/beforeImplicitKW.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/beforeImplicitKW.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/beforeImplicitKW.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/beforeImplicitKW.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/excludeDanglingInDef.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/excludeDanglingInDef.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/excludeDanglingInDef.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/excludeDanglingInDef.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/newlineAfterOpenParen.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/newlineAfterOpenParen.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/newlineAfterOpenParen.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/newlineAfterOpenParen.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/verticalAlignMultilineOperators.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalAlignMultilineOperators.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/verticalAlignMultilineOperators.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalAlignMultilineOperators.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/verticalMultiline.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultiline.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/verticalMultiline.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultiline.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/verticalMultilineDangling.source b/scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultilineDangling.source similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/verticalMultilineDangling.source rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultilineDangling.source diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/verticalMultilineDefnSiteNoDangling.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultilineDefnSiteNoDangling.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/verticalMultilineDefnSiteNoDangling.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/verticalMultilineDefnSiteNoDangling.stat diff --git a/scalafmt-tests/src/test/resources/vertical-multiline/withSpacesInParentheses.stat b/scalafmt-tests/shared/src/test/resources/vertical-multiline/withSpacesInParentheses.stat similarity index 100% rename from scalafmt-tests/src/test/resources/vertical-multiline/withSpacesInParentheses.stat rename to scalafmt-tests/shared/src/test/resources/vertical-multiline/withSpacesInParentheses.stat diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/CommentTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/CommentTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/CommentTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/CommentTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/Debug.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/Debug.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/Debug.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/Debug.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/EmptyFileTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/EmptyFileTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/EmptyFileTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/EmptyFileTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/FidelityTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/FidelityTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/FidelityTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/FidelityTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/FormatTests.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/FormatTests.scala similarity index 99% rename from scalafmt-tests/src/test/scala/org/scalafmt/FormatTests.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/FormatTests.scala index 0e8a5e4e58..455151d517 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/FormatTests.scala +++ b/scalafmt-tests/shared/src/test/scala/org/scalafmt/FormatTests.scala @@ -26,6 +26,8 @@ class FormatTests extends FunSuite with CanRunTests with FormatAssertions { else UnitTests.tests } + pprint.log(tests) + tests .sortBy(x => (x.loc.path, x.loc.line)) .withFilter(testShouldRun) diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/LineEndingsTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/LineEndingsTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/LineEndingsTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/LineEndingsTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/ManualTests.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/ManualTests.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/ManualTests.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/ManualTests.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/RangeTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/RangeTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/RangeTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/RangeTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtConfigTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtConfigTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtConfigTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtConfigTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtRunnerTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtRunnerTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtRunnerTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtRunnerTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/ScalafmtTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/ScalafmtTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/UnitTests.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/UnitTests.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/UnitTests.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/UnitTests.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/CliTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/CliTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/FakeGitOps.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/FakeGitOps.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/cli/FakeGitOps.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/FakeGitOps.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/FileTestOps.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/FileTestOps.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/cli/FileTestOps.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/cli/FileTestOps.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/dynamic/DynamicSuite.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/DynamicSuite.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/dynamic/DynamicSuite.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/DynamicSuite.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/dynamic/PositionSyntax.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/PositionSyntax.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/dynamic/PositionSyntax.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/PositionSyntax.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/dynamic/ScalafmtVersionSuite.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/ScalafmtVersionSuite.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/dynamic/ScalafmtVersionSuite.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/dynamic/ScalafmtVersionSuite.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/GitInfo.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/GitInfo.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/GitInfo.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/GitInfo.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/JavaInfo.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/JavaInfo.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/JavaInfo.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/JavaInfo.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/MachineStats.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/MachineStats.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/MachineStats.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/MachineStats.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/OsInfo.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/OsInfo.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/OsInfo.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/OsInfo.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/RuntimeInfo.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/RuntimeInfo.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/RuntimeInfo.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/RuntimeInfo.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/stats/TestStats.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/TestStats.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/stats/TestStats.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/stats/TestStats.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/CanRunTests.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/CanRunTests.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/CanRunTests.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/CanRunTests.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/DeleteTree.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/DeleteTree.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/DeleteTree.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/DeleteTree.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/DiffTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/DiffTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/DiffTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/DiffTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/ErrorTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/ErrorTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/ErrorTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/ErrorTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/FormatAssertions.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatAssertions.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/FormatAssertions.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatAssertions.scala index b4e6d076ae..cd22d85f10 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/util/FormatAssertions.scala +++ b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatAssertions.scala @@ -2,7 +2,6 @@ package org.scalafmt.util import java.io.ByteArrayInputStream -import munit.internal.difflib.Diffs import org.scalafmt.Error.{FormatterChangedAST, FormatterOutputDoesNotParse} import org.scalafmt.config.ScalafmtRunner import org.scalameta.logger @@ -10,6 +9,7 @@ import org.scalameta.logger import scala.meta.parsers.{Parse, ParseException} import scala.meta.testkit.StructurallyEqual import scala.meta.{Dialect, Tree} +import munit.internal.difflib.Diffs trait FormatAssertions { diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/FormatException.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatException.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/FormatException.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatException.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/FormatOutput.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatOutput.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/FormatOutput.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/FormatOutput.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/GitOpsTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/GitOpsTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/GitOpsTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/GitOpsTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/HasTests.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/HasTests.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/Report.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Report.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/Report.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Report.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/Result.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Result.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/Result.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Result.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/StyleMapTest.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/StyleMapTest.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/StyleMapTest.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/StyleMapTest.scala diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/Tabulator.scala b/scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Tabulator.scala similarity index 100% rename from scalafmt-tests/src/test/scala/org/scalafmt/util/Tabulator.scala rename to scalafmt-tests/shared/src/test/scala/org/scalafmt/util/Tabulator.scala