diff --git a/vsintegration/src/FSharp.Editor/CodeFix/CodeFixHelpers.fs b/vsintegration/src/FSharp.Editor/CodeFix/CodeFixHelpers.fs index 37b05589e9c..643b48a30e2 100644 --- a/vsintegration/src/FSharp.Editor/CodeFix/CodeFixHelpers.fs +++ b/vsintegration/src/FSharp.Editor/CodeFix/CodeFixHelpers.fs @@ -7,10 +7,25 @@ open System.Threading open Microsoft.CodeAnalysis.Text open Microsoft.CodeAnalysis.CodeFixes open Microsoft.CodeAnalysis.CodeActions +open Microsoft.VisualStudio.FSharp.Editor.Telemetry [] module internal CodeFixHelpers = let createTextChangeCodeFix (title: string, context: CodeFixContext, computeTextChanges: unit -> Async) = + let props: (string * obj) list = + [ + "title", title + + // The following can help building a unique but anonymized codefix target: + // #projectid#documentid#span + // Then we can check if the codefix was actually activated after its creation. + "context.document.project.id", context.Document.Project.Id.Id.ToString() + "context.document.id", context.Document.Id.Id.ToString() + "context.span", context.Span.ToString() + ] + + TelemetryReporter.reportEvent "codefixregistered" props + CodeAction.Create( title, (fun (cancellationToken: CancellationToken) -> @@ -20,7 +35,12 @@ module internal CodeFixHelpers = match changesOpt with | None -> return context.Document - | Some textChanges -> return context.Document.WithText(sourceText.WithChanges(textChanges)) + | Some textChanges -> + // Note: "activated" doesn't mean "applied". + // It's one step prior to that: + // e.g. when one clicks (Ctrl + .) and looks at the potential change. + TelemetryReporter.reportEvent "codefixactivated" props + return context.Document.WithText(sourceText.WithChanges(textChanges)) } |> RoslynHelpers.StartAsyncAsTask(cancellationToken)), title diff --git a/vsintegration/src/FSharp.Editor/Telemetry/TelemetryReporter.fs b/vsintegration/src/FSharp.Editor/Telemetry/TelemetryReporter.fs index d8228092ae6..1cfe1c42d6f 100644 --- a/vsintegration/src/FSharp.Editor/Telemetry/TelemetryReporter.fs +++ b/vsintegration/src/FSharp.Editor/Telemetry/TelemetryReporter.fs @@ -6,13 +6,13 @@ open Microsoft.VisualStudio.Telemetry module TelemetryReporter = - let eventPrefix = "dotnet/fsharp/" - let propPrefix = "dotnet.fsharp." + let private eventPrefix = "dotnet/fsharp/" + let private propPrefix = "dotnet.fsharp." - let getFullEventName name = eventPrefix + name - let getFullPropName name = propPrefix + name + let private getFullEventName name = eventPrefix + name + let private getFullPropName name = propPrefix + name - let createEvent name (props: (string * obj) list) = + let private createEvent name (props: (string * obj) list) = let event = TelemetryEvent(getFullEventName name) props