From 2d13bda63214922320f2e49ac1c6c703e80a7ea8 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:30:25 -0700 Subject: [PATCH] RedundantBraces: keep unrelated thenp/elsep apart --- .../scalafmt/rewrite/RedundantBraces.scala | 26 ++++++++++++++- .../resources/rewrite/RedundantBraces-if.stat | 32 +++++++++---------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/rewrite/RedundantBraces.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/rewrite/RedundantBraces.scala index c3f2930063..631f7efe77 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/rewrite/RedundantBraces.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/rewrite/RedundantBraces.scala @@ -294,11 +294,12 @@ class RedundantBraces(implicit val ftoks: FormatTokens) private def onRightBrace(left: Replacement)(implicit ft: FormatToken, + session: Session, style: ScalafmtConfig, ): (Replacement, Replacement) = { val ok = ft.meta.rightOwner match { case _: Term.Block => ftoks.prevNotTrailingComment(ft).isRight && - !braceSeparatesTwoXmlTokens + !braceSeparatesTwoXmlTokens && !elseAfterRightBraceThenpOnLeft case _ => true } if (ok) (left, removeToken) else null @@ -618,4 +619,27 @@ class RedundantBraces(implicit val ftoks: FormatTokens) private def braceSeparatesTwoXmlTokens(implicit ft: FormatToken): Boolean = ft .left.is[Token.Xml.End] && ftoks.next(ft).right.is[Token.Xml.Start] + private def elseAfterRightBraceThenpOnLeft(implicit + ft: FormatToken, + ftoks: FormatTokens, + session: Session, + ): Boolean = ftoks.nextNonCommentAfter(ft).right.is[Token.KwElse] && { + val pft = ftoks.findToken(ft, ftoks.prev) { xft => + xft.left match { + case _: Token.Comment => false + case _: Token.RightBrace => !session.isRemovedOnLeft(xft, ok = true) + case _ => true + } + } + val rbOwner = ft.rightOwner + findTreeWithParent(pft.leftOwner) { p => + if (p eq rbOwner) Some(false) + else p.parent match { + case None => Some(false) + case Some(pp: Term.If) if pp.thenp eq p => Some(true) + case _ => None + } + }.isDefined + } + } diff --git a/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat index cb91eeacf5..516a291cdd 100644 --- a/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat +++ b/scalafmt-tests/shared/src/test/resources/rewrite/RedundantBraces-if.stat @@ -299,14 +299,14 @@ object a { f(imported) } >>> -Idempotency violated -=> Diff (- obtained, + expected) - f(sym) -- else if (isQualifyingImplicit(name, imported, pre, imported = true)) -- f(imported) -+ else if (isQualifyingImplicit(name, imported, pre, imported = true)) -+ f(imported) - } +object a { + if (imported.isOverloaded) { + for (sym <- imported.alternatives) + if (isQualifyingImplicit(name, sym, pre, imported = true)) + f(sym) + } else if (isQualifyingImplicit(name, imported, pre, imported = true)) + f(imported) +} <<< #4133 nested braces around expression ending with `if`-without-`else` object a { if (imported.isOverloaded) { @@ -320,11 +320,11 @@ object a { f(imported) } >>> -Idempotency violated -=> Diff (- obtained, + expected) - f(sym) -- else if (isQualifyingImplicit(name, imported, pre, imported = true)) -- f(imported) -+ else if (isQualifyingImplicit(name, imported, pre, imported = true)) -+ f(imported) - } +object a { + if (imported.isOverloaded) { + for (sym <- imported.alternatives) + if (isQualifyingImplicit(name, sym, pre, imported = true)) + f(sym) + } else if (isQualifyingImplicit(name, imported, pre, imported = true)) + f(imported) +}