diff --git a/CodeFix/ChangeRefCellDerefToNotExpression.fs b/CodeFix/ChangeRefCellDerefToNotExpression.fs new file mode 100644 index 00000000000..0d7b80e9d96 --- /dev/null +++ b/CodeFix/ChangeRefCellDerefToNotExpression.fs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.Editor + +open System.Composition +open System.Threading.Tasks + +open Microsoft.CodeAnalysis.Text +open Microsoft.CodeAnalysis.CodeFixes + +[] +type internal FSharpChangeRefCellDerefToNotExpressionCodeFixProvider + [] + ( + checkerProvider: FSharpCheckerProvider, + projectInfoManager: FSharpProjectOptionsManager + ) = + inherit CodeFixProvider() + + static let userOpName = "FSharpChangeRefCellDerefToNotExpressionCodeFix" + let fixableDiagnosticIds = set ["FS0001"] + + override __.FixableDiagnosticIds = Seq.toImmutableArray fixableDiagnosticIds + + override this.RegisterCodeFixesAsync context : Task = + asyncMaybe { + let document = context.Document + let! parsingOptions, _ = projectInfoManager.TryGetOptionsForEditingDocumentOrProject(document, context.CancellationToken, userOpName) + let! sourceText = context.Document.GetTextAsync(context.CancellationToken) + let! parseResults = checkerProvider.Checker.ParseFile(document.FilePath, sourceText.ToFSharpSourceText(), parsingOptions, userOpName) |> liftAsync + + let errorRange = RoslynHelpers.TextSpanToFSharpRange(document.FilePath, context.Span, sourceText) + let! derefRange = parseResults.TryRangeOfRefCellDereferenceContainingPos errorRange.Start + let! derefSpan = RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, derefRange) + + let title = SR.UseNotForNegation() + + let diagnostics = + context.Diagnostics + |> Seq.filter (fun x -> fixableDiagnosticIds |> Set.contains x.Id) + |> Seq.toImmutableArray + + let codeFix = + CodeFixHelpers.createTextChangeCodeFix( + title, + context, + (fun () -> asyncMaybe.Return [| TextChange(derefSpan, "not ") |])) + + context.RegisterCodeFix(codeFix, diagnostics) + } + |> Async.Ignore + |> RoslynHelpers.StartAsyncUnitAsTask(context.CancellationToken) \ No newline at end of file diff --git a/FSharp.Editor.fsproj b/FSharp.Editor.fsproj index b7a653b0b44..f7cb5d028d3 100644 --- a/FSharp.Editor.fsproj +++ b/FSharp.Editor.fsproj @@ -180,6 +180,7 @@ + diff --git a/FSharp.Editor.resx b/FSharp.Editor.resx index 802675e062e..94f2d6c4c58 100644 --- a/FSharp.Editor.resx +++ b/FSharp.Editor.resx @@ -1,4 +1,4 @@ - +