From 5a33609b348a48a7e2f659dc663cd198e539760b Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 22 Dec 2020 22:11:32 +0100 Subject: [PATCH 1/2] Put multiline when condition on the next line. Fixes #1320. --- src/Fantomas.Tests/PatternMatchingTests.fs | 33 ++++++++++++++++++++++ src/Fantomas/CodePrinter.fs | 6 +++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/Fantomas.Tests/PatternMatchingTests.fs b/src/Fantomas.Tests/PatternMatchingTests.fs index ddcc4e04b6..02ce481631 100644 --- a/src/Fantomas.Tests/PatternMatchingTests.fs +++ b/src/Fantomas.Tests/PatternMatchingTests.fs @@ -1060,3 +1060,36 @@ let rec (|DoExprAttributesL|_|) = | Attributes _ as x :: ys -> Some([ x ], ys) | _ -> None """ + +[] +let ``multiline when condition, 1320`` () = + formatSourceString + false + """ +module Foo = + module Bar = + let buildUsage argInfos = + match v.IsMember, v.IsInstanceMember, v.LogicalName, v.DisplayName with + // Ordinary functions or values + | false, _, _, name when + not (hasAttribute v.ApparentEnclosingEntity.Attributes) -> + name + " " + parArgs + // Ordinary static members or things (?) that require fully qualified access + | _, _, _, name -> name + parArgs +""" + config + |> prepend newline + |> should + equal + """ +module Foo = + module Bar = + let buildUsage argInfos = + match v.IsMember, v.IsInstanceMember, v.LogicalName, v.DisplayName with + // Ordinary functions or values + | false, _, _, name when + not (hasAttribute v.ApparentEnclosingEntity.Attributes) -> + name + " " + parArgs + // Ordinary static members or things (?) that require fully qualified access + | _, _, _, name -> name + parArgs +""" diff --git a/src/Fantomas/CodePrinter.fs b/src/Fantomas/CodePrinter.fs index 07e3fe3fe1..cd5d2987e2 100644 --- a/src/Fantomas/CodePrinter.fs +++ b/src/Fantomas/CodePrinter.fs @@ -4230,7 +4230,11 @@ and genClause astContext hasBar (Clause (p, e, eo)) = mkRange "arrowRange" p.Range.End e.Range.Start let body = - optPre (!- " when ") sepNone eo (genExpr astContext) + optPre + (!- " when") + sepNone + eo + (fun e -> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (genExpr astContext e)) +> sepArrow +> leaveNodeTokenByName arrowRange RARROW +> clauseBody e From d02ab8c181d05052e92f7041f48feed7824d2586 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 22 Dec 2020 22:35:07 +0100 Subject: [PATCH 2/2] Correct indentation of clause body if when condition is multiline. --- src/Fantomas.Tests/PatternMatchingTests.fs | 37 +++++++++++++++++++++- src/Fantomas/CodePrinter.fs | 18 +++++------ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/Fantomas.Tests/PatternMatchingTests.fs b/src/Fantomas.Tests/PatternMatchingTests.fs index 02ce481631..2e8c75b0a9 100644 --- a/src/Fantomas.Tests/PatternMatchingTests.fs +++ b/src/Fantomas.Tests/PatternMatchingTests.fs @@ -1089,7 +1089,42 @@ module Foo = // Ordinary functions or values | false, _, _, name when not (hasAttribute v.ApparentEnclosingEntity.Attributes) -> - name + " " + parArgs + name + " " + parArgs // Ordinary static members or things (?) that require fully qualified access | _, _, _, name -> name + parArgs """ + +[] +let ``maintain indent if when condition is multiline`` () = + formatSourceString + false + """ + match foo with + | headToken :: rest when (isOperatorOrKeyword headToken && List.exists (fun k -> headToken.TokenInfo.TokenName = k) keywordTrivia) -> + let range = + getRangeBetween "keyword" headToken headToken + + let info = + Trivia.Create(Keyword(headToken)) range + |> List.prependItem foundTrivia + + getTriviaFromTokensThemSelves allTokens rest info +""" + config + |> prepend newline + |> should + equal + """ +match foo with +| headToken :: rest when + (isOperatorOrKeyword headToken + && List.exists (fun k -> headToken.TokenInfo.TokenName = k) keywordTrivia) -> + let range = + getRangeBetween "keyword" headToken headToken + + let info = + Trivia.Create(Keyword(headToken)) range + |> List.prependItem foundTrivia + + getTriviaFromTokensThemSelves allTokens rest info +""" diff --git a/src/Fantomas/CodePrinter.fs b/src/Fantomas/CodePrinter.fs index cd5d2987e2..c044e49255 100644 --- a/src/Fantomas/CodePrinter.fs +++ b/src/Fantomas/CodePrinter.fs @@ -4229,21 +4229,21 @@ and genClause astContext hasBar (Clause (p, e, eo)) = let arrowRange = mkRange "arrowRange" p.Range.End e.Range.Start - let body = - optPre + let body = clauseBody e + + let astCtx = + { astContext with + IsInsideMatchClausePattern = true } + + let pat = + genPat astCtx p + +> optPre (!- " when") sepNone eo (fun e -> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (genExpr astContext e)) +> sepArrow +> leaveNodeTokenByName arrowRange RARROW - +> clauseBody e - - let astCtx = - { astContext with - IsInsideMatchClausePattern = true } - - let pat = genPat astCtx p genTriviaBeforeClausePipe p.Range +> ifElse hasBar (sepBar +> atCurrentColumnWithPrepend pat body) (pat +> body)