From 2f2041694d244f4fd7b13174809a0bfdecc829fe Mon Sep 17 00:00:00 2001 From: dawe Date: Mon, 13 Mar 2023 18:06:07 +0100 Subject: [PATCH] Fix removeCommaEdits in ConvertPositionalDUToNamed to work for unformatted patterns (#1074) --- .../CodeFixes/ConvertPositionalDUToNamed.fs | 8 +++++--- test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/FsAutoComplete/CodeFixes/ConvertPositionalDUToNamed.fs b/src/FsAutoComplete/CodeFixes/ConvertPositionalDUToNamed.fs index 9261194f8..b8219da1b 100644 --- a/src/FsAutoComplete/CodeFixes/ConvertPositionalDUToNamed.fs +++ b/src/FsAutoComplete/CodeFixes/ConvertPositionalDUToNamed.fs @@ -146,10 +146,12 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getRangeText: GetRange let notInsidePatterns = let ranges = duFields |> List.map (fun f -> f.Range) - fun (pos: FSharp.Compiler.Text.Position) -> - ranges - |> List.forall (fun r -> not (FSharp.Compiler.Text.Range.rangeContainsPos r pos)) + let rangeContainsPosLeftEdgeExclusive (r: FSharp.Compiler.Text.Range) p = + let r' = r.WithStart(r.Start.WithColumn(r.Start.Column + 1)) + rangeContainsPos r' p + fun (pos: FSharp.Compiler.Text.Position) -> + ranges |> List.forall (fun r -> not (rangeContainsPosLeftEdgeExclusive r pos)) let commasBetweenFields = toPosSeq (parenRange, sourceText) diff --git a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs index dc63bdb79..5df7d29a6 100644 --- a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs +++ b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs @@ -629,6 +629,18 @@ let private convertPositionalDUToNamedTests state = type U = U of aValue: int * boolean: int * char: char * dec: decimal * element: int let (U(aValue = a; boolean = b; char = _; dec = _; element = _;)) = failwith "..." """ + testCaseAsync "when the existing pattern isn't formatted well" <| + CodeFix.check server + """ + type A = A of a: int * b: bool * c: bool * d: bool + let (A($0a,b, c, d)) = A(1, true, false, false) + """ + Diagnostics.acceptAll + selectCodeFix + """ + type A = A of a: int * b: bool * c: bool * d: bool + let (A(a = a;b = b; c = c; d = d;)) = A(1, true, false, false) + """ ]) let private convertTripleSlashCommentToXmlTaggedDocTests state =