From dbd55d6ac1ddbcd5564dd5621dea533219766470 Mon Sep 17 00:00:00 2001 From: baronfel Date: Fri, 25 Jun 2021 15:02:28 -0500 Subject: [PATCH 1/4] RQA on the FixKind DU --- src/FsAutoComplete/CodeFixes.fs | 7 ++++--- src/FsAutoComplete/CodeFixes/AddMissingFunKeyword.fs | 2 +- src/FsAutoComplete/CodeFixes/AddMissingRecKeyword.fs | 2 +- .../CodeFixes/AddTypeToIndeterminateValue.fs | 2 +- src/FsAutoComplete/CodeFixes/ChangeCSharpLambdaToFSharp.fs | 2 +- .../CodeFixes/ChangeComparisonToMutableAssignment.fs | 2 +- src/FsAutoComplete/CodeFixes/ColonInFieldType.fs | 2 +- .../CodeFixes/ConvertBangEqualsToInequality.fs | 2 +- .../CodeFixes/ConvertInvalidRecordToAnonRecord.fs | 2 +- src/FsAutoComplete/CodeFixes/DoubleEqualsToSingleEquals.fs | 2 +- src/FsAutoComplete/CodeFixes/ExternalSystemDiagnostics.fs | 2 +- src/FsAutoComplete/CodeFixes/GenerateAbstractClassStub.fs | 2 +- src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs | 2 +- src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs | 2 +- src/FsAutoComplete/CodeFixes/GenerateUnionCases.fs | 2 +- src/FsAutoComplete/CodeFixes/MakeDeclarationMutable.fs | 2 +- src/FsAutoComplete/CodeFixes/MakeOuterBindingRecursive.fs | 2 +- src/FsAutoComplete/CodeFixes/MissingEquals.fs | 2 +- src/FsAutoComplete/CodeFixes/NegationToSubtraction.fs | 2 +- src/FsAutoComplete/CodeFixes/NewWithDisposables.fs | 2 +- src/FsAutoComplete/CodeFixes/ParenthesizeExpression.fs | 2 +- src/FsAutoComplete/CodeFixes/RedundantQualifier.fs | 2 +- src/FsAutoComplete/CodeFixes/RefCellAccessToNot.fs | 2 +- .../CodeFixes/RemoveUnnecessaryReturnOrYield.fs | 2 +- src/FsAutoComplete/CodeFixes/RemoveUnusedBinding.fs | 2 +- .../CodeFixes/ReplaceBangWithValueFunction.fs | 2 +- src/FsAutoComplete/CodeFixes/ResolveNamespace.fs | 4 ++-- src/FsAutoComplete/CodeFixes/SuggestedIdentifier.fs | 2 +- src/FsAutoComplete/CodeFixes/UnusedOpens.fs | 2 +- src/FsAutoComplete/CodeFixes/UnusedValue.fs | 6 +++--- src/FsAutoComplete/CodeFixes/UseSafeCastInsteadOfUnsafe.fs | 4 ++-- 31 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/FsAutoComplete/CodeFixes.fs b/src/FsAutoComplete/CodeFixes.fs index f04480a1a..ff809ba12 100644 --- a/src/FsAutoComplete/CodeFixes.fs +++ b/src/FsAutoComplete/CodeFixes.fs @@ -25,6 +25,7 @@ module Types = type GetParseResultsForFile = string -> FSharp.Compiler.Text.Pos -> Async> type GetProjectOptionsForFile = string -> ResultOrString + [] type FixKind = | Fix | Refactor @@ -62,9 +63,9 @@ module Types = Kind = Some (match fixKind with - | Fix -> "quickfix" - | Refactor -> "refactor" - | Rewrite -> "refactor.rewrite") + | FixKind.Fix -> "quickfix" + | FixKind.Refactor -> "refactor" + | FixKind.Rewrite -> "refactor.rewrite") Diagnostics = diagnostic |> Option.map Array.singleton Edit = workspaceEdit Command = None } diff --git a/src/FsAutoComplete/CodeFixes/AddMissingFunKeyword.fs b/src/FsAutoComplete/CodeFixes/AddMissingFunKeyword.fs index 3b7a7ab51..4ca4f8e56 100644 --- a/src/FsAutoComplete/CodeFixes/AddMissingFunKeyword.fs +++ b/src/FsAutoComplete/CodeFixes/AddMissingFunKeyword.fs @@ -61,7 +61,7 @@ let fix (getFileLines: GetFileLines) (getLineText: GetLineText): CodeFix = Edits = [| { Range = symbolStartRange NewText = "fun " } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/AddMissingRecKeyword.fs b/src/FsAutoComplete/CodeFixes/AddMissingRecKeyword.fs index 97e6719d7..e4e77ef05 100644 --- a/src/FsAutoComplete/CodeFixes/AddMissingRecKeyword.fs +++ b/src/FsAutoComplete/CodeFixes/AddMissingRecKeyword.fs @@ -67,7 +67,7 @@ let fix (getFileLines: GetFileLines) (getLineText: GetLineText): CodeFix = Edits = [| { Range = { Start = endOfError; End = endOfError } NewText = " rec" } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/AddTypeToIndeterminateValue.fs b/src/FsAutoComplete/CodeFixes/AddTypeToIndeterminateValue.fs index fdffbb009..7d3e82316 100644 --- a/src/FsAutoComplete/CodeFixes/AddTypeToIndeterminateValue.fs +++ b/src/FsAutoComplete/CodeFixes/AddTypeToIndeterminateValue.fs @@ -50,7 +50,7 @@ let fix Title = "Add explicit type annotation" File = codeActionParams.TextDocument SourceDiagnostic = Some diagnostic - Kind = Fix + Kind = FixKind.Fix Edits = [| { Range = changedRange NewText = changedText } |] }] | _ -> return [] diff --git a/src/FsAutoComplete/CodeFixes/ChangeCSharpLambdaToFSharp.fs b/src/FsAutoComplete/CodeFixes/ChangeCSharpLambdaToFSharp.fs index cd875dd27..2cecab018 100644 --- a/src/FsAutoComplete/CodeFixes/ChangeCSharpLambdaToFSharp.fs +++ b/src/FsAutoComplete/CodeFixes/ChangeCSharpLambdaToFSharp.fs @@ -38,7 +38,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getLineText: GetLineTe Edits = [| { Range = replacementRange NewText = replacementText } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/ChangeComparisonToMutableAssignment.fs b/src/FsAutoComplete/CodeFixes/ChangeComparisonToMutableAssignment.fs index 2920a54b4..fad1b02a7 100644 --- a/src/FsAutoComplete/CodeFixes/ChangeComparisonToMutableAssignment.fs +++ b/src/FsAutoComplete/CodeFixes/ChangeComparisonToMutableAssignment.fs @@ -47,7 +47,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) : CodeFix = { Start = equalsPos End = (inc lines equalsPos) } NewText = "<-" } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | None -> return [] | _ -> return [] } diff --git a/src/FsAutoComplete/CodeFixes/ColonInFieldType.fs b/src/FsAutoComplete/CodeFixes/ColonInFieldType.fs index 4a39e795a..67cfbf824 100644 --- a/src/FsAutoComplete/CodeFixes/ColonInFieldType.fs +++ b/src/FsAutoComplete/CodeFixes/ColonInFieldType.fs @@ -17,6 +17,6 @@ let fix: CodeFix = Edits = [| { Range = diagnostic.Range NewText = ":" } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] else AsyncResult.retn []) diff --git a/src/FsAutoComplete/CodeFixes/ConvertBangEqualsToInequality.fs b/src/FsAutoComplete/CodeFixes/ConvertBangEqualsToInequality.fs index de5341c0c..9dd244659 100644 --- a/src/FsAutoComplete/CodeFixes/ConvertBangEqualsToInequality.fs +++ b/src/FsAutoComplete/CodeFixes/ConvertBangEqualsToInequality.fs @@ -18,7 +18,7 @@ let fix (getRangeText: GetRangeText): CodeFix = return [{ Title = "Use <> for inequality check" File = codeActionParams.TextDocument SourceDiagnostic = Some diag - Kind = Fix + Kind = FixKind.Fix Edits = [| { Range = diag.Range NewText = "<>" } |] }] diff --git a/src/FsAutoComplete/CodeFixes/ConvertInvalidRecordToAnonRecord.fs b/src/FsAutoComplete/CodeFixes/ConvertInvalidRecordToAnonRecord.fs index c4341e145..9e3136b72 100644 --- a/src/FsAutoComplete/CodeFixes/ConvertInvalidRecordToAnonRecord.fs +++ b/src/FsAutoComplete/CodeFixes/ConvertInvalidRecordToAnonRecord.fs @@ -40,7 +40,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) : CodeFix = NewText = "|" } { Range = endInsertRange NewText = "|" } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/DoubleEqualsToSingleEquals.fs b/src/FsAutoComplete/CodeFixes/DoubleEqualsToSingleEquals.fs index 19db4ecc0..dec14ed21 100644 --- a/src/FsAutoComplete/CodeFixes/DoubleEqualsToSingleEquals.fs +++ b/src/FsAutoComplete/CodeFixes/DoubleEqualsToSingleEquals.fs @@ -23,7 +23,7 @@ let fix (getRangeText: GetRangeText) : CodeFix = Edits = [| { Range = diagnostic.Range NewText = "=" } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/ExternalSystemDiagnostics.fs b/src/FsAutoComplete/CodeFixes/ExternalSystemDiagnostics.fs index 5a2b0d284..04af79444 100644 --- a/src/FsAutoComplete/CodeFixes/ExternalSystemDiagnostics.fs +++ b/src/FsAutoComplete/CodeFixes/ExternalSystemDiagnostics.fs @@ -19,7 +19,7 @@ let private mapExternalDiagnostic diagnosticType = File = codeActionParams.TextDocument Title = $"Fix issue" Edits = fixes |> List.toArray - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> AsyncResult.retn [] ) diff --git a/src/FsAutoComplete/CodeFixes/GenerateAbstractClassStub.fs b/src/FsAutoComplete/CodeFixes/GenerateAbstractClassStub.fs index 2b8d5d817..b28750737 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateAbstractClassStub.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateAbstractClassStub.fs @@ -51,7 +51,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) Edits = [| { Range = fcsPosToProtocolRange position NewText = replaced } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs b/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs index d8c61c6eb..66bab6160 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs @@ -38,7 +38,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) Edits = [| { Range = fcsPosToProtocolRange position NewText = replaced } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> return [] } diff --git a/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs b/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs index df86545c3..434bd025e 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs @@ -36,7 +36,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) Edits = [| { Range = fcsPosToProtocolRange position NewText = replaced } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> return [] } |> AsyncResult.foldResult id (fun _ -> []) diff --git a/src/FsAutoComplete/CodeFixes/GenerateUnionCases.fs b/src/FsAutoComplete/CodeFixes/GenerateUnionCases.fs index a74320610..32b36ff7f 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateUnionCases.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateUnionCases.fs @@ -45,7 +45,7 @@ let fix (getFileLines: GetFileLines) File = codeActionParams.TextDocument Title = "Generate union pattern match cases" Edits = [| { Range = range; NewText = replaced } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | _ -> return [] } diff --git a/src/FsAutoComplete/CodeFixes/MakeDeclarationMutable.fs b/src/FsAutoComplete/CodeFixes/MakeDeclarationMutable.fs index 3861ba9d2..39d2b5276 100644 --- a/src/FsAutoComplete/CodeFixes/MakeDeclarationMutable.fs +++ b/src/FsAutoComplete/CodeFixes/MakeDeclarationMutable.fs @@ -40,7 +40,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) { Start = lspRange.Start End = lspRange.Start } NewText = "mutable " } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | _ -> return [] | None -> return [] } diff --git a/src/FsAutoComplete/CodeFixes/MakeOuterBindingRecursive.fs b/src/FsAutoComplete/CodeFixes/MakeOuterBindingRecursive.fs index 6788aa221..faf87b36f 100644 --- a/src/FsAutoComplete/CodeFixes/MakeOuterBindingRecursive.fs +++ b/src/FsAutoComplete/CodeFixes/MakeOuterBindingRecursive.fs @@ -34,7 +34,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getLineText: GetLineTe [ { Title = "Make outer binding recursive" File = codeActionParams.TextDocument SourceDiagnostic = Some diagnostic - Kind = Fix + Kind = FixKind.Fix Edits = [| { Range = { Start = lspOuterBindingRange.Start diff --git a/src/FsAutoComplete/CodeFixes/MissingEquals.fs b/src/FsAutoComplete/CodeFixes/MissingEquals.fs index 1ee72cfc3..2d95184ee 100644 --- a/src/FsAutoComplete/CodeFixes/MissingEquals.fs +++ b/src/FsAutoComplete/CodeFixes/MissingEquals.fs @@ -31,7 +31,7 @@ let fix (getFileLines: GetFileLines) = Edits = [| { Range = { Start = insertPos; End = insertPos } NewText = " =" } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | None -> return [] else return [] diff --git a/src/FsAutoComplete/CodeFixes/NegationToSubtraction.fs b/src/FsAutoComplete/CodeFixes/NegationToSubtraction.fs index e09e44e5b..3c5818295 100644 --- a/src/FsAutoComplete/CodeFixes/NegationToSubtraction.fs +++ b/src/FsAutoComplete/CodeFixes/NegationToSubtraction.fs @@ -27,7 +27,7 @@ let fix (getFileLines: GetFileLines): CodeFix = Edits = [| { Range = { Start = dash; End = inc lines dash } NewText = "- " } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/NewWithDisposables.fs b/src/FsAutoComplete/CodeFixes/NewWithDisposables.fs index 4fd470623..cc5970f92 100644 --- a/src/FsAutoComplete/CodeFixes/NewWithDisposables.fs +++ b/src/FsAutoComplete/CodeFixes/NewWithDisposables.fs @@ -20,5 +20,5 @@ let fix (getRangeText: GetRangeText) = Edits = [| { Range = diagnostic.Range NewText = $"new %s{errorText}" } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | Error _ -> AsyncResult.retn []) diff --git a/src/FsAutoComplete/CodeFixes/ParenthesizeExpression.fs b/src/FsAutoComplete/CodeFixes/ParenthesizeExpression.fs index 8802a1e4e..037d2cd05 100644 --- a/src/FsAutoComplete/CodeFixes/ParenthesizeExpression.fs +++ b/src/FsAutoComplete/CodeFixes/ParenthesizeExpression.fs @@ -19,5 +19,5 @@ let fix (getRangeText: GetRangeText): CodeFix = Edits = [| { Range = diagnostic.Range NewText = $"(%s{erroringExpression})" } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | Error _ -> AsyncResult.retn []) diff --git a/src/FsAutoComplete/CodeFixes/RedundantQualifier.fs b/src/FsAutoComplete/CodeFixes/RedundantQualifier.fs index 0564a893a..9f2348a11 100644 --- a/src/FsAutoComplete/CodeFixes/RedundantQualifier.fs +++ b/src/FsAutoComplete/CodeFixes/RedundantQualifier.fs @@ -16,4 +16,4 @@ let fix = File = codeActionParams.TextDocument Title = "Remove redundant qualifier" SourceDiagnostic = Some diagnostic - Kind = Refactor } ]) + Kind = FixKind.Refactor } ]) diff --git a/src/FsAutoComplete/CodeFixes/RefCellAccessToNot.fs b/src/FsAutoComplete/CodeFixes/RefCellAccessToNot.fs index fa0f86f7f..ca3f885c3 100644 --- a/src/FsAutoComplete/CodeFixes/RefCellAccessToNot.fs +++ b/src/FsAutoComplete/CodeFixes/RefCellAccessToNot.fs @@ -27,7 +27,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile): CodeFix = Edits = [| { Range = fcsRangeToLsp derefRange NewText = "not " } |] - Kind = Fix } ] + Kind = FixKind.Fix } ] | None -> return [] } ) diff --git a/src/FsAutoComplete/CodeFixes/RemoveUnnecessaryReturnOrYield.fs b/src/FsAutoComplete/CodeFixes/RemoveUnnecessaryReturnOrYield.fs index c92f0551e..236b8998f 100644 --- a/src/FsAutoComplete/CodeFixes/RemoveUnnecessaryReturnOrYield.fs +++ b/src/FsAutoComplete/CodeFixes/RemoveUnnecessaryReturnOrYield.fs @@ -45,7 +45,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getLineText: GetLineTe Edits = [| { Range = diagnostic.Range NewText = exprText } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] } ) diff --git a/src/FsAutoComplete/CodeFixes/RemoveUnusedBinding.fs b/src/FsAutoComplete/CodeFixes/RemoveUnusedBinding.fs index fcd9f8911..3a658c6a5 100644 --- a/src/FsAutoComplete/CodeFixes/RemoveUnusedBinding.fs +++ b/src/FsAutoComplete/CodeFixes/RemoveUnusedBinding.fs @@ -64,5 +64,5 @@ let fix (getParseResults: GetParseResultsForFile): CodeFix = Edits = [| { Range = replacementRange; NewText = "" } |] File = codeActionParams.TextDocument SourceDiagnostic = Some diagnostic - Kind = Refactor } ] + Kind = FixKind.Refactor } ] }) diff --git a/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs b/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs index cd6c83d41..ac42e5eaf 100644 --- a/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs +++ b/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs @@ -24,7 +24,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getLineText: GetLineTe { Title = "Use `.Value` instead of dereference operator" File = codeActionParams.TextDocument SourceDiagnostic = None - Kind = Refactor + Kind = FixKind.Refactor Edits = [| { Range = protocolRange NewText = replacementString } |] } ] diff --git a/src/FsAutoComplete/CodeFixes/ResolveNamespace.fs b/src/FsAutoComplete/CodeFixes/ResolveNamespace.fs index 1fd29bfc7..4640f8026 100644 --- a/src/FsAutoComplete/CodeFixes/ResolveNamespace.fs +++ b/src/FsAutoComplete/CodeFixes/ResolveNamespace.fs @@ -53,7 +53,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getNamespaceSuggestion NewText = qual } |] File = file Title = $"Use %s{qual}" - Kind = Fix } + Kind = FixKind.Fix } let openFix (text: ISourceText) file diagnostic (word: string) (ns, name: string, ctx, multiple): Fix = let insertPoint = adjustInsertionPoint text ctx @@ -86,7 +86,7 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getNamespaceSuggestion File = file SourceDiagnostic = Some diagnostic Title = $"open %s{actualOpen}" - Kind = Fix } + Kind = FixKind.Fix } Run.ifDiagnosticByMessage "is not defined" diff --git a/src/FsAutoComplete/CodeFixes/SuggestedIdentifier.fs b/src/FsAutoComplete/CodeFixes/SuggestedIdentifier.fs index d45d0c40b..f7c448d65 100644 --- a/src/FsAutoComplete/CodeFixes/SuggestedIdentifier.fs +++ b/src/FsAutoComplete/CodeFixes/SuggestedIdentifier.fs @@ -27,6 +27,6 @@ let fix = Title = $"Replace with %s{suggestion}" File = codeActionParams.TextDocument SourceDiagnostic = Some diagnostic - Kind = Fix }) + Kind = FixKind.Fix }) |> Array.toList |> AsyncResult.retn) diff --git a/src/FsAutoComplete/CodeFixes/UnusedOpens.fs b/src/FsAutoComplete/CodeFixes/UnusedOpens.fs index 6b833dfdd..09856084f 100644 --- a/src/FsAutoComplete/CodeFixes/UnusedOpens.fs +++ b/src/FsAutoComplete/CodeFixes/UnusedOpens.fs @@ -23,6 +23,6 @@ let fix : CodeFix = File = codeActionParams.TextDocument Title = "Remove unused open" SourceDiagnostic = Some d - Kind = Refactor } + Kind = FixKind.Refactor } AsyncResult.retn [ fix ]) diff --git a/src/FsAutoComplete/CodeFixes/UnusedValue.fs b/src/FsAutoComplete/CodeFixes/UnusedValue.fs index ea14a3d37..aaa52f861 100644 --- a/src/FsAutoComplete/CodeFixes/UnusedValue.fs +++ b/src/FsAutoComplete/CodeFixes/UnusedValue.fs @@ -24,7 +24,7 @@ let fix (getRangeText: GetRangeText) = Edits = [| { Range = diagnostic.Range NewText = "_" } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | None -> let replaceSuggestion = "_" let prefixSuggestion = $"_%s{unusedExpression}" @@ -36,13 +36,13 @@ let fix (getRangeText: GetRangeText) = Edits = [| { Range = diagnostic.Range NewText = replaceSuggestion } |] - Kind = Refactor } + Kind = FixKind.Refactor } { SourceDiagnostic = Some diagnostic File = codeActionParams.TextDocument Title = "Prefix with _" Edits = [| { Range = diagnostic.Range NewText = prefixSuggestion } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | Error _ -> return [] }) diff --git a/src/FsAutoComplete/CodeFixes/UseSafeCastInsteadOfUnsafe.fs b/src/FsAutoComplete/CodeFixes/UseSafeCastInsteadOfUnsafe.fs index 61518ec40..e913b5328 100644 --- a/src/FsAutoComplete/CodeFixes/UseSafeCastInsteadOfUnsafe.fs +++ b/src/FsAutoComplete/CodeFixes/UseSafeCastInsteadOfUnsafe.fs @@ -27,7 +27,7 @@ let fix (getRangeText: GetRangeText): CodeFix = Edits = [| { Range = diagnostic.Range NewText = expressionText.Replace(":?>", ":>") } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | false, true -> AsyncResult.retn [ { File = codeActionParams.TextDocument SourceDiagnostic = Some diagnostic @@ -35,5 +35,5 @@ let fix (getRangeText: GetRangeText): CodeFix = Edits = [| { Range = diagnostic.Range NewText = expressionText.Replace("downcast", "upcast") } |] - Kind = Refactor } ] + Kind = FixKind.Refactor } ] | Error _ -> AsyncResult.retn []) From a3b9e2a1ea3e3fcc79ce35c97b4719ab88fcbfcb Mon Sep 17 00:00:00 2001 From: baronfel Date: Fri, 25 Jun 2021 15:46:18 -0500 Subject: [PATCH 2/4] scaffolding --- src/FsAutoComplete.Core/FileSystem.fs | 2 +- src/FsAutoComplete.Core/Utils.fs | 9 ++++ src/FsAutoComplete/CodeFixes.fs | 10 ++--- .../CodeFixes/AddExplicitTypeToParameter.fs | 14 +++++++ .../CodeFixes/ChangeTypeOfNameToNameOf.fs | 1 - .../CodeFixes/GenerateInterfaceStub.fs | 2 - .../CodeFixes/GenerateRecordStub.fs | 1 - .../CodeFixes/ReplaceBangWithValueFunction.fs | 1 - src/FsAutoComplete/FsAutoComplete.Lsp.fs | 41 +++++++++++++------ 9 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs diff --git a/src/FsAutoComplete.Core/FileSystem.fs b/src/FsAutoComplete.Core/FileSystem.fs index cce8ee840..5347e7156 100644 --- a/src/FsAutoComplete.Core/FileSystem.fs +++ b/src/FsAutoComplete.Core/FileSystem.fs @@ -21,7 +21,7 @@ type SourceTextExtensions = static member GetText(t: ISourceText, m: FSharp.Compiler.Text.Range): Result = let allFileRange = Range.mkRange m.FileName Pos.pos0 (t.GetLastFilePosition()) if not (Range.rangeContainsRange allFileRange m) - then Error "%A{m} is outside of the bounds of the file" + then Error $"%A{m} is outside of the bounds of the file" else if m.StartLine = m.EndLine then // slice of a single line, just do that let lineText = t.GetLineString (m.StartLine - 1) diff --git a/src/FsAutoComplete.Core/Utils.fs b/src/FsAutoComplete.Core/Utils.fs index 0e744ed85..5eafdfe62 100644 --- a/src/FsAutoComplete.Core/Utils.fs +++ b/src/FsAutoComplete.Core/Utils.fs @@ -397,6 +397,15 @@ module Array = | _ when n >= xs.Length || n < 0 -> xs, [||] | _ -> xs.[0..n-1], xs.[n..] + let partitionResults (xs: _ []) = + let oks = ResizeArray(xs.Length) + let errors = ResizeArray(xs.Length) + for x in xs do + match x with + | Ok ok -> oks.Add ok + | Error err -> errors.Add err + oks.ToArray(), errors.ToArray() + module List = ///Returns the greatest of all elements in the list that is less than the threshold diff --git a/src/FsAutoComplete/CodeFixes.fs b/src/FsAutoComplete/CodeFixes.fs index ff809ba12..16beaecdb 100644 --- a/src/FsAutoComplete/CodeFixes.fs +++ b/src/FsAutoComplete/CodeFixes.fs @@ -38,7 +38,7 @@ module Types = SourceDiagnostic: Diagnostic option Kind: FixKind } - type CodeFix = CodeActionParams -> Async + type CodeFix = CodeActionParams -> Async> type CodeAction with static member OfFix getFileVersion clientCapabilities (fix: Fix) = @@ -158,20 +158,16 @@ module Run = open Types let ifEnabled enabled codeFix: CodeFix = - fun codeActionParams -> if enabled () then codeFix codeActionParams else async.Return [] + fun codeActionParams -> if enabled () then codeFix codeActionParams else AsyncResult.retn [] let private runDiagnostics pred handler: CodeFix = - let logger = LogProvider.getLoggerByName "CodeFixes" fun codeActionParams -> codeActionParams.Context.Diagnostics |> Array.choose (fun d -> if pred d then Some d else None) |> Array.toList |> List.traverseAsyncResultM (fun d -> handler d codeActionParams) |> AsyncResult.map List.concat - |> AsyncResult.foldResult id (fun errs -> - logger.warn (Log.setMessage "CodeFix returned an error: {error}" >> Log.addContextDestructured "error" errs) - [] - ) + let ifDiagnosticByMessage (checkMessage: string) handler : CodeFix = runDiagnostics (fun d -> d.Message.Contains checkMessage) handler diff --git a/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs b/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs new file mode 100644 index 000000000..baffa741c --- /dev/null +++ b/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs @@ -0,0 +1,14 @@ +module FsAutoComplete.CodeFix.AddExplicitTypeToParameter + +open FsToolkit.ErrorHandling +open FsAutoComplete.CodeFix.Navigation +open FsAutoComplete.CodeFix.Types +open LanguageServerProtocol.Types +open FsAutoComplete +open FsAutoComplete.LspHelpers + +let fix : CodeFix = + fun codeActionParams -> + asyncResult { + return [] + } diff --git a/src/FsAutoComplete/CodeFixes/ChangeTypeOfNameToNameOf.fs b/src/FsAutoComplete/CodeFixes/ChangeTypeOfNameToNameOf.fs index c4aa5d469..279245f95 100644 --- a/src/FsAutoComplete/CodeFixes/ChangeTypeOfNameToNameOf.fs +++ b/src/FsAutoComplete/CodeFixes/ChangeTypeOfNameToNameOf.fs @@ -50,4 +50,3 @@ let fix (getParseResultsForFile: GetParseResultsForFile): CodeFix = SourceDiagnostic = None Kind = FixKind.Refactor }] } - |> AsyncResult.foldResult id (fun _ -> []) diff --git a/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs b/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs index 66bab6160..59be4a26c 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateInterfaceStub.fs @@ -40,6 +40,4 @@ let fix (getParseResultsForFile: GetParseResultsForFile) NewText = replaced } |] Kind = FixKind.Fix } ] | _ -> return [] - } - |> AsyncResult.foldResult id (fun _ -> []) diff --git a/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs b/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs index 434bd025e..d2130f180 100644 --- a/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs +++ b/src/FsAutoComplete/CodeFixes/GenerateRecordStub.fs @@ -39,4 +39,3 @@ let fix (getParseResultsForFile: GetParseResultsForFile) Kind = FixKind.Fix } ] | _ -> return [] } - |> AsyncResult.foldResult id (fun _ -> []) diff --git a/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs b/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs index ac42e5eaf..13f7f6929 100644 --- a/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs +++ b/src/FsAutoComplete/CodeFixes/ReplaceBangWithValueFunction.fs @@ -29,4 +29,3 @@ let fix (getParseResultsForFile: GetParseResultsForFile) (getLineText: GetLineTe NewText = replacementString } |] } ] } - |> AsyncResult.foldResult id (fun _ -> []) diff --git a/src/FsAutoComplete/FsAutoComplete.Lsp.fs b/src/FsAutoComplete/FsAutoComplete.Lsp.fs index e9f978b5e..33b536b57 100644 --- a/src/FsAutoComplete/FsAutoComplete.Lsp.fs +++ b/src/FsAutoComplete/FsAutoComplete.Lsp.fs @@ -1,6 +1,7 @@ module FsAutoComplete.Lsp open FsAutoComplete +open FsAutoComplete.Utils open FsAutoComplete.CodeFix open FsAutoComplete.CodeFix.Types open FsAutoComplete.Logging @@ -177,7 +178,7 @@ type FSharpLspServer(backgroundServiceEnabled: bool, state: State, lspClient: FS let mutable config = FSharpConfig.Default let mutable rootPath : string option = None - let mutable codeFixes = fun p -> [||] + let mutable codeFixes: CodeFix [] = [||] let mutable sigHelpKind = None let parseFile (p: DidChangeTextDocumentParams) = @@ -607,7 +608,7 @@ type FSharpLspServer(backgroundServiceEnabled: bool, state: State, lspClient: FS let getAbstractClassStubReplacements () = abstractClassStubReplacements () - codeFixes <- fun p -> + codeFixes <- [| Run.ifEnabled (fun _ -> config.UnusedOpensAnalyzer) UnusedOpens.fix Run.ifEnabled (fun _ -> config.ResolveNamespaces) (ResolveNamespace.fix tryGetParseResultsForFile commands.GetNamespaceSuggestions) @@ -647,11 +648,8 @@ type FSharpLspServer(backgroundServiceEnabled: bool, state: State, lspClient: FS AddTypeToIndeterminateValue.fix tryGetParseResultsForFile tryGetProjectOptions ChangeTypeOfNameToNameOf.fix tryGetParseResultsForFile AddMissingInstanceMember.fix + AddExplicitTypeToParameter.fix |] - |> Array.map (fun fixer -> async { - let! fixes = fixer p - return List.map (CodeAction.OfFix commands.TryGetFileVersion clientCapabilities.Value) fixes - }) match p.RootPath, c.AutomaticWorkspaceInit with @@ -1225,14 +1223,33 @@ type FSharpLspServer(backgroundServiceEnabled: bool, state: State, lspClient: FS | ResultOrString.Error s -> AsyncLspResult.internalError s | ResultOrString.Ok (opts, lines) -> - async { - let! actions = - Async.Parallel (codeFixes codeActionParams) - |> Async.map (List.concat >> Array.ofList) + asyncResult { + let (fixes: Async []>) = + codeFixes + |> Array.map (fun codeFix -> codeFix codeActionParams) + |> Async.Parallel + + let! fixes = fixes + let (actions: Fix list [] , errors: string []) = Array.partitionResults fixes + let actions = actions |> List.concat + if errors.Length <> 0 then + logger.warn ( + Log.setMessage "Errors while processing code action request for {file} with {context} at {range}: {errors}" + >> Log.addContextDestructured "file" codeActionParams.TextDocument.Uri + >> Log.addContextDestructured "context" codeActionParams.Context + >> Log.addContextDestructured "range" codeActionParams.Range + >> Log.addContextDestructured "errors" errors + ) + match actions with - | [||] -> return success None + | [] -> + return None | actions -> - return actions |> TextDocumentCodeActionResult.CodeActions |> Some |> success + return + actions + |> List.map (CodeAction.OfFix commands.TryGetFileVersion clientCapabilities.Value) + |> List.toArray + |> TextDocumentCodeActionResult.CodeActions |> Some } override __.TextDocumentCodeLens(p) = async { From b3ff818da6e583db762ed663070af616b723dc64 Mon Sep 17 00:00:00 2001 From: baronfel Date: Fri, 25 Jun 2021 16:38:01 -0500 Subject: [PATCH 3/4] add refactoring to add an explicit type parameter to a function parameter --- src/FsAutoComplete.Core/FCSPatches.fs | 51 ++++++++++++++++ .../CodeFixes/AddExplicitTypeToParameter.fs | 56 ++++++++++++++++- src/FsAutoComplete/FsAutoComplete.Lsp.fs | 2 +- test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs | 61 +++++++++++++++---- .../ExplicitTypeAnnotations/Script.fsx | 5 ++ 5 files changed, 161 insertions(+), 14 deletions(-) create mode 100644 test/FsAutoComplete.Tests.Lsp/TestCases/ExplicitTypeAnnotations/Script.fsx diff --git a/src/FsAutoComplete.Core/FCSPatches.fs b/src/FsAutoComplete.Core/FCSPatches.fs index 0e183297b..04f47ef00 100644 --- a/src/FsAutoComplete.Core/FCSPatches.fs +++ b/src/FsAutoComplete.Core/FCSPatches.fs @@ -331,6 +331,57 @@ type FSharpParseFileResults with None | _ -> defaultTraverse expr }) ) + + member scope.IsTypeAnnotationGivenAtPositionPatched pos = + match scope.ParseTree with + | Some input -> + let result = + AstTraversal.Traverse(pos, input, { new AstTraversal.AstVisitorBase<_>() with + member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = + match expr with + | SynExpr.Typed (_expr, _typeExpr, range) when Pos.posEq range.Start pos -> + Some range + | _ -> defaultTraverse expr + + override _.VisitSimplePats(pats) = + match pats with + | [] -> None + | _ -> + let exprFunc pat = + match pat with + | SynSimplePat.Typed (_pat, _targetExpr, range) when Pos.posEq range.Start pos -> + Some range + | _ -> + None + + pats |> List.tryPick exprFunc + + override _.VisitPat(defaultTraverse, pat) = + match pat with + | SynPat.Typed (_pat, _targetType, range) when Pos.posEq range.Start pos -> + Some range + | _ -> defaultTraverse pat }) + result.IsSome + | None -> false + + member scope.IsBindingALambdaAtPositionPatched pos = + match scope.ParseTree with + | Some input -> + let result = + AstTraversal.Traverse(pos, input, { new AstTraversal.AstVisitorBase<_>() with + member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = + defaultTraverse expr + + override _.VisitBinding(defaultTraverse, binding) = + match binding with + | SynBinding.Binding(_, _, _, _, _, _, _, _, _, expr, range, _) when Pos.posEq range.Start pos -> + match expr with + | SynExpr.Lambda _ -> Some range + | _ -> None + | _ -> defaultTraverse binding }) + result.IsSome + | None -> false + module SyntaxTreeOps = open FSharp.Compiler.SyntaxTree let rec synExprContainsError inpExpr = diff --git a/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs b/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs index baffa741c..fe7461c12 100644 --- a/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs +++ b/src/FsAutoComplete/CodeFixes/AddExplicitTypeToParameter.fs @@ -6,9 +6,61 @@ open FsAutoComplete.CodeFix.Types open LanguageServerProtocol.Types open FsAutoComplete open FsAutoComplete.LspHelpers +open FSharp.Compiler.SourceCodeServices +open FsAutoComplete.FCSPatches -let fix : CodeFix = +let fix (getParseResultsForFile: GetParseResultsForFile): CodeFix = fun codeActionParams -> asyncResult { - return [] + let filePath = codeActionParams.TextDocument.GetFilePath() |> Utils.normalizePath + let fcsStartPos = protocolPosToPos codeActionParams.Range.Start + let! (parseAndCheck, lineStr, sourceText) = getParseResultsForFile filePath fcsStartPos + let parseFileResults = parseAndCheck.GetParseResults + let! (rightCol, idents) = + Lexer.findLongIdents(fcsStartPos.Column, lineStr) + |> Result.ofOption (fun _ -> $"Couldn't find long ident at %A{fcsStartPos} in file %s{codeActionParams.TextDocument.GetFilePath()}") + let! symbolUse = + parseAndCheck.GetCheckResults.GetSymbolUseAtLocation(fcsStartPos.Line, rightCol, lineStr, List.ofArray idents) + |> Result.ofOption (fun _ -> $"Couldn't find symbolUse at %A{(fcsStartPos.Line, rightCol)} in file %s{codeActionParams.TextDocument.GetFilePath()}") + + let isValidParameterWithoutTypeAnnotation (funcOrValue: FSharpMemberOrFunctionOrValue) (symbolUse: FSharpSymbolUse) = + // TODO: remove patched functions and uncomment this boolean check after FCS 40 update + let isLambdaIfFunction = + // funcOrValue.IsFunction && + parseFileResults.IsBindingALambdaAtPositionPatched symbolUse.RangeAlternate.Start + + (funcOrValue.IsValue || isLambdaIfFunction) && + parseFileResults.IsPositionContainedInACurriedParameter symbolUse.RangeAlternate.Start && + not (parseFileResults.IsTypeAnnotationGivenAtPositionPatched symbolUse.RangeAlternate.Start) && + not funcOrValue.IsMember && + not funcOrValue.IsMemberThisValue && + not funcOrValue.IsConstructorThisValue && + not (PrettyNaming.IsOperatorName funcOrValue.DisplayName) + + match symbolUse.Symbol with + | :? FSharpMemberOrFunctionOrValue as v when isValidParameterWithoutTypeAnnotation v symbolUse -> + let typeString = v.FullType.Format symbolUse.DisplayContext + let title = "Add explicit type annotation" + let fcsSymbolRange = symbolUse.RangeAlternate + let protocolSymbolRange = fcsRangeToLsp fcsSymbolRange + let! symbolText = sourceText.GetText(fcsSymbolRange) + + let alreadyWrappedInParens = + let hasLeftParen = Navigation.walkBackUntilConditionWithTerminal sourceText protocolSymbolRange.Start (fun c -> c = '(') System.Char.IsWhiteSpace + let hasRightParen = Navigation.walkForwardUntilConditionWithTerminal sourceText protocolSymbolRange.End (fun c -> c = ')') System.Char.IsWhiteSpace + hasLeftParen.IsSome && hasRightParen.IsSome + + let changedText, changedRange = + if alreadyWrappedInParens + then ": " + typeString, { Start = protocolSymbolRange.End; End = protocolSymbolRange.End } + else "(" + symbolText + ": " + typeString + ")", protocolSymbolRange + return [ { + Edits = [| { Range = changedRange; NewText = changedText } |] + File = codeActionParams.TextDocument + Title = title + SourceDiagnostic = None + Kind = FixKind.Refactor + } ] + | _ -> + return [] } diff --git a/src/FsAutoComplete/FsAutoComplete.Lsp.fs b/src/FsAutoComplete/FsAutoComplete.Lsp.fs index 33b536b57..553be3ade 100644 --- a/src/FsAutoComplete/FsAutoComplete.Lsp.fs +++ b/src/FsAutoComplete/FsAutoComplete.Lsp.fs @@ -648,7 +648,7 @@ type FSharpLspServer(backgroundServiceEnabled: bool, state: State, lspClient: FS AddTypeToIndeterminateValue.fix tryGetParseResultsForFile tryGetProjectOptions ChangeTypeOfNameToNameOf.fix tryGetParseResultsForFile AddMissingInstanceMember.fix - AddExplicitTypeToParameter.fix + AddExplicitTypeToParameter.fix tryGetParseResultsForFile |] diff --git a/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs b/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs index 2b1fff7d0..f842bc224 100644 --- a/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs +++ b/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs @@ -6,6 +6,17 @@ open Helpers open LanguageServerProtocol.Types open FsAutoComplete.Utils +let (|Refactor|_|) title newText action = + match action with + | { Title = title' + Kind = Some "refactor" + Edit = { DocumentChanges = Some [| + { Edits = [| { NewText = newText' } |] } + |] } + } + when title' = title && newText' = newText -> Some () + | _ -> None + let abstractClassGenerationTests state = let server = async { @@ -206,17 +217,6 @@ let missingInstanceMemberTests state = ] let unusedValueTests state = - let (|Refactor|_|) title newText action = - match action with - | { Title = title' - Kind = Some "refactor" - Edit = { DocumentChanges = Some [| - { Edits = [| { NewText = newText' } |] } - |] } - } - when title' = title && newText' = newText -> Some () - | _ -> None - let (|ActReplace|_|) = (|Refactor|_|) "Replace with _" "_" let (|ActPrefix|_|) oldText = (|Refactor|_|) "Prefix with _" $"_{oldText}" @@ -307,6 +307,44 @@ let unusedValueTests state = canReplaceUnusedParameter ] +let addExplicitTypeAnnotationTests state = + let server = + async { + let path = Path.Combine(__SOURCE_DIRECTORY__, "TestCases", "ExplicitTypeAnnotations") + let cfg = defaultConfigDto + let! (server, events) = serverInitialize path cfg state + do! waitForWorkspaceFinishedParsing events + let path = Path.Combine(path, "Script.fsx") + let tdop : DidOpenTextDocumentParams = { TextDocument = loadDocument path } + do! server.TextDocumentDidOpen tdop + do! + events + |> waitForParseResultsForFile "Script.fsx" + |> AsyncResult.bimap id (fun _ -> failtest "Should not have had errors") + return (server, path) + } + |> Async.Cache + + let (|ExplicitAnnotation|_|) = (|Refactor|_|) "Add explicit type annotation" + + testList "explicit type annotations" [ + testCaseAsync "can suggest explicit parameter for record-typed function parameters" (async { + let! (server, filePath) = server + let context : CodeActionParams = { + Context = { Diagnostics = [||] } + Range = { Start = { Line = 3; Character = 9 } + End = { Line = 3; Character = 9 } } + TextDocument = { Uri = Path.FilePathToUri filePath } + } + match! server.TextDocumentCodeAction context with + | Ok (Some (TextDocumentCodeActionResult.CodeActions [| ExplicitAnnotation "(f: Foo)" |])) -> () + | Ok other -> + failtestf $"Should have generated explicit type annotation, but instead generated %A{other}" + | Error reason -> + failtestf $"Should have succeeded, but failed with %A{reason}" + }) + ] + let tests state = testList "codefix tests" [ abstractClassGenerationTests state generateMatchTests state @@ -315,4 +353,5 @@ let tests state = testList "codefix tests" [ nameofInsteadOfTypeofNameTests state missingInstanceMemberTests state unusedValueTests state + addExplicitTypeAnnotationTests state ] diff --git a/test/FsAutoComplete.Tests.Lsp/TestCases/ExplicitTypeAnnotations/Script.fsx b/test/FsAutoComplete.Tests.Lsp/TestCases/ExplicitTypeAnnotations/Script.fsx new file mode 100644 index 000000000..07aeff1af --- /dev/null +++ b/test/FsAutoComplete.Tests.Lsp/TestCases/ExplicitTypeAnnotations/Script.fsx @@ -0,0 +1,5 @@ +type Foo = + { name: string } + +let name f = + f.name From 2f5005d6197f99b2865a8ab455e932949f746842 Mon Sep 17 00:00:00 2001 From: baronfel Date: Fri, 25 Jun 2021 16:53:08 -0500 Subject: [PATCH 4/4] alter tests for new codefix pollution --- test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs b/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs index f842bc224..1458b176a 100644 --- a/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs +++ b/test/FsAutoComplete.Tests.Lsp/CodeFixTests.fs @@ -294,7 +294,7 @@ let unusedValueTests state = Context = { Diagnostics = [| diagnostic |] } } match! server.TextDocumentCodeAction detected with - | Ok (Some (TextDocumentCodeActionResult.CodeActions [| ActReplace; ActPrefix "three" |])) -> () + | Ok (Some (TextDocumentCodeActionResult.CodeActions [| ActReplace; ActPrefix "three"; _ (* explicit type annotation codefix *) |])) -> () | Ok other -> failtestf $"Should have generated _, but instead generated %A{other}" | Error reason ->