diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala index d088ee4085..3dcf32febf 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala @@ -760,7 +760,8 @@ class FormatOps( if (breakMany) TokenRanges.empty else insideBracesBlock(nextFT, expire, true) Split(ModExt(newStmtMod.getOrElse(spaceMod)), cost) - .withSingleLine(expire, exclude) + .withSingleLineNoOptimal(expire, exclude) + .withOptimalToken(expire, ignore = cost != 0) } } diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala index 7092f06720..3b492b6bd8 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala @@ -933,7 +933,7 @@ class Router(formatOps: FormatOps) { Seq( Split(Newline, nestedPenalty + Constants.ExceedColumnPenalty) .withPolicy(newlinePolicy).withIndent(indent, close, Before), - Split(NoSplit, nestedPenalty).withSingleLine(breakToken) + Split(NoSplit, nestedPenalty).withSingleLineNoOptimal(breakToken) .andPolicy(newlinePolicy & newlineAfterAssignDecision), ) } @@ -1276,7 +1276,7 @@ class Router(formatOps: FormatOps) { else NewlineT(alt = if (singleLineOnly) Some(NoSplit) else None) val nlSplit = Split(nlMod, bracketPenalty * (if (oneline) 4 else 2)) .withIndent(indent) - .withSingleLineOpt(if (singleLineOnly) Some(close) else None) + .withSingleLineNoOptimal(close, ignore = !singleLineOnly) .andPolicy(nlPolicy & penalizeNewlinesPolicy, singleLineOnly) .andPolicyOpt(singleArgAsInfix.map(InfixSplits(_, ft).nlPolicy)) Seq(noSplit, nlSplit) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala index 72786dc540..b541aa59d7 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala @@ -139,9 +139,17 @@ case class Split( ): Split = if (ignore) this else withOptimalAt(Some(OptimalToken(token, killOnFail))) - def withOptimalAt(optimalAt: => Option[OptimalToken]): Split = { + def withOptimalAt(fOptimalAt: => Option[OptimalToken]): Split = { require(this.optimalAt.isEmpty) - if (isIgnored) this else copy(optimalAt = optimalAt) + if (isIgnored) this + else { + val optimalAt = fOptimalAt + if (optimalAt.isEmpty) this + else { + require(cost == 0, s"can't set optimal, cost=$cost") + copy(optimalAt = optimalAt) + } + } } def withPolicy(newPolicy: => Policy, ignore: Boolean = false): Split = @@ -168,15 +176,6 @@ case class Split( rank, ) - def withSingleLineOpt( - expire: Option[Token], - exclude: => TokenRanges = TokenRanges.empty, - noSyntaxNL: Boolean = false, - killOnFail: Boolean = false, - rank: Int = 0, - )(implicit fileLine: FileLine, style: ScalafmtConfig): Split = expire - .fold(this)(withSingleLine(_, exclude, noSyntaxNL, killOnFail, rank)) - def withSingleLineAndOptimal( expire: Token, optimal: Token, @@ -193,8 +192,10 @@ case class Split( exclude: => TokenRanges = TokenRanges.empty, noSyntaxNL: Boolean = false, rank: Int = 0, + ignore: Boolean = false, )(implicit fileLine: FileLine, style: ScalafmtConfig): Split = withPolicy( SingleLineBlock(expire, exclude, noSyntaxNL = noSyntaxNL, rank = rank), + ignore = ignore, ) def withPolicyOpt(newPolicy: => Option[Policy]): Split =