From 4e6a43a9477c7d0ece99eeba290835bfe1856f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Mon, 19 Dec 2016 16:04:53 +0000 Subject: [PATCH] Add runner.optimizer.forceConfig... flag. Towards #140. --- .../scalafmt/config/ScalafmtOptimizer.scala | 11 +- .../scalafmt/internal/BestFirstSearch.scala | 2 + .../org/scalafmt/internal/FormatOps.scala | 63 ++- .../scala/org/scalafmt/internal/Router.scala | 2 +- .../test/resources/default/SearchState.stat | 455 ++++++++++++++++++ .../scala/org/scalafmt/BestEffortTest.scala | 191 -------- .../org/scalafmt/util/FormatAssertions.scala | 2 +- 7 files changed, 516 insertions(+), 210 deletions(-) create mode 100644 core/src/test/resources/default/SearchState.stat diff --git a/core/src/main/scala/org/scalafmt/config/ScalafmtOptimizer.scala b/core/src/main/scala/org/scalafmt/config/ScalafmtOptimizer.scala index 8d43f431a7..101e1d8f3f 100644 --- a/core/src/main/scala/org/scalafmt/config/ScalafmtOptimizer.scala +++ b/core/src/main/scala/org/scalafmt/config/ScalafmtOptimizer.scala @@ -52,6 +52,13 @@ import metaconfig.ConfigReader * * By starting a new search queue, we can perform * aggressive optimizations inside optimizations zones. + * @param forceConfigStyleOnOffset + * If negative number, does nothing. If n >= 0, then scalafmt will force + * "config style" on Term.Apply nodes IF it has more than [[forceConfigStyleOnArgCount]] + * arguments AND the non-whitespace byte offset between the opening + * parens and closing parens is greater than [[forceConfigStyleOnOffset]]. + * By forcing config style on such applications, the search space is greatly + * reduced. */ @ConfigReader case class ScalafmtOptimizer( @@ -63,7 +70,9 @@ case class ScalafmtOptimizer( acceptOptimalAtHints: Boolean = true, disableOptimizationsInsideSensitiveAreas: Boolean = true, pruneSlowStates: Boolean = true, - recurseOnBlocks: Boolean = true + recurseOnBlocks: Boolean = true, + forceConfigStyleOnOffset: Int = 500, + forceConfigStyleOnArgCount: Int = 5 ) object ScalafmtOptimizer { diff --git a/core/src/main/scala/org/scalafmt/internal/BestFirstSearch.scala b/core/src/main/scala/org/scalafmt/internal/BestFirstSearch.scala index 4c258ccd74..0c58467cd9 100644 --- a/core/src/main/scala/org/scalafmt/internal/BestFirstSearch.scala +++ b/core/src/main/scala/org/scalafmt/internal/BestFirstSearch.scala @@ -188,6 +188,8 @@ class BestFirstSearch(val formatOps: FormatOps, if (!isInsideNoOptZone(splitToken) && lastDequeue.policy.isSafe) { lastDequeue = curr } + } else if (emptyQueueSpots(hash(splitToken.left))) { + Q.dequeueAll } if (shouldRecurseOnBlock(curr, stop)) { diff --git a/core/src/main/scala/org/scalafmt/internal/FormatOps.scala b/core/src/main/scala/org/scalafmt/internal/FormatOps.scala index 9a97ee2f49..ad2dc2e45a 100644 --- a/core/src/main/scala/org/scalafmt/internal/FormatOps.scala +++ b/core/src/main/scala/org/scalafmt/internal/FormatOps.scala @@ -10,6 +10,7 @@ import scala.meta.Pat import scala.meta.Pkg import scala.meta.Template import scala.meta.Term +import scala.meta.Term.Apply import scala.meta.Tree import scala.meta.Type import scala.meta.dialects.Scala211 @@ -19,7 +20,6 @@ import scala.meta.tokens.Token._ import scala.meta.tokens.Tokens import org.scalafmt.Error.CaseMissingArrow -import org.scalafmt.config.ScalafmtRunner import org.scalafmt.config.ScalafmtConfig import org.scalafmt.internal.ExpiresOn.Left import org.scalafmt.internal.Length.Num @@ -45,6 +45,24 @@ class FormatOps(val tree: Tree, val initStyle: ScalafmtConfig) { val matchingParentheses = getMatchingParentheses(tree.tokens) val styleMap = new StyleMap(tokens, initStyle) private val vAlignDepthCache = mutable.Map.empty[Tree, Int] + // Maps token to number of non-whitespace bytes before the token's position. + private final val nonWhitespaceOffset: Map[Token, Int] = { + val resultB = Map.newBuilder[Token, Int] + var curr = 0 + tree.tokens.foreach { + case t => + resultB += (t -> curr) + if (!t.is[Whitespace]) { + curr += (t.end - t.start) + } + + } + resultB.result() + } + + val (forceConfigStyle, emptyQueueSpots) = getForceConfigStyle + + @inline def matching(token: Token): Token = matchingParentheses(hash(token)) @inline def owners(token: Token): Tree = ownersMap(hash(token)) @@ -82,6 +100,11 @@ class FormatOps(val tree: Tree, val initStyle: ScalafmtConfig) { (packages.result(), imports.result(), b.toMap) } + object `:owner:` { + def unapply(tok: Token): Option[(Token, Tree)] = + ownersMap.get(hash(tok)).map(tree => tok -> tree) + } + lazy val leftTok2tok: Map[Token, FormatToken] = { val result = Map.newBuilder[Token, FormatToken] result.sizeHint(tokens.length) @@ -504,21 +527,6 @@ class FormatOps(val tree: Tree, val initStyle: ScalafmtConfig) { } } - // Maps token to number of non-whitespace bytes before the token's position. - private final val nonWhitespaceOffset: Map[Token, Int] = { - val resultB = Map.newBuilder[Token, Int] - var curr = 0 - tree.tokens.foreach { - case t => - resultB += (t -> curr) - if (!t.is[Whitespace]) { - curr += (t.end - t.start) - } - - } - resultB.result() - } - def distance(left: Token, right: Token): Int = { nonWhitespaceOffset(right) - nonWhitespaceOffset(left) } @@ -570,4 +578,27 @@ class FormatOps(val tree: Tree, val initStyle: ScalafmtConfig) { case None => count } } + + def getForceConfigStyle: (Set[Tree], Set[TokenHash]) = { + val maxDistance = runner.optimizer.forceConfigStyleOnOffset + if (maxDistance < 0 || + initStyle.bestEffortInDeeplyNestedCode) // breaks test + (Set.empty, Set.empty) + else { + val clearQueues = Set.newBuilder[TokenHash] + val forces = Set.newBuilder[Tree] + tree.tokens.foreach { + case left @ LeftParen() `:owner:` (app: Term.Apply) + if app.args.length > runner.optimizer.forceConfigStyleOnArgCount && + distance(left, matching(left)) > maxDistance => + forces += app + app.args.foreach { arg => + clearQueues += hash(arg.tokens.head) + } + case _ => + } + (forces.result(), clearQueues.result()) + } + } + } diff --git a/core/src/main/scala/org/scalafmt/internal/Router.scala b/core/src/main/scala/org/scalafmt/internal/Router.scala index 7d2fdddcb5..46ef573147 100644 --- a/core/src/main/scala/org/scalafmt/internal/Router.scala +++ b/core/src/main/scala/org/scalafmt/internal/Router.scala @@ -396,7 +396,7 @@ class Router(formatOps: FormatOps) { case FormatToken(LeftParen() | LeftBracket(), right, between) if style.configStyleArguments && (isDefnSite(leftOwner) || isCallSite(leftOwner)) && - opensConfigStyle(formatToken) => + (opensConfigStyle(formatToken) || forceConfigStyle(leftOwner)) => val open = formatToken.left val indent = getApplyIndent(leftOwner, isConfigStyle = true) val close = matchingParentheses(hash(open)) diff --git a/core/src/test/resources/default/SearchState.stat b/core/src/test/resources/default/SearchState.stat new file mode 100644 index 0000000000..74650f9715 --- /dev/null +++ b/core/src/test/resources/default/SearchState.stat @@ -0,0 +1,455 @@ +80 columns | +<<< spark +{ + { + val options = List[OptionAssigner]( // All cluster managers + OptionAssigner(args.master, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.master"), + OptionAssigner(args.deployMode, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.submit.deployMode"), + OptionAssigner(args.name, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.app.name"), + OptionAssigner(args.jars, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.jars"), + OptionAssigner(args.ivyRepoPath, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.jars.ivy"), + OptionAssigner(args.driverMemory, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.driver.memory"), + OptionAssigner(args.driverExtraClassPath, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraClassPath"), + OptionAssigner(args.driverExtraJavaOptions, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraJavaOptions"), + OptionAssigner(args.driverExtraLibraryPath, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraLibraryPath"), + // Yarn client only + OptionAssigner(args.queue, YARN, CLIENT, sysProp = "spark.yarn.queue"), + OptionAssigner(args.numExecutors, + YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.instances"), + OptionAssigner(args.files, + YARN, + CLIENT, + sysProp = "spark.yarn.dist.files"), + OptionAssigner(args.archives, + YARN, + CLIENT, + sysProp = "spark.yarn.dist.archives"), + OptionAssigner(args.principal, + YARN, + CLIENT, + sysProp = "spark.yarn.principal"), + OptionAssigner(args.keytab, + YARN, + CLIENT, + sysProp = "spark.yarn.keytab"), + // Yarn cluster only + OptionAssigner(args.name, YARN, CLUSTER, clOption = "--name"), + OptionAssigner(args.driverMemory, + YARN, + CLUSTER, + clOption = "--driver-memory"), + OptionAssigner(args.driverCores, + YARN, + CLUSTER, + clOption = "--driver-cores"), + OptionAssigner(args.queue, YARN, CLUSTER, clOption = "--queue"), + OptionAssigner(args.executorMemory, + YARN, + CLUSTER, + clOption = "--executor-memory"), + OptionAssigner(args.executorCores, + YARN, + CLUSTER, + clOption = "--executor-cores"), + OptionAssigner(args.files, YARN, CLUSTER, clOption = "--files"), + OptionAssigner(args.archives, YARN, CLUSTER, clOption = "--archives"), + OptionAssigner(args.jars, YARN, CLUSTER, clOption = "--addJars"), + OptionAssigner(args.principal, + YARN, + CLUSTER, + clOption = "--principal"), + OptionAssigner(args.keytab, YARN, CLUSTER, clOption = "--keytab"), + // Other options + OptionAssigner(args.executorCores, + STANDALONE | YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.cores"), + OptionAssigner(args.executorMemory, + STANDALONE | MESOS | YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.memory"), + OptionAssigner(args.totalExecutorCores, + STANDALONE | MESOS, + ALL_DEPLOY_MODES, + sysProp = "spark.cores.max"), + OptionAssigner(args.files, + LOCAL | STANDALONE | MESOS, + ALL_DEPLOY_MODES, + sysProp = "spark.files"), + OptionAssigner(args.jars, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.jars"), + OptionAssigner(args.driverMemory, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.memory"), + OptionAssigner(args.driverCores, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.cores"), + OptionAssigner(args.supervise.toString, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.supervise"), + OptionAssigner(args.ivyRepoPath, + STANDALONE, + CLUSTER, + sysProp = "spark.jars.ivy") + ) } } +>>> +{ + { + val options = List[OptionAssigner]( // All cluster managers + OptionAssigner(args.master, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.master"), + OptionAssigner(args.deployMode, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.submit.deployMode"), + OptionAssigner(args.name, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.app.name"), + OptionAssigner(args.jars, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.jars"), + OptionAssigner(args.ivyRepoPath, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.jars.ivy"), + OptionAssigner(args.driverMemory, + ALL_CLUSTER_MGRS, + CLIENT, + sysProp = "spark.driver.memory"), + OptionAssigner(args.driverExtraClassPath, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraClassPath"), + OptionAssigner(args.driverExtraJavaOptions, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraJavaOptions"), + OptionAssigner(args.driverExtraLibraryPath, + ALL_CLUSTER_MGRS, + ALL_DEPLOY_MODES, + sysProp = "spark.driver.extraLibraryPath"), + // Yarn client only + OptionAssigner(args.queue, YARN, CLIENT, sysProp = "spark.yarn.queue"), + OptionAssigner(args.numExecutors, + YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.instances"), + OptionAssigner(args.files, + YARN, + CLIENT, + sysProp = "spark.yarn.dist.files"), + OptionAssigner(args.archives, + YARN, + CLIENT, + sysProp = "spark.yarn.dist.archives"), + OptionAssigner(args.principal, + YARN, + CLIENT, + sysProp = "spark.yarn.principal"), + OptionAssigner(args.keytab, + YARN, + CLIENT, + sysProp = "spark.yarn.keytab"), + // Yarn cluster only + OptionAssigner(args.name, YARN, CLUSTER, clOption = "--name"), + OptionAssigner(args.driverMemory, + YARN, + CLUSTER, + clOption = "--driver-memory"), + OptionAssigner(args.driverCores, + YARN, + CLUSTER, + clOption = "--driver-cores"), + OptionAssigner(args.queue, YARN, CLUSTER, clOption = "--queue"), + OptionAssigner(args.executorMemory, + YARN, + CLUSTER, + clOption = "--executor-memory"), + OptionAssigner(args.executorCores, + YARN, + CLUSTER, + clOption = "--executor-cores"), + OptionAssigner(args.files, YARN, CLUSTER, clOption = "--files"), + OptionAssigner(args.archives, YARN, CLUSTER, clOption = "--archives"), + OptionAssigner(args.jars, YARN, CLUSTER, clOption = "--addJars"), + OptionAssigner(args.principal, + YARN, + CLUSTER, + clOption = "--principal"), + OptionAssigner(args.keytab, YARN, CLUSTER, clOption = "--keytab"), + // Other options + OptionAssigner(args.executorCores, + STANDALONE | YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.cores"), + OptionAssigner(args.executorMemory, + STANDALONE | MESOS | YARN, + ALL_DEPLOY_MODES, + sysProp = "spark.executor.memory"), + OptionAssigner(args.totalExecutorCores, + STANDALONE | MESOS, + ALL_DEPLOY_MODES, + sysProp = "spark.cores.max"), + OptionAssigner(args.files, + LOCAL | STANDALONE | MESOS, + ALL_DEPLOY_MODES, + sysProp = "spark.files"), + OptionAssigner(args.jars, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.jars"), + OptionAssigner(args.driverMemory, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.memory"), + OptionAssigner(args.driverCores, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.cores"), + OptionAssigner(args.supervise.toString, + STANDALONE | MESOS, + CLUSTER, + sysProp = "spark.driver.supervise"), + OptionAssigner(args.ivyRepoPath, + STANDALONE, + CLUSTER, + sysProp = "spark.jars.ivy") + ) + } +} +<<< mailgun api client + + EventsResponse.fromJson(json, run).success.value.events should be(Seq( + Stored( + timestamp = Instant.parse("2016-12-02T16:23:47.412278Z"), + id = "OKO0c_F1RiWU44-qLwYYuA", + storage = Storage( + "https://se.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=", + "eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T16:23:46.637Z","customerId":"canary","traceToken":"22629a34-e5ef-4d2a-bbd4-5193af11e90d","canary":true}""" + ), + flags = Map( + "is-test-mode" -> false + ), + tags = Nil, + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202162347.92318.58763.6224A6CC@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (22629a34-e5ef-4d2a-bbd4-5193af11e90d)" + ), + Nil, + Seq("canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org"), + 20430 + ) + ), + Accepted( + timestamp = Instant.parse("2016-12-02T16:23:47.124505Z"), + id = "N97VBM3jRIGdpHExzz47mg", + tags = Nil, + envelope = Map( + "sender" -> "postmaster@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "transport" -> "smtp", + "targets" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T16:23:46.637Z","customerId":"canary","traceToken":"22629a34-e5ef-4d2a-bbd4-5193af11e90d","canary":true}""" + ), + storage = Some(Storage( + "https://se.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=", + "eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=" + )), + recipient = "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + `recipient-domain` = "sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + method = "http", + flags = Map( + "is-routed" -> false, + "is-authenticated" -> true, + "is-system-test" -> false, + "is-test-mode" -> false + ), + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202162347.92318.58763.6224A6CC@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (22629a34-e5ef-4d2a-bbd4-5193af11e90d)" + ), + Nil, + Seq("canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org"), + 20430 + ) + ), + Stored( + timestamp = Instant.parse("2016-12-02T15:53:47.045888Z"), + id = "-KayH5ZASKm2AaQQ1wizDw", + storage = Storage( + "https://si.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6IjViNjhkN2QwLWEwZTYtNDU4Yy1hOGJiLTk2ZTY0MWI3MTNhNSIsInMiOiI1ZDY4YWE5M2FmIiwiYyI6InNiaWFkIn0=", + "eyJwIjpmYWxzZSwiayI6IjViNjhkN2QwLWEwZTYtNDU4Yy1hOGJiLTk2ZTY0MWI3MTNhNSIsInMiOiI1ZDY4YWE5M2FmIiwiYyI6InNiaWFkIn0=" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T15:53:45.732Z","customerId":"canary","traceToken":"769b0d0e-0f89-48b6-8a07-5a459bbdc2ab","canary":true}""" + ), + flags = Map( + "is-test-mode" -> false + ), + tags = Nil, + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202155346.30852.16325.1915382A@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (769b0d0e-0f89-48b6-8a07-5a459bbdc2ab)" + ), + Nil, + Seq( + "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org" + ), + 20430 + ) + ) + )) +>>> +EventsResponse.fromJson(json, run).success.value.events should be( + Seq( + Stored( + timestamp = Instant.parse("2016-12-02T16:23:47.412278Z"), + id = "OKO0c_F1RiWU44-qLwYYuA", + storage = Storage( + "https://se.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=", + "eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T16:23:46.637Z","customerId":"canary","traceToken":"22629a34-e5ef-4d2a-bbd4-5193af11e90d","canary":true}""" + ), + flags = Map( + "is-test-mode" -> false + ), + tags = Nil, + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202162347.92318.58763.6224A6CC@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (22629a34-e5ef-4d2a-bbd4-5193af11e90d)" + ), + Nil, + Seq("canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org"), + 20430 + ) + ), + Accepted( + timestamp = Instant.parse("2016-12-02T16:23:47.124505Z"), + id = "N97VBM3jRIGdpHExzz47mg", + tags = Nil, + envelope = Map( + "sender" -> "postmaster@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "transport" -> "smtp", + "targets" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T16:23:46.637Z","customerId":"canary","traceToken":"22629a34-e5ef-4d2a-bbd4-5193af11e90d","canary":true}""" + ), + storage = Some(Storage( + "https://se.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=", + "eyJwIjpmYWxzZSwiayI6ImUzZWQ3YjYyLTI4YmMtNDZiYy04MGQ3LTg0NTUyZDc4YzU4MSIsInMiOiJlZDY3MzYyNWRhIiwiYyI6InRhbmtiIn0=" + )), + recipient = + "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + `recipient-domain` = + "sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + method = "http", + flags = Map( + "is-routed" -> false, + "is-authenticated" -> true, + "is-system-test" -> false, + "is-test-mode" -> false + ), + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202162347.92318.58763.6224A6CC@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (22629a34-e5ef-4d2a-bbd4-5193af11e90d)" + ), + Nil, + Seq("canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org"), + 20430 + ) + ), + Stored( + timestamp = Instant.parse("2016-12-02T15:53:47.045888Z"), + id = "-KayH5ZASKm2AaQQ1wizDw", + storage = Storage( + "https://si.api.mailgun.net/v3/domains/sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org/messages/eyJwIjpmYWxzZSwiayI6IjViNjhkN2QwLWEwZTYtNDU4Yy1hOGJiLTk2ZTY0MWI3MTNhNSIsInMiOiI1ZDY4YWE5M2FmIiwiYyI6InNiaWFkIn0=", + "eyJwIjpmYWxzZSwiayI6IjViNjhkN2QwLWEwZTYtNDU4Yy1hOGJiLTk2ZTY0MWI3MTNhNSIsInMiOiI1ZDY4YWE5M2FmIiwiYyI6InNiaWFkIn0=" + ), + `user-variables` = Map( + "custom" -> """{"createdAt":"2016-12-02T15:53:45.732Z","customerId":"canary","traceToken":"769b0d0e-0f89-48b6-8a07-5a459bbdc2ab","canary":true}""" + ), + flags = Map( + "is-test-mode" -> false + ), + tags = Nil, + `log-level` = "info", + message = MessageSummary( + Map( + "to" -> "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "message-id" -> "20161202155346.30852.16325.1915382A@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org", + "from" -> "Ovo Energy ", + "subject" -> "Canary test email (769b0d0e-0f89-48b6-8a07-5a459bbdc2ab)" + ), + Nil, + Seq( + "canary@sandbox98d59d0a8d0a4af588f2bb683a4a57cc.mailgun.org" + ), + 20430 + ) + ) + )) diff --git a/core/src/test/scala/org/scalafmt/BestEffortTest.scala b/core/src/test/scala/org/scalafmt/BestEffortTest.scala index fdd7ef8ed2..d3bb86b018 100644 --- a/core/src/test/scala/org/scalafmt/BestEffortTest.scala +++ b/core/src/test/scala/org/scalafmt/BestEffortTest.scala @@ -68,197 +68,6 @@ Defn.Object( Some( Type.Apply(Type.Name("Array"), Seq(Type.Name("FormatToken")))), None), Term.Param(Nil, Term.Name("splits"), Some(Type.Apply(Type.Name("Vector"), Seq(Type.Name("Split")))), None), Term.Param(Nil, Term.Name("style"), Some(Type.Name("ScalaStyle")), None), Term.Param(Nil, Term.Name("debug"), Some(Type.Name("Boolean")), Some(Lit(false))))), Some(Type.Apply(Type.Name("Seq"), Seq(Type.Tuple(Seq(Type.Name("FormatToken"), Type.Name("String")))))), Term.Block(Seq(Defn.Var(Nil, Seq(Pat.Var.Term(Term.Name("state"))), None, Some(Term.Select(Term.Name("State"), Term.Name("start")))), Defn.Val(Nil, Seq(Pat.Var.Term(Term.Name("result"))), None, Term.Apply(Term.Select(Term.Apply(Term.Select(Term.Name("toks"), Term.Name("zip")), Seq(Term.Name("splits"))), Term.Name("map")), Seq(Term.PartialFunction(Seq(Case(Pat.Tuple(Seq(Pat.Var.Term(Term.Name("tok")), Pat.Var.Term(Term.Name("split")))), None, Term.Block(Seq(Term.If(Term.Name("debug"), Term.Block(Seq(Defn.Val(Nil, Seq(Pat.Var.Term(Term.Name("left"))), None, Term.Apply(Term.Name("small"), Seq(Term.Select(Term.Name("tok"), Term.Name("left"))))), Term.Apply(Term.Select(Term.Name("logger"), Term.Name("debug")), Seq(Term.Interpolate(Term.Name("f"), Seq(Lit(""), Lit("%-10s "), Lit("")), Seq(Term.Name("left"), Term.Name("split"))))))), Lit()), Term.Assign(Term.Name("state"), Term.Apply(Term.Select(Term.Name("state"), Term.Name("next")), Seq(Term.Name("style"), Term.Name("split"), Term.Name("tok")))), Defn.Val(Nil, Seq(Pat.Var.Term(Term.Name("whitespace"))), None, Term.Match(Term.Select(Term.Name("split"), Term.Name("modification")), Seq(Case(Term.Name("Space"), None, Lit(" ")), Case(Pat.Typed(Pat.Var.Term(Term.Name("nl")), Type.Name("NewlineT")), None, Term.Block(Seq(Defn.Val(Nil, Seq(Pat.Var.Term(Term.Name("newline"))), None, Term.If(Term.Select(Term.Name("nl"), Term.Name("isDouble")), Lit("\n\n"), Lit("\n"))), Defn.Val(Nil, Seq(Pat.Var.Term(Term.Name("indentation"))), None, Term.If(Term.Select(Term.Name("nl"), Term.Name("noIndent")), Lit(""), Term.ApplyInfix(Lit(" "), Term.Name("*"), Nil, Seq(Term.Select(Term.Name("state"), Term.Name("indentation")))))), Term.ApplyInfix(Term.Name("newline"), Term.Name("+"), Nil, Seq(Term.Name("indentation")))))), Case(Pat.Extract(Term.Name("Provided"), Nil, Seq(Pat.Var.Term(Term.Name("literal")))), None, Term.Name("literal")), Case(Term.Name("NoSplit"), None, Lit(""))))), Term.ApplyInfix(Term.Name("tok"), Term.Name("->"), Nil, Seq(Term.Name("whitespace"))))))))))), Term.If(Term.Name("debug"), Term.Apply(Term.Select(Term.Name("logger"), Term.Name("debug")), Seq(Term.Interpolate(Term.Name("s"), Seq(Lit("Total cost: "), Lit("")), Seq(Term.Select(Term.Name("state"), Term.Name("cost")))))), Lit()), Term.Name("result")))))))) -<<< spark config style dequeue -{{ -val options = List[OptionAssigner]( - - // All cluster managers - OptionAssigner(args.master, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, sysProp = "spark.master"), - OptionAssigner(args.deployMode, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, - sysProp = "spark.submit.deployMode"), - OptionAssigner(args.name, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, sysProp = "spark.app.name"), - OptionAssigner(args.jars, ALL_CLUSTER_MGRS, CLIENT, sysProp = "spark.jars"), - OptionAssigner(args.ivyRepoPath, ALL_CLUSTER_MGRS, CLIENT, sysProp = "spark.jars.ivy"), - OptionAssigner(args.driverMemory, ALL_CLUSTER_MGRS, CLIENT, - sysProp = "spark.driver.memory"), - OptionAssigner(args.driverExtraClassPath, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraClassPath"), - OptionAssigner(args.driverExtraJavaOptions, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraJavaOptions"), - OptionAssigner(args.driverExtraLibraryPath, ALL_CLUSTER_MGRS, ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraLibraryPath"), - - // Yarn client only - OptionAssigner(args.queue, YARN, CLIENT, sysProp = "spark.yarn.queue"), - OptionAssigner(args.numExecutors, YARN, ALL_DEPLOY_MODES, - sysProp = "spark.executor.instances"), - OptionAssigner(args.files, YARN, CLIENT, sysProp = "spark.yarn.dist.files"), - OptionAssigner(args.archives, YARN, CLIENT, sysProp = "spark.yarn.dist.archives"), - OptionAssigner(args.principal, YARN, CLIENT, sysProp = "spark.yarn.principal"), - OptionAssigner(args.keytab, YARN, CLIENT, sysProp = "spark.yarn.keytab"), - - // Yarn cluster only - OptionAssigner(args.name, YARN, CLUSTER, clOption = "--name"), - OptionAssigner(args.driverMemory, YARN, CLUSTER, clOption = "--driver-memory"), - OptionAssigner(args.driverCores, YARN, CLUSTER, clOption = "--driver-cores"), - OptionAssigner(args.queue, YARN, CLUSTER, clOption = "--queue"), - OptionAssigner(args.executorMemory, YARN, CLUSTER, clOption = "--executor-memory"), - OptionAssigner(args.executorCores, YARN, CLUSTER, clOption = "--executor-cores"), - OptionAssigner(args.files, YARN, CLUSTER, clOption = "--files"), - OptionAssigner(args.archives, YARN, CLUSTER, clOption = "--archives"), - OptionAssigner(args.jars, YARN, CLUSTER, clOption = "--addJars"), - OptionAssigner(args.principal, YARN, CLUSTER, clOption = "--principal"), - OptionAssigner(args.keytab, YARN, CLUSTER, clOption = "--keytab"), - - // Other options - OptionAssigner(args.executorCores, STANDALONE | YARN, ALL_DEPLOY_MODES, - sysProp = "spark.executor.cores"), - OptionAssigner(args.executorMemory, STANDALONE | MESOS | YARN, ALL_DEPLOY_MODES, - sysProp = "spark.executor.memory"), - OptionAssigner(args.totalExecutorCores, STANDALONE | MESOS, ALL_DEPLOY_MODES, - sysProp = "spark.cores.max"), - OptionAssigner(args.files, LOCAL | STANDALONE | MESOS, ALL_DEPLOY_MODES, - sysProp = "spark.files"), - OptionAssigner(args.jars, STANDALONE | MESOS, CLUSTER, sysProp = "spark.jars"), - OptionAssigner(args.driverMemory, STANDALONE | MESOS, CLUSTER, - sysProp = "spark.driver.memory"), - OptionAssigner(args.driverCores, STANDALONE | MESOS, CLUSTER, - sysProp = "spark.driver.cores"), - OptionAssigner(args.supervise.toString, STANDALONE | MESOS, CLUSTER, - sysProp = "spark.driver.supervise"), - OptionAssigner(args.ivyRepoPath, STANDALONE, CLUSTER, sysProp = "spark.jars.ivy") - ) -}} ->>> -{ - { - val options = List[OptionAssigner]( - // All cluster managers - OptionAssigner(args.master, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.master"), - OptionAssigner(args.deployMode, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.submit.deployMode"), - OptionAssigner(args.name, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.app.name"), - OptionAssigner(args.jars, - ALL_CLUSTER_MGRS, - CLIENT, - sysProp = "spark.jars"), - OptionAssigner(args.ivyRepoPath, - ALL_CLUSTER_MGRS, - CLIENT, - sysProp = "spark.jars.ivy"), - OptionAssigner(args.driverMemory, - ALL_CLUSTER_MGRS, - CLIENT, - sysProp = "spark.driver.memory"), - OptionAssigner(args.driverExtraClassPath, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraClassPath"), - OptionAssigner(args.driverExtraJavaOptions, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraJavaOptions"), - OptionAssigner(args.driverExtraLibraryPath, - ALL_CLUSTER_MGRS, - ALL_DEPLOY_MODES, - sysProp = "spark.driver.extraLibraryPath"), - // Yarn client only - OptionAssigner(args.queue, YARN, CLIENT, sysProp = "spark.yarn.queue"), - OptionAssigner(args.numExecutors, - YARN, - ALL_DEPLOY_MODES, - sysProp = "spark.executor.instances"), - OptionAssigner(args.files, - YARN, - CLIENT, - sysProp = "spark.yarn.dist.files"), - OptionAssigner(args.archives, - YARN, - CLIENT, - sysProp = "spark.yarn.dist.archives"), - OptionAssigner(args.principal, - YARN, - CLIENT, - sysProp = "spark.yarn.principal"), - OptionAssigner(args.keytab, - YARN, - CLIENT, - sysProp = "spark.yarn.keytab"), - // Yarn cluster only - OptionAssigner(args.name, YARN, CLUSTER, clOption = "--name"), - OptionAssigner(args.driverMemory, - YARN, - CLUSTER, - clOption = "--driver-memory"), - OptionAssigner(args.driverCores, - YARN, - CLUSTER, - clOption = "--driver-cores"), - OptionAssigner(args.queue, YARN, CLUSTER, clOption = "--queue"), - OptionAssigner(args.executorMemory, - YARN, - CLUSTER, - clOption = "--executor-memory"), - OptionAssigner(args.executorCores, - YARN, - CLUSTER, - clOption = "--executor-cores"), - OptionAssigner(args.files, YARN, CLUSTER, clOption = "--files"), - OptionAssigner(args.archives, YARN, CLUSTER, clOption = "--archives"), - OptionAssigner(args.jars, YARN, CLUSTER, clOption = "--addJars"), - OptionAssigner(args.principal, - YARN, - CLUSTER, - clOption = "--principal"), - OptionAssigner(args.keytab, YARN, CLUSTER, clOption = "--keytab"), - // Other options - OptionAssigner(args.executorCores, - STANDALONE | YARN, - ALL_DEPLOY_MODES, - sysProp = "spark.executor.cores"), - OptionAssigner(args.executorMemory, - STANDALONE | MESOS | YARN, - ALL_DEPLOY_MODES, - sysProp = "spark.executor.memory"), - OptionAssigner(args.totalExecutorCores, - STANDALONE | MESOS, - ALL_DEPLOY_MODES, - sysProp = "spark.cores.max"), - OptionAssigner(args.files, - LOCAL | STANDALONE | MESOS, - ALL_DEPLOY_MODES, - sysProp = "spark.files"), - OptionAssigner(args.jars, - STANDALONE | MESOS, - CLUSTER, - sysProp = "spark.jars"), - OptionAssigner(args.driverMemory, - STANDALONE | MESOS, - CLUSTER, - sysProp = "spark.driver.memory"), - OptionAssigner(args.driverCores, - STANDALONE | MESOS, - CLUSTER, - sysProp = "spark.driver.cores"), - OptionAssigner(args.supervise.toString, - STANDALONE | MESOS, - CLUSTER, - sysProp = "spark.driver.supervise"), - OptionAssigner(args.ivyRepoPath, - STANDALONE, - CLUSTER, - sysProp = "spark.jars.ivy") - ) - } -} """.replace("'''", "\"\"\"") override val tests = diff --git a/core/src/test/scala/org/scalafmt/util/FormatAssertions.scala b/core/src/test/scala/org/scalafmt/util/FormatAssertions.scala index 51da05b830..60badbbdbe 100644 --- a/core/src/test/scala/org/scalafmt/util/FormatAssertions.scala +++ b/core/src/test/scala/org/scalafmt/util/FormatAssertions.scala @@ -11,13 +11,13 @@ import org.scalafmt.Error.FormatterOutputDoesNotParse import org.scalatest.FunSuiteLike trait FormatAssertions extends FunSuiteLike with DiffAssertions { - import LoggerOps._ def assertFormatPreservesAst[T <: Tree](original: String, obtained: String)( implicit ev: Parse[T]): Unit = { import scala.meta._ original.parse[T] match { case Parsed.Error(pos, message, details) => + logger.warn(original) logger.warn(s"original does not parse $message") case Parsed.Success(originalParsed) => obtained.parse[T] match {