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 cde3c404ff..d5f1ed6603 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 @@ -439,6 +439,9 @@ class FormatOps( } term.elsep match { case t: Term.If => getElseChain(t, newRes) + case b @ Term.Block(List(t: Term.If)) + if !tokens.areMatching(ftElsep.left)(getLastToken(b)) => + getElseChain(t, newRes) case _ => newRes } case _ => res @@ -2401,14 +2404,17 @@ class FormatOps( ): Option[OptionalBracesRegion] = { ft.meta.leftOwner match { case t: Term.If => + val nr = nft.right t.cond match { - case b: Term.Block - if !matchingOpt(nft.right).exists(_.end >= b.pos.end) => + case b: Term.Block if (matchingOpt(nr) match { + case Some(t) => t.end < b.pos.end + case None => isMultiStatBlock(b) + }) => Some(new OptionalBracesRegion { def owner = Some(t) def splits = Some { val dangle = style.danglingParentheses.ctrlSite - val forceNL = !nft.right.is[T.LeftParen] + val forceNL = !nr.is[T.LeftParen] getSplits(ft, b, forceNL, dangle) } def rightBrace = blockLast(b) @@ -2429,6 +2435,12 @@ class FormatOps( (t.elsep match { case _: Term.If => None case x if isTreeMultiStatBlock(x) => Some(true) + case b @ Term.Block(List(_: Term.If)) + if (matchingOpt(nft.right) match { + case Some(t) => t.end < b.pos.end + case None => true + }) => + None case _ if isThenPWithOptionalBraces(t) => Some(shouldBreakInOptionalBraces(nft)) case _ => None 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 fe0fc8b839..b2f038596e 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 @@ -2173,7 +2173,14 @@ class Router(formatOps: FormatOps) { Seq(Split(Newline, 0)) // Last else branch case FormatToken(_: T.KwElse, _, _) if (leftOwner match { - case t: Term.If => !t.elsep.is[Term.If] + case t: Term.If => + t.elsep match { + case _: Term.If => false + case b @ Term.Block(List(_: Term.If)) => + matchingOpt(nextNonComment(formatToken).right) + .exists(_.end >= b.pos.end) + case _ => true + } case x => throw new UnexpectedTree[Term.If](x) }) => val body = leftOwner.asInstanceOf[Term.If].elsep diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat b/scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat index 44516ecc56..fc48c6db93 100644 --- a/scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat +++ b/scalafmt-tests/src/test/resources/scala3/OptionalBraces.stat @@ -876,6 +876,48 @@ object a: stat4 end if end cond +<<< remove optional braces within if-cond +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if { + bar && + baz + } then + foo +>>> +private def mtd: Res = + if bar && + baz + then foo +<<< remove optional braces within else-if +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then + barBody + else bazBody + } +>>> +private def mtd: Res = + if foo then fooBody + else if bar then barBody + else bazBody +<<< remove optional braces within else-if 2 +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then barBody else bazBody + } +>>> +private def mtd: Res = + if foo then fooBody + else if bar then barBody + else bazBody <<< rewrite with given-with rewrite.scala3.removeOptionalBraces = oldSyntaxToo === diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat index 21404d9937..7328b1b9b0 100644 --- a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat +++ b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_fold.stat @@ -821,6 +821,39 @@ object a: stat4 end if end cond +<<< remove optional braces within if-cond +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if { + bar && + baz + } then + foo +>>> +private def mtd: Res = if bar && baz then foo +<<< remove optional braces within else-if +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then + barBody + else bazBody + } +>>> +private def mtd: Res = if foo then fooBody else if bar then barBody else bazBody +<<< remove optional braces within else-if 2 +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then barBody else bazBody + } +>>> +private def mtd: Res = if foo then fooBody else if bar then barBody else bazBody <<< rewrite with given-with rewrite.scala3.removeOptionalBraces = oldSyntaxToo === diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat index 33d44345e5..8d2c6d05f2 100644 --- a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat +++ b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_keep.stat @@ -875,6 +875,51 @@ object a: stat4 end if end cond +<<< remove optional braces within if-cond +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if { + bar && + baz + } then + foo +>>> +private def mtd: Res = + if + bar && + baz + then + foo +<<< remove optional braces within else-if +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then + barBody + else bazBody + } +>>> +private def mtd: Res = + if foo then fooBody + else if bar then + barBody + else bazBody +<<< remove optional braces within else-if 2 +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then barBody else bazBody + } +>>> +private def mtd: Res = + if foo then fooBody + else if bar then barBody + else bazBody <<< rewrite with given-with rewrite.scala3.removeOptionalBraces = oldSyntaxToo === diff --git a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat index deec05e20f..9d71b216db 100644 --- a/scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat +++ b/scalafmt-tests/src/test/resources/scala3/OptionalBraces_unfold.stat @@ -919,6 +919,53 @@ object a: stat4 end if end cond +<<< remove optional braces within if-cond +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if { + bar && + baz + } then + foo +>>> +private def mtd: Res = + if bar && baz then + foo +<<< remove optional braces within else-if +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then + barBody + else bazBody + } +>>> +private def mtd: Res = + if foo then + fooBody + else if bar then + barBody + else + bazBody +<<< remove optional braces within else-if 2 +rewrite.scala3.removeOptionalBraces = yes +=== +private def mtd: Res = + if foo then fooBody + else { + if bar then barBody else bazBody + } +>>> +private def mtd: Res = + if foo then + fooBody + else if bar then + barBody + else + bazBody <<< rewrite with given-with rewrite.scala3.removeOptionalBraces = oldSyntaxToo ===