Skip to content

Commit c4b56b4

Browse files
authored
Fix a bug in the Add Open code fix (#15998)
* Fix a bug in an Add Open code fix * fantomas
1 parent 24345e6 commit c4b56b4

File tree

3 files changed

+71
-12
lines changed

3 files changed

+71
-12
lines changed

vsintegration/src/FSharp.Editor/CodeFixes/AddOpenCodeFixProvider.fs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,26 @@ type internal AddOpenCodeFixProvider [<ImportingConstructor>] (assemblyContentPr
5555

5656
// attribute, shouldn't be here
5757
| line when line.StartsWith "[<" && line.EndsWith ">]" ->
58-
let moduleDeclLineNumber =
58+
let moduleDeclLineNumberOpt =
5959
sourceText.Lines
6060
|> Seq.skip insertionLineNumber
61-
|> Seq.findIndex (fun line -> line.ToString().Contains "module")
62-
// add back the skipped lines
63-
|> fun i -> insertionLineNumber + i
61+
|> Seq.tryFindIndex (fun line -> line.ToString().Contains "module")
6462

65-
let moduleDeclLineText = sourceText.Lines[ moduleDeclLineNumber ].ToString().Trim()
63+
match moduleDeclLineNumberOpt with
64+
// implicit top level module
65+
| None -> insertionLineNumber, $"{margin}open {ns}{br}{br}"
66+
// explicit top level module
67+
| Some number ->
68+
// add back the skipped lines
69+
let moduleDeclLineNumber = insertionLineNumber + number
70+
let moduleDeclLineText = sourceText.Lines[ moduleDeclLineNumber ].ToString().Trim()
6671

67-
if moduleDeclLineText.EndsWith "=" then
68-
insertionLineNumber, $"{margin}open {ns}{br}{br}"
69-
else
70-
moduleDeclLineNumber + 2, $"{margin}open {ns}{br}{br}"
72+
if moduleDeclLineText.EndsWith "=" then
73+
insertionLineNumber, $"{margin}open {ns}{br}{br}"
74+
else
75+
moduleDeclLineNumber + 2, $"{margin}open {ns}{br}{br}"
7176

72-
// something else, shot in the dark
77+
// implicit top level module
7378
| _ -> insertionLineNumber, $"{margin}open {ns}{br}{br}"
7479

7580
| ScopeKind.Namespace -> insertionLineNumber + 3, $"{margin}open {ns}{br}{br}"

vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddOpenOnTopOffTests.fs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ let ``Fixes FS0039 for missing opens - nested module`` () =
159159
Assert.Equal(expected, actual)
160160

161161
[<Fact>]
162-
let ``Fixes FS0039 for missing opens - module has attributes`` () =
162+
let ``Fixes FS0039 for missing opens - explicit module has attributes`` () =
163163
let code =
164164
"""
165165
[<AutoOpen>]
@@ -187,6 +187,33 @@ Console.WriteLine 42
187187

188188
Assert.Equal(expected, actual)
189189

190+
[<Fact>]
191+
let ``Fixes FS0039 for missing opens - implicit module has attributes`` () =
192+
let code =
193+
"""
194+
[<Obsolete>]
195+
type MyType() =
196+
let now = DateTime.Now
197+
"""
198+
199+
let expected =
200+
Some
201+
{
202+
Message = "open System"
203+
FixedCode =
204+
"""
205+
open System
206+
207+
[<Obsolete>]
208+
type MyType() =
209+
let now = DateTime.Now
210+
"""
211+
}
212+
213+
let actual = codeFix |> tryFix code Auto
214+
215+
Assert.Equal(expected, actual)
216+
190217
// TODO: the open statement should actually be within the module
191218
[<Fact>]
192219
let ``Fixes FS0039 for missing opens - nested module has attributes`` () =

vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddOpenOnTopOnTests.fs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ module Module1 =
153153
Assert.Equal(expected, actual)
154154

155155
[<Fact>]
156-
let ``Fixes FS0039 for missing opens - module has attributes`` () =
156+
let ``Fixes FS0039 for missing opens - explicit module has attributes`` () =
157157
let code =
158158
"""
159159
[<AutoOpen>]
@@ -181,6 +181,33 @@ Console.WriteLine 42
181181

182182
Assert.Equal(expected, actual)
183183

184+
[<Fact>]
185+
let ``Fixes FS0039 for missing opens - implicit module has attributes`` () =
186+
let code =
187+
"""
188+
[<Obsolete>]
189+
type MyType() =
190+
let now = DateTime.Now
191+
"""
192+
193+
let expected =
194+
Some
195+
{
196+
Message = "open System"
197+
FixedCode =
198+
"""
199+
open System
200+
201+
[<Obsolete>]
202+
type MyType() =
203+
let now = DateTime.Now
204+
"""
205+
}
206+
207+
let actual = codeFix |> tryFix code Auto
208+
209+
Assert.Equal(expected, actual)
210+
184211
[<Fact>]
185212
let ``Fixes FS0039 for missing opens - nested module has attributes`` () =
186213
let code =

0 commit comments

Comments
 (0)