From 3cccf35c394ff11b7543cbc8bccfa296a8b16e41 Mon Sep 17 00:00:00 2001 From: 0101 <0101@innit.cz> Date: Tue, 14 Mar 2023 16:23:57 +0100 Subject: [PATCH] Preview features telemetry --- .../LanguageService/LanguageService.fs | 24 +++++++++++++++++-- .../LanguageService/SymbolHelpers.fs | 20 ++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index 74809b4acf4..8d4819b68ff 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -105,8 +105,6 @@ type internal FSharpWorkspaceServiceFactory | _ -> let checker = lazy - TelemetryReporter.reportEvent "languageservicestarted" [] - let editorOptions = let editorOptions = workspace.Services.GetService() @@ -128,6 +126,18 @@ type internal FSharpWorkspaceServiceFactory let useSyntaxTreeCache = getOption (fun options -> options.LanguageServicePerformance.UseSyntaxTreeCache) LanguageServicePerformanceOptions.Default.UseSyntaxTreeCache + let enableInMemoryCrossProjectReferences = + getOption (fun options -> options.LanguageServicePerformance.EnableInMemoryCrossProjectReferences) false + + let enableFastFindReferences = + getOption (fun options -> options.LanguageServicePerformance.EnableFastFindReferences) false + + let isInlineParameterNameHintsEnabled = + getOption (fun options -> options.Advanced.IsInlineParameterNameHintsEnabled) false + + let isInlineTypeHintsEnabled = + getOption (fun options -> options.Advanced.IsInlineTypeHintsEnabled) false + let checker = FSharpChecker.Create( projectCacheSize = 5000, // We do not care how big the cache is. VS will actually tell FCS to clear caches, so this is fine. @@ -142,6 +152,16 @@ type internal FSharpWorkspaceServiceFactory documentSource = (if enableLiveBuffers then DocumentSource.Custom getSource else DocumentSource.FileSystem), useSyntaxTreeCache = useSyntaxTreeCache) + TelemetryReporter.reportEvent "languageservicestarted" [ + nameof enableLiveBuffers, enableLiveBuffers + nameof useSyntaxTreeCache, useSyntaxTreeCache + nameof enableParallelReferenceResolution, enableParallelReferenceResolution + nameof enableInMemoryCrossProjectReferences, enableInMemoryCrossProjectReferences + nameof enableFastFindReferences, enableFastFindReferences + nameof isInlineParameterNameHintsEnabled, isInlineParameterNameHintsEnabled + nameof isInlineTypeHintsEnabled, isInlineTypeHintsEnabled + ] + if enableLiveBuffers then workspace.WorkspaceChanged.Add(fun args -> if args.DocumentId <> null then diff --git a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs index f9202636eea..e01f9e1bc83 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/SymbolHelpers.fs @@ -14,7 +14,8 @@ open Microsoft.CodeAnalysis.Text open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Symbols open FSharp.Compiler.Text -open Microsoft.VisualStudio.FSharp.Editor.Symbols +open Microsoft.VisualStudio.FSharp.Editor.Symbols +open Microsoft.VisualStudio.FSharp.Editor.Telemetry module internal SymbolHelpers = /// Used for local code fixes in a document, e.g. to rename local parameters @@ -37,10 +38,19 @@ module internal SymbolHelpers = } let getSymbolUsesInProjects (symbol: FSharpSymbol, projects: Project list, onFound: Document -> TextSpan -> range -> Async, ct: CancellationToken) = - projects - |> Seq.map (fun project -> - Task.Run(fun () -> project.FindFSharpReferencesAsync(symbol, onFound, "getSymbolUsesInProjects", ct))) - |> Task.WhenAll + match projects with + | [] -> Task.CompletedTask + | firstProject::_ -> + let isFastFindReferencesEnabled = firstProject.IsFastFindReferencesEnabled + let props = [ nameof isFastFindReferencesEnabled, isFastFindReferencesEnabled :> obj ] + backgroundTask { + TelemetryReporter.reportEvent "getSymbolUsesInProjectsStarted" props + do! projects + |> Seq.map (fun project -> + Task.Run(fun () -> project.FindFSharpReferencesAsync(symbol, onFound, "getSymbolUsesInProjects", ct))) + |> Task.WhenAll + TelemetryReporter.reportEvent "getSymbolUsesInProjectsFinished" props + } let getSymbolUsesInSolution (symbol: FSharpSymbol, declLoc: SymbolDeclarationLocation, checkFileResults: FSharpCheckFileResults, solution: Solution, ct: CancellationToken) = async {