From 481c620fd7530ae1afd29f425104538385f3310d Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Tue, 17 Nov 2020 13:42:15 -0800 Subject: [PATCH] Add ChangeRefCellDerefToNotExpression code fixer (#10469) * Add ChangeRefCellDerefToNotExpression code fixer * Area --- CodeFix/ChangeRefCellDerefToNotExpression.fs | 52 ++++++++++++++++++++ FSharp.Editor.fsproj | 1 + FSharp.Editor.resx | 5 +- xlf/FSharp.Editor.cs.xlf | 5 ++ xlf/FSharp.Editor.de.xlf | 5 ++ xlf/FSharp.Editor.es.xlf | 5 ++ xlf/FSharp.Editor.fr.xlf | 5 ++ xlf/FSharp.Editor.it.xlf | 5 ++ xlf/FSharp.Editor.ja.xlf | 5 ++ xlf/FSharp.Editor.ko.xlf | 5 ++ xlf/FSharp.Editor.pl.xlf | 5 ++ xlf/FSharp.Editor.pt-BR.xlf | 5 ++ xlf/FSharp.Editor.ru.xlf | 5 ++ xlf/FSharp.Editor.tr.xlf | 5 ++ xlf/FSharp.Editor.zh-Hans.xlf | 5 ++ xlf/FSharp.Editor.zh-Hant.xlf | 5 ++ 16 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 CodeFix/ChangeRefCellDerefToNotExpression.fs 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 @@ - +