diff --git a/CHANGELOG.md b/CHANGELOG.md index 04fec92d8a..6f2393f216 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +### Changed +* ExperimentalKeepIndentInBranch should fire when first branch was all on one line. [#2973](https://github.com/fsprojects/fantomas/issues/2973) + ## 6.2.3 - 2023-11-2 ### Fixed diff --git a/src/Fantomas.Core.Tests/KeepIndentInBranchTests.fs b/src/Fantomas.Core.Tests/KeepIndentInBranchTests.fs index b884d79457..7dcc8960cd 100644 --- a/src/Fantomas.Core.Tests/KeepIndentInBranchTests.fs +++ b/src/Fantomas.Core.Tests/KeepIndentInBranchTests.fs @@ -2183,3 +2183,83 @@ module Foo = failwith "" """ + +[] +let ``if keyword and elseBranch align, 2973`` () = + formatSourceString + false + """ +module Program = + let main _ = + if false then 1 else + printfn "hi!" + 0 +""" + config + |> prepend newline + |> should + equal + """ +module Program = + let main _ = + if false then + 1 + else + + printfn "hi!" + 0 +""" + +[] +let ``elif keyword and elseBranch align`` () = + formatSourceString + false + """ +if false then + 1 +elif false then 2 else +printfn "hi!" +0 +""" + config + |> prepend newline + |> should + equal + """ +if false then + 1 +elif false then + 2 +else + +printfn "hi!" +0 +""" + +[] +let ``elseBranch aligns with if keyword in computation expression`` () = + formatSourceString + false + """ +async { + if not (proc.Start ()) then return Error "failed to start" else + use stdout = proc.StandardOutput + let! ct = Async.CancellationToken + return! Async.AwaitTask (stdout.ReadToEndAsync ct) +} +""" + config + |> prepend newline + |> should + equal + """ +async { + if not (proc.Start()) then + return Error "failed to start" + else + + use stdout = proc.StandardOutput + let! ct = Async.CancellationToken + return! Async.AwaitTask(stdout.ReadToEndAsync ct) +} +""" diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 7d77e5abf9..6389365227 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -1298,7 +1298,7 @@ let genExpr (e: Expr) = indentSepNlnUnindent (genExpr node.ThenExpr) +> sepNln +> genSingleTextNode node.Else - +> genKeepIdent node.Else node.ElseExpr + +> genKeepIdentIfThenElse node.If.Node node.Else node.ElseExpr // Check if the `if expr then` is already multiline or cross the max_line_length. let isMultiline = @@ -1378,7 +1378,12 @@ let genExpr (e: Expr) = +> indentSepNlnUnindent (genExpr node.ThenExpr) |> genNode node) +> optSingle - (fun (elseNode, elseExpr) -> sepNln +> genSingleTextNode elseNode +> genKeepIdent elseNode elseExpr) + (fun (elseNode, elseExpr) -> + let genKeepIdent = + let branch = List.last node.Branches + genKeepIdentIfThenElse branch.If.Node elseNode elseExpr + + sepNln +> genSingleTextNode elseNode +> genKeepIdent) node.Else ifElseCtx areAllShort shortExpr longExpr @@ -2073,7 +2078,7 @@ let genClause (isLastItem: bool) (node: MatchClauseNode) = | None -> Pattern.Node node.Pattern | Some bar -> bar - genKeepIdent startNode node.BodyExpr + genKeepIdentMatchClause startNode node.BodyExpr expressionFitsOnRestOfLine (sepSpace +> genExpr node.BodyExpr) long @@ -2253,7 +2258,19 @@ let genExprInMultilineInfixExpr (e: Expr) = | Expr.Record _ -> atCurrentColumnIndent (genExpr e) | _ -> genExpr e -let genKeepIdent (startNode: Node) (e: Expr) ctx = +let genKeepIdentIfThenElse (ifKeyword: Node) (elseKeyword: Node) (e: Expr) ctx = + let exprNode = Expr.Node e + + if + ctx.Config.ExperimentalKeepIndentInBranch + && (elseKeyword.Range.StartColumn = exprNode.Range.StartColumn + || ifKeyword.Range.StartColumn = exprNode.Range.StartColumn) + then + (sepNln +> sepNlnUnlessContentBefore exprNode +> genExpr e) ctx + else + indentSepNlnUnindent (genExpr e) ctx + +let genKeepIdentMatchClause (startNode: Node) (e: Expr) ctx = let exprNode = Expr.Node e if