diff --git a/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala b/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala index 40a83137fc..50c529ea7e 100644 --- a/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala +++ b/scalafmt-cli/src/main/scala/org/scalafmt/cli/CliOptions.scala @@ -4,7 +4,7 @@ import java.io.{InputStream, OutputStream, PrintStream} import java.nio.file.{Files, NoSuchFileException, Path} import metaconfig.Configured -import org.scalafmt.config.{Config, ConfParsed, ScalafmtConfig} +import org.scalafmt.config.{ConfParsed, ScalafmtConfig} import org.scalafmt.sysops.{AbsoluteFile, GitOps, OsSpecific} import scala.io.Codec @@ -145,7 +145,9 @@ case class CliOptions( * will return the default configuration */ def scalafmtConfig: Configured[ScalafmtConfig] = - hoconOpt.fold(Configured.ok(baseConfig))(Config.fromConf(_, baseConfig)) + hoconOpt.fold(Configured.ok(baseConfig))( + ScalafmtConfig.fromConf(_, baseConfig) + ) private[cli] lazy val hoconOpt: Option[ConfParsed] = configStr.map(ConfParsed.fromString(_)).orElse { 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 2c20accf2b..233363395d 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/Scalafmt.scala @@ -10,7 +10,6 @@ import scala.util.Failure import scala.util.Success import scala.util.Try -import org.scalafmt.config.Config import org.scalafmt.Error.PreciseIncomplete import org.scalafmt.config.FormatEvent.CreateFormatOps import org.scalafmt.config.LineEndings @@ -191,11 +190,14 @@ object Scalafmt { // used by ScalafmtReflect.parseConfig def parseHoconConfigFile(configPath: Path): Configured[ScalafmtConfig] = - Config.fromHoconFile(configPath, ScalafmtConfig.uncheckedDefault) + ScalafmtConfig.fromHoconFile(configPath, ScalafmtConfig.uncheckedDefault) // used by ScalafmtReflect.parseConfig def parseHoconConfig(configString: String): Configured[ScalafmtConfig] = - Config.fromHoconString(configString, ScalafmtConfig.uncheckedDefault) + ScalafmtConfig.fromHoconString( + configString, + ScalafmtConfig.uncheckedDefault + ) /** Utility method to change dialect on ScalafmtConfig. * 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 deleted file mode 100644 index 939a652234..0000000000 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Config.scala +++ /dev/null @@ -1,48 +0,0 @@ -package org.scalafmt.config - -import java.nio.file.Path - -import metaconfig._ -import org.scalafmt.Versions - -// NOTE: these methods are intended for internal usage and are subject to -// binary and source breaking changes between any release. For a stable API -// use org.scalafmt.Scalafmt. Documentation on using scalafmt as a library -// can be seen here https://scalameta.org/scalafmt/#Standalonelibrary -object Config { - - def fromHoconString( - string: String, - default: ScalafmtConfig = ScalafmtConfig.default, - path: Option[String] = None - ): Configured[ScalafmtConfig] = - fromConf(ConfParsed.fromString(string, path), default = default) - - /** Read ScalafmtConfig from String contents from an optional HOCON path. */ - def fromHoconFile( - file: Path, - default: ScalafmtConfig = ScalafmtConfig.default, - path: Option[String] = None - ): Configured[ScalafmtConfig] = - fromConf(ConfParsed.fromPath(file, path), default = default) - - def fromConf( - parsed: ConfParsed, - default: ScalafmtConfig - ): Configured[ScalafmtConfig] = { - ScalafmtConfig.decoder.read(Option(default), parsed.conf) match { - case Configured.Ok(x) - if default.version == null && - x.version != Versions.stable && x.version != Versions.version => - val version = Option(x.version).getOrElse("missing") - val expected = s"${Versions.stable} or ${Versions.version}" - Configured.error(s"version [expected $expected]: $version") - case Configured.Ok(x) - if default.eq(ScalafmtConfig.uncheckedDefault) && - x.runner.isDefaultDialect => - Configured.error(NamedDialect.getUnknownError) - case x => x - } - } - -} 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 79e60c8e70..10cd30e873 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 @@ -1,6 +1,7 @@ package org.scalafmt.config -import java.nio.file +import java.nio.file.FileSystems +import java.nio.file.Path import scala.collection.mutable import scala.io.Codec @@ -18,6 +19,7 @@ import org.scalafmt.sysops.FileOps import org.scalafmt.sysops.OsSpecific._ import org.scalafmt.util.LoggerOps import org.scalafmt.util.ValidationOps +import org.scalafmt.Versions /** Configuration options for scalafmt. * @@ -198,7 +200,7 @@ case class ScalafmtConfig( eitherPat -> cfg } val langResult = patStyles.collect { case (Left(lang), cfg) => lang -> cfg } - val fs = file.FileSystems.getDefault + val fs = FileSystems.getDefault val pmResult = patStyles.collect { case (Right(pat), cfg) => val pattern = if (pat(0) == '.') "glob:**" + pat else pat.asFilename fs.getPathMatcher(pattern) -> cfg @@ -492,4 +494,38 @@ object ScalafmtConfig { .andThen(validate) } + def fromHoconString( + string: String, + default: ScalafmtConfig = ScalafmtConfig.default, + path: Option[String] = None + ): Configured[ScalafmtConfig] = + fromConf(ConfParsed.fromString(string, path), default = default) + + /** Read ScalafmtConfig from String contents from an optional HOCON path. */ + def fromHoconFile( + file: Path, + default: ScalafmtConfig = ScalafmtConfig.default, + path: Option[String] = None + ): Configured[ScalafmtConfig] = + fromConf(ConfParsed.fromPath(file, path), default = default) + + def fromConf( + parsed: ConfParsed, + default: ScalafmtConfig + ): Configured[ScalafmtConfig] = { + ScalafmtConfig.decoder.read(Option(default), parsed.conf) match { + case Configured.Ok(x) + if default.version == null && + x.version != Versions.stable && x.version != Versions.version => + val version = Option(x.version).getOrElse("missing") + val expected = s"${Versions.stable} or ${Versions.version}" + Configured.error(s"version [expected $expected]: $version") + case Configured.Ok(x) + if default.eq(ScalafmtConfig.uncheckedDefault) && + x.runner.isDefaultDialect => + Configured.error(NamedDialect.getUnknownError) + case x => x + } + } + } diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/StyleMap.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/StyleMap.scala index 33f61e845f..c21f0faf27 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/util/StyleMap.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/util/StyleMap.scala @@ -9,7 +9,6 @@ import scala.meta.tokens.Token.LeftParen import scala.meta.tokens.Token.RightParen import org.scalafmt.config.BinPack -import org.scalafmt.config.Config import org.scalafmt.config.FilterMatcher import org.scalafmt.config.ScalafmtConfig import org.scalafmt.internal.FormatToken @@ -50,7 +49,8 @@ class StyleMap( } tok.left match { case Comment(c) if prefix.findFirstIn(c).isDefined => - val configured = Config.fromHoconString(c, init, Some("scalafmt")) + val configured = + ScalafmtConfig.fromHoconString(c, init, Some("scalafmt")) // TODO(olafur) report error via callback configured.foreach(logger.elem(_)) { style => init.rewrite.rulesChanged(style.rewrite).foreach { x => diff --git a/scalafmt-docs/src/main/scala/docs/ScalafmtModifier.scala b/scalafmt-docs/src/main/scala/docs/ScalafmtModifier.scala index b2f65538d2..0fe1416452 100644 --- a/scalafmt-docs/src/main/scala/docs/ScalafmtModifier.scala +++ b/scalafmt-docs/src/main/scala/docs/ScalafmtModifier.scala @@ -1,7 +1,6 @@ package docs import org.scalafmt.Scalafmt -import org.scalafmt.config.Config import org.scalafmt.config.NamedDialect import org.scalafmt.config.ScalafmtConfig import scala.meta.inputs.Input @@ -32,7 +31,7 @@ class ScalafmtModifier extends StringModifier { } else { val config = Input.Slice(code, 0, i) val program = Input.Slice(code, i + separator.length, code.chars.length) - val configured = Config.fromHoconString(config.text, base) + val configured = ScalafmtConfig.fromHoconString(config.text, base) configured.fold { e => reporter.error(pos, e.toString()) "fail" diff --git a/scalafmt-docs/src/main/scala/website/package.scala b/scalafmt-docs/src/main/scala/website/package.scala index 27e2740f55..d3b486a1ba 100644 --- a/scalafmt-docs/src/main/scala/website/package.scala +++ b/scalafmt-docs/src/main/scala/website/package.scala @@ -5,7 +5,6 @@ import java.nio.file.StandardOpenOption import org.scalafmt.Scalafmt import org.scalafmt.config.ScalafmtRunner import org.scalafmt.config.ScalafmtConfig -import org.scalafmt.config.Config package object website { def replaceMargin(s: String): String = { @@ -70,7 +69,10 @@ package object website { ): Unit = { val processedCode = preProcess(code) val parsedConfig1 = - Config.fromHoconString(config.mkString("\n")).get.copy(runner = runner) + ScalafmtConfig + .fromHoconString(config.mkString("\n")) + .get + .copy(runner = runner) val isCustomMaxColumn = config.exists(_.contains("maxColumn")) val parsedConfig = if (isCustomMaxColumn) parsedConfig1 @@ -103,7 +105,7 @@ package object website { * the config to format the code (defaults to `default40`) */ def formatExample(code: String, config: String*): Unit = { - val parsedConfig = Config + val parsedConfig = ScalafmtConfig .fromHoconString(config.mkString("\n")) .get .copy(maxColumn = 40, runner = ScalafmtRunner.sbt) diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala b/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala index 9de293cd94..a73ace74ea 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala +++ b/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliOptionsTest.scala @@ -2,7 +2,7 @@ package org.scalafmt.cli import java.nio.file.{Files, NoSuchFileException, Path, Paths} -import org.scalafmt.config.{Config, ScalafmtConfig} +import org.scalafmt.config.ScalafmtConfig import FileTestOps._ import org.scalafmt.Versions @@ -12,9 +12,8 @@ import munit.FunSuite class CliOptionsTest extends FunSuite { test("preset = ...") { - import org.scalafmt.config.Config assertEquals( - Config.fromHoconString("preset = foobar"), + ScalafmtConfig.fromHoconString("preset = foobar"), Configured.error( "Unknown style \"foobar\". Expected one of: " + "Scala.js, IntelliJ, default, defaultWithAlign" @@ -22,21 +21,21 @@ class CliOptionsTest extends FunSuite { ) assertEquals( - Config.fromHoconString("""|preset = defaultWithAlign + ScalafmtConfig.fromHoconString("""|preset = defaultWithAlign |maxColumn = 100 |""".stripMargin), Configured.ok(ScalafmtConfig.defaultWithAlign.copy(maxColumn = 100)) ) assertEquals( - Config.fromHoconString("preset = intellij"), + ScalafmtConfig.fromHoconString("preset = intellij"), Configured.ok(ScalafmtConfig.intellij) ) assertEquals( - Config.fromHoconString("preset = Scala.js"), + ScalafmtConfig.fromHoconString("preset = Scala.js"), Configured.ok(ScalafmtConfig.scalaJs) ) assertEquals( - Config.fromHoconString("preset = defaultWithAlign"), + ScalafmtConfig.fromHoconString("preset = defaultWithAlign"), Configured.ok(ScalafmtConfig.defaultWithAlign) ) } @@ -52,7 +51,7 @@ class CliOptionsTest extends FunSuite { ) ) .configPath - val config = Config.fromHoconFile(path).get + val config = ScalafmtConfig.fromHoconFile(path).get assertEquals(config.onTestFailure, expected) } diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala b/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala index 3d39f086f1..44d4e33f20 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala +++ b/scalafmt-tests/src/test/scala/org/scalafmt/cli/CliTest.scala @@ -14,7 +14,7 @@ import munit.FunSuite import org.scalafmt.Error.NoMatchingFiles import org.scalafmt.Versions.{stable => stableVersion} import org.scalafmt.cli.FileTestOps._ -import org.scalafmt.config.{Config, ProjectFiles, ScalafmtConfig} +import org.scalafmt.config.{ProjectFiles, ScalafmtConfig} import org.scalafmt.sysops.{AbsoluteFile, FileOps} import org.scalafmt.sysops.OsSpecific._ @@ -80,7 +80,7 @@ abstract class AbstractCliTest extends FunSuite { |""".stripMargin def gimmeConfig(string: String): ScalafmtConfig = - Config.fromHoconString(string).get + ScalafmtConfig.fromHoconString(string).get def noArgTest( input: AbsoluteFile, diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/config/ScalafmtConfigTest.scala b/scalafmt-tests/src/test/scala/org/scalafmt/config/ScalafmtConfigTest.scala index fb140a2746..befb90efc5 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/config/ScalafmtConfigTest.scala +++ b/scalafmt-tests/src/test/scala/org/scalafmt/config/ScalafmtConfigTest.scala @@ -5,7 +5,7 @@ import munit.FunSuite class ScalafmtConfigTest extends FunSuite { test("project.matcher") { - val config = Config + val config = ScalafmtConfig .fromHoconString( """ |project.excludeFilters = [ @@ -21,7 +21,7 @@ class ScalafmtConfigTest extends FunSuite { } test("file overrides") { - val config = Config + val config = ScalafmtConfig .fromHoconString( """ |newlines.source = fold @@ -47,7 +47,7 @@ class ScalafmtConfigTest extends FunSuite { } test("align preset no override") { - val config = Config + val config = ScalafmtConfig .fromHoconString(""" |align = none |align.stripMargin = true @@ -58,7 +58,7 @@ class ScalafmtConfigTest extends FunSuite { } test("align preset with override") { - val config = Config + val config = ScalafmtConfig .fromHoconString(""" |align.preset = none |align.stripMargin = true @@ -68,13 +68,13 @@ class ScalafmtConfigTest extends FunSuite { } test("dialect override") { - val config1 = Config + val config1 = ScalafmtConfig .fromHoconString(""" |runner.dialect = scala213 |""".stripMargin) .get assert(!config1.runner.getDialect.allowToplevelTerms) - val config2 = Config + val config2 = ScalafmtConfig .fromHoconString(""" |runner.dialectOverride.allowToplevelTerms = true |runner.dialect = scala213 @@ -84,7 +84,7 @@ class ScalafmtConfigTest extends FunSuite { } test("hasRewriteRules-and-withoutRewriteRules trailingCommas") { - val config1 = Config + val config1 = ScalafmtConfig .fromHoconString(""" |runner.dialect = scala213 |rewrite.trailingCommas = never @@ -96,7 +96,7 @@ class ScalafmtConfigTest extends FunSuite { } test("hasRewriteRules-and-withoutRewriteRules docstrings") { - val config1 = Config + val config1 = ScalafmtConfig .fromHoconString(""" |runner.dialect = scala213 |rewrite.trailingCommas = keep diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala b/scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala index 43239fea89..45711151b1 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala +++ b/scalafmt-tests/src/test/scala/org/scalafmt/util/HasTests.scala @@ -9,7 +9,6 @@ import munit.Assertions._ import org.scalafmt.{Debug, Scalafmt} import org.scalafmt.config.FormatEvent._ import org.scalafmt.config.{ - Config, DanglingParentheses, Indents, NamedDialect, @@ -93,7 +92,7 @@ trait HasTests extends FormatAssertions { val moduleSkip = isSkip(head) def loadStyle(cfg: String, base: ScalafmtConfig): ScalafmtConfig = - Config.fromHoconString(cfg, base).getOrRecover { c => + ScalafmtConfig.fromHoconString(cfg, base).getOrRecover { c => throw new IllegalArgumentException( s"""Failed to parse filename $filename: |$cfg