Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extra telemetry for codefixes #15035

Merged
merged 1 commit into from
Apr 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "AddInstanceMemberParameter"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.AddInstanceMemberParameter); Shared>]
type internal FSharpAddInstanceMemberParameterCodeFixProvider() =
inherit CodeFixProvider()

Expand All @@ -27,6 +27,7 @@ type internal FSharpAddInstanceMemberParameterCodeFixProvider() =

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.AddInstanceMemberParameter,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(context.Span.Start, 0), "x.") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ open System
open System.Composition
open System.Threading.Tasks

open Microsoft.VisualStudio.FSharp.Editor.Logging

open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "AddMissingEqualsToTypeDefinition"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.AddMissingEqualsToTypeDefinition); Shared>]
type internal FSharpAddMissingEqualsToTypeDefinitionCodeFixProvider() =
inherit CodeFixProvider()

Expand Down Expand Up @@ -43,6 +41,7 @@ type internal FSharpAddMissingEqualsToTypeDefinitionCodeFixProvider() =

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.AddMissingEqualsToTypeDefinition,
title,
context,
// 'pos + 1' is here because 'pos' is now the position of the first non-whitespace character.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ open Microsoft.CodeAnalysis.CodeFixes
open FSharp.Compiler
open FSharp.Compiler.CodeAnalysis

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "AddMissingFunKeyword"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.AddMissingFunKeyword); Shared>]
type internal FSharpAddMissingFunKeywordCodeFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -65,6 +65,7 @@ type internal FSharpAddMissingFunKeywordCodeFixProvider [<ImportingConstructor>]

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.AddMissingFunKeyword,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(intendedArgSpan.Start, 0), "fun ") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "AddNewKeyword"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.AddNewKeyword); Shared>]
type internal FSharpAddNewKeywordCodeFixProvider() =
inherit CodeFixProvider()

Expand All @@ -27,6 +27,7 @@ type internal FSharpAddNewKeywordCodeFixProvider() =

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.AddNewKeyword,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(context.Span.Start, 0), "new ") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ open FSharp.Compiler.CodeAnalysis
open FSharp.Compiler.EditorServices
open FSharp.Compiler.Text

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "AddOpen"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.AddOpen); Shared>]
type internal FSharpAddOpenCodeFixProvider [<ImportingConstructor>] (assemblyContentProvider: AssemblyContentProvider) =
inherit CodeFixProvider()

Expand All @@ -27,6 +27,7 @@ type internal FSharpAddOpenCodeFixProvider [<ImportingConstructor>] (assemblyCon

let qualifySymbolFix (context: CodeFixContext) (fullName, qualifier) =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.AddOpen,
fixUnderscoresInMenuText fullName,
context,
(fun () -> asyncMaybe.Return [| TextChange(context.Span, qualifier) |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ChangePrefixNegationToInfixSubtraction"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ChangePrefixNegationToInfixSubtraction); Shared>]
type internal FSharpChangePrefixNegationToInfixSubtractionodeFixProvider() =
inherit CodeFixProvider()

Expand Down Expand Up @@ -44,6 +44,7 @@ type internal FSharpChangePrefixNegationToInfixSubtractionodeFixProvider() =

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ChangePrefixNegationToInfixSubtraction,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(pos, 1), "- ") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ChangeRefCellDerefToNotExpression"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ChangeRefCellDerefToNotExpression); Shared>]
type internal FSharpChangeRefCellDerefToNotExpressionCodeFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -40,7 +40,12 @@ type internal FSharpChangeRefCellDerefToNotExpressionCodeFixProvider [<Importing
|> Seq.toImmutableArray

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (title, context, (fun () -> asyncMaybe.Return [| TextChange(derefSpan, "not ") |]))
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ChangeRefCellDerefToNotExpression,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(derefSpan, "not ") |])
)

context.RegisterCodeFix(codeFix, diagnostics)
}
Expand Down
3 changes: 2 additions & 1 deletion vsintegration/src/FSharp.Editor/CodeFix/ChangeToUpcast.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ChangeToUpcast"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ChangeToUpcast); Shared>]
type internal FSharpChangeToUpcastCodeFixProvider() =
inherit CodeFixProvider()

Expand Down Expand Up @@ -50,6 +50,7 @@ type internal FSharpChangeToUpcastCodeFixProvider() =

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ChangeToUpcast,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(context.Span, replacement) |])
Expand Down
19 changes: 16 additions & 3 deletions vsintegration/src/FSharp.Editor/CodeFix/CodeFixHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,22 @@ open Microsoft.VisualStudio.FSharp.Editor.Telemetry

[<RequireQualifiedAccess>]
module internal CodeFixHelpers =
let createTextChangeCodeFix (title: string, context: CodeFixContext, computeTextChanges: unit -> Async<TextChange[] option>) =
let createTextChangeCodeFix
(
name: string,
title: string,
context: CodeFixContext,
computeTextChanges: unit -> Async<TextChange[] option>
) =

// I don't understand how we can get anything but a single diagnostic here - as we get a single "title" here.
// But since we don't have proper testing yet, keeping it like this to verify this theory in telemetry.
let ids = context.Diagnostics |> Seq.map (fun d -> d.Id) |> String.concat ","

let props: (string * obj) list =
[
"name", name
"ids", ids
"title", title

// The following can help building a unique but anonymized codefix target:
Expand Down Expand Up @@ -53,8 +66,8 @@ module internal CodeFixExtensions =
member this.GetPrunedDiagnostics(context: CodeFixContext) =
context.Diagnostics.RemoveAll(fun x -> this.FixableDiagnosticIds.Contains(x.Id) |> not)

member this.RegisterFix(context: CodeFixContext, fixName, fixChange) =
member this.RegisterFix(name, title, context: CodeFixContext, fixChange) =
let replaceCodeFix =
CodeFixHelpers.createTextChangeCodeFix (fixName, context, (fun () -> asyncMaybe.Return [| fixChange |]))
CodeFixHelpers.createTextChangeCodeFix (name, title, context, (fun () -> asyncMaybe.Return [| fixChange |]))

context.RegisterCodeFix(replaceCodeFix, this.GetPrunedDiagnostics(context))
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ open System.Composition
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ConvertCSharpLambdaToFSharpLambda"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ConvertCSharpLambdaToFSharpLambda); Shared>]
type internal FSharpConvertCSharpLambdaToFSharpLambdaCodeFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -46,7 +46,12 @@ type internal FSharpConvertCSharpLambdaToFSharpLambdaCodeFixProvider [<Importing
let title = SR.UseFSharpLambda()

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (title, context, (fun () -> asyncMaybe.Return [| replacement |]))
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ConvertCSharpLambdaToFSharpLambda,
title,
context,
(fun () -> asyncMaybe.Return [| replacement |])
)

context.RegisterCodeFix(codeFix, diagnostics)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ open Microsoft.CodeAnalysis
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ConvertCSharpUsingToFSharpOpen"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ConvertCSharpUsingToFSharpOpen); Shared>]
type internal FSharpConvertCSharpUsingToFSharpOpen [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -47,7 +47,12 @@ type internal FSharpConvertCSharpUsingToFSharpOpen [<ImportingConstructor>] () =
let title = SR.ConvertCSharpUsingToFSharpOpen()

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (title, context, (fun () -> asyncMaybe.Return [| replacement |]))
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ConvertCSharpUsingToFSharpOpen,
title,
context,
(fun () -> asyncMaybe.Return [| replacement |])
)

context.RegisterCodeFix(codeFix, diagnostics)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ConvertToNotEqualsEqualityExpression"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ConvertToNotEqualsEqualityExpression); Shared>]
type internal FSharpConvertToNotEqualsEqualityExpressionCodeFixProvider() =
inherit CodeFixProvider()

Expand All @@ -33,7 +33,12 @@ type internal FSharpConvertToNotEqualsEqualityExpressionCodeFixProvider() =
|> Seq.toImmutableArray

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (title, context, (fun () -> asyncMaybe.Return [| TextChange(context.Span, "<>") |]))
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ConvertToNotEqualsEqualityExpression,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(context.Span, "<>") |])
)

context.RegisterCodeFix(codeFix, diagnostics)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ConvertToSingleEqualsEqualityExpression"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.ConvertToSingleEqualsEqualityExpression); Shared>]
type internal FSharpConvertToSingleEqualsEqualityExpressionCodeFixProvider() =
inherit CodeFixProvider()

Expand All @@ -33,7 +33,12 @@ type internal FSharpConvertToSingleEqualsEqualityExpressionCodeFixProvider() =
|> Seq.toImmutableArray

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (title, context, (fun () -> asyncMaybe.Return [| TextChange(context.Span, "=") |]))
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.ConvertToSingleEqualsEqualityExpression,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(context.Span, "=") |])
)

context.RegisterCodeFix(codeFix, diagnostics)
}
Expand Down
9 changes: 5 additions & 4 deletions vsintegration/src/FSharp.Editor/CodeFix/FixIndexerAccess.fs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes
open FSharp.Compiler.Diagnostics

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "FixIndexerAccess"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.FixIndexerAccess); Shared>]
type internal LegacyFsharpFixAddDotToIndexerAccess() =
inherit CodeFixProvider()
let fixableDiagnosticIds = set [ "FS3217" ]
Expand Down Expand Up @@ -49,6 +49,7 @@ type internal LegacyFsharpFixAddDotToIndexerAccess() =

let codefix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.FixIndexerAccess,
CompilerDiagnostics.GetErrorMessage FSharpDiagnosticKind.AddIndexerDot,
context,
(fun () -> asyncMaybe.Return [| TextChange(span, replacement.TrimEnd() + ".") |])
Expand All @@ -58,12 +59,12 @@ type internal LegacyFsharpFixAddDotToIndexerAccess() =
}
|> RoslynHelpers.StartAsyncUnitAsTask(context.CancellationToken)

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "RemoveIndexerDotBeforeBracket"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.RemoveIndexerDotBeforeBracket); Shared>]
type internal FsharpFixRemoveDotFromIndexerAccessOptIn() as this =
inherit CodeFixProvider()
let fixableDiagnosticIds = set [ "FS3366" ]

static let fixName =
static let title =
CompilerDiagnostics.GetErrorMessage FSharpDiagnosticKind.RemoveIndexerDot

override _.FixableDiagnosticIds = Seq.toImmutableArray fixableDiagnosticIds
Expand All @@ -73,5 +74,5 @@ type internal FsharpFixRemoveDotFromIndexerAccessOptIn() as this =
let relevantDiagnostics = this.GetPrunedDiagnostics(context)

if not relevantDiagnostics.IsEmpty then
this.RegisterFix(context, fixName, TextChange(context.Span, ""))
this.RegisterFix(CodeFix.RemoveIndexerDotBeforeBracket, title, context, TextChange(context.Span, ""))
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,15 @@
namespace Microsoft.VisualStudio.FSharp.Editor

open System.Composition
open System.Threading
open System.Threading.Tasks

open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

open FSharp.Compiler
open FSharp.Compiler.CodeAnalysis
open FSharp.Compiler.EditorServices
open FSharp.Compiler.Text

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "MakeDeclarationMutable"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.MakeDeclarationMutable); Shared>]
type internal FSharpMakeDeclarationMutableFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -73,6 +70,7 @@ type internal FSharpMakeDeclarationMutableFixProvider [<ImportingConstructor>] (

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.MakeDeclarationMutable,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(span.Start, 0), "mutable ") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ open System.Composition
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "MakeOuterBindingRecursive"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.MakeOuterBindingRecursive); Shared>]
type internal FSharpMakeOuterBindingRecursiveCodeFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -50,6 +50,7 @@ type internal FSharpMakeOuterBindingRecursiveCodeFixProvider [<ImportingConstruc

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.MakeOuterBindingRecursive,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(TextSpan(outerBindingNameSpan.Start, 0), "rec ") |])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ open System.Composition
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.CodeFixes

[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "RemoveReturnOrYield"); Shared>]
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.RemoveReturnOrYield); Shared>]
type internal FSharpRemoveReturnOrYieldCodeFixProvider [<ImportingConstructor>] () =
inherit CodeFixProvider()

Expand Down Expand Up @@ -44,6 +44,7 @@ type internal FSharpRemoveReturnOrYieldCodeFixProvider [<ImportingConstructor>]

let codeFix =
CodeFixHelpers.createTextChangeCodeFix (
CodeFix.RemoveReturnOrYield,
title,
context,
(fun () -> asyncMaybe.Return [| TextChange(context.Span, sourceText.GetSubText(exprSpan).ToString()) |])
Expand Down
Loading