From c5343ce6180be6ff9303d6230eb5df5e8e36a91a Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Thu, 13 Apr 2023 18:51:13 +0200 Subject: [PATCH 1/3] Changing concurrency strategy for name simplification --- .../Diagnostics/SimplifyNameDiagnosticAnalyzer.fs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs index 45338d66262..123a44d8ca8 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs @@ -25,24 +25,22 @@ type internal SimplifyNameDiagnosticAnalyzer [] () = static let userOpName = "SimplifyNameDiagnosticAnalyzer" static let cache = new MemoryCache("FSharp.Editor." + userOpName) - // Make sure only one document is being analyzed at a time, to be nice - static let guard = new SemaphoreSlim(1) + // Make sure only a few documents is being analyzed at a time, to be nice + static let guard = new SemaphoreSlim(3) static member LongIdentPropertyKey = "FullName" interface IFSharpSimplifyNameDiagnosticAnalyzer with member _.AnalyzeSemanticsAsync(descriptor, document: Document, cancellationToken: CancellationToken) = - if document.Project.IsFSharpMiscellaneousOrMetadata && not document.IsFSharpScript then - Tasks.Task.FromResult(ImmutableArray.Empty) - else asyncMaybe { do! Option.guard document.Project.IsFSharpCodeFixesSimplifyNameEnabled do Trace.TraceInformation("{0:n3} (start) SimplifyName", DateTime.Now.TimeOfDay.TotalSeconds) let! textVersion = document.GetTextVersionAsync(cancellationToken) let textVersionHash = textVersion.GetHashCode() - let! _ = guard.WaitAsync(cancellationToken) |> Async.AwaitTask |> liftAsync + let! lockObtained = guard.WaitAsync(TimeSpan.FromSeconds 10. ,cancellationToken) |> Async.AwaitTask |> liftAsync + do! Option.guard lockObtained try let key = document.Id.ToString() From acdc11c2b7b81fbab31ffd709e4933f0b3a6de0f Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Thu, 13 Apr 2023 18:57:34 +0200 Subject: [PATCH 2/3] Using DefaultTuning.PerDocumentSavedDataSlidingWindow as default timeout --- .../Diagnostics/SimplifyNameDiagnosticAnalyzer.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs index 123a44d8ca8..36206cdfef3 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs @@ -25,7 +25,7 @@ type internal SimplifyNameDiagnosticAnalyzer [] () = static let userOpName = "SimplifyNameDiagnosticAnalyzer" static let cache = new MemoryCache("FSharp.Editor." + userOpName) - // Make sure only a few documents is being analyzed at a time, to be nice + // Make sure only a few documents are being analyzed at a time, to be nice static let guard = new SemaphoreSlim(3) static member LongIdentPropertyKey = "FullName" @@ -39,7 +39,7 @@ type internal SimplifyNameDiagnosticAnalyzer [] () = do Trace.TraceInformation("{0:n3} (start) SimplifyName", DateTime.Now.TimeOfDay.TotalSeconds) let! textVersion = document.GetTextVersionAsync(cancellationToken) let textVersionHash = textVersion.GetHashCode() - let! lockObtained = guard.WaitAsync(TimeSpan.FromSeconds 10. ,cancellationToken) |> Async.AwaitTask |> liftAsync + let! lockObtained = guard.WaitAsync(DefaultTuning.PerDocumentSavedDataSlidingWindow ,cancellationToken) |> Async.AwaitTask |> liftAsync do! Option.guard lockObtained try From d1b544081918f6bb753d1560d7e47ea7cd7aa98a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:33:35 +0000 Subject: [PATCH 3/3] Automated command ran: fantomas Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --- .../SimplifyNameDiagnosticAnalyzer.fs | 115 +++++++++--------- 1 file changed, 60 insertions(+), 55 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs index 36206cdfef3..e89f942e0d7 100644 --- a/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs +++ b/vsintegration/src/FSharp.Editor/Diagnostics/SimplifyNameDiagnosticAnalyzer.fs @@ -34,64 +34,69 @@ type internal SimplifyNameDiagnosticAnalyzer [] () = member _.AnalyzeSemanticsAsync(descriptor, document: Document, cancellationToken: CancellationToken) = - asyncMaybe { - do! Option.guard document.Project.IsFSharpCodeFixesSimplifyNameEnabled - do Trace.TraceInformation("{0:n3} (start) SimplifyName", DateTime.Now.TimeOfDay.TotalSeconds) - let! textVersion = document.GetTextVersionAsync(cancellationToken) - let textVersionHash = textVersion.GetHashCode() - let! lockObtained = guard.WaitAsync(DefaultTuning.PerDocumentSavedDataSlidingWindow ,cancellationToken) |> Async.AwaitTask |> liftAsync - do! Option.guard lockObtained - - try - let key = document.Id.ToString() - - match cache.Get(key) with - | :? PerDocumentSavedData as data when data.Hash = textVersionHash -> return data.Diagnostics - | _ -> - let! sourceText = document.GetTextAsync() - - let! _, checkResults = - document.GetFSharpParseAndCheckResultsAsync(nameof (SimplifyNameDiagnosticAnalyzer)) - |> liftAsync - - let! result = - SimplifyNames.getSimplifiableNames ( - checkResults, - fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString() - ) - |> liftAsync - - let mutable diag = ResizeArray() - - for r in result do - diag.Add( - Diagnostic.Create( - descriptor, - RoslynHelpers.RangeToLocation(r.Range, sourceText, document.FilePath), - properties = - (dict [ SimplifyNameDiagnosticAnalyzer.LongIdentPropertyKey, r.RelativeName ]) - .ToImmutableDictionary() - ) + asyncMaybe { + do! Option.guard document.Project.IsFSharpCodeFixesSimplifyNameEnabled + do Trace.TraceInformation("{0:n3} (start) SimplifyName", DateTime.Now.TimeOfDay.TotalSeconds) + let! textVersion = document.GetTextVersionAsync(cancellationToken) + let textVersionHash = textVersion.GetHashCode() + + let! lockObtained = + guard.WaitAsync(DefaultTuning.PerDocumentSavedDataSlidingWindow, cancellationToken) + |> Async.AwaitTask + |> liftAsync + + do! Option.guard lockObtained + + try + let key = document.Id.ToString() + + match cache.Get(key) with + | :? PerDocumentSavedData as data when data.Hash = textVersionHash -> return data.Diagnostics + | _ -> + let! sourceText = document.GetTextAsync() + + let! _, checkResults = + document.GetFSharpParseAndCheckResultsAsync(nameof (SimplifyNameDiagnosticAnalyzer)) + |> liftAsync + + let! result = + SimplifyNames.getSimplifiableNames ( + checkResults, + fun lineNumber -> sourceText.Lines.[Line.toZ lineNumber].ToString() + ) + |> liftAsync + + let mutable diag = ResizeArray() + + for r in result do + diag.Add( + Diagnostic.Create( + descriptor, + RoslynHelpers.RangeToLocation(r.Range, sourceText, document.FilePath), + properties = + (dict [ SimplifyNameDiagnosticAnalyzer.LongIdentPropertyKey, r.RelativeName ]) + .ToImmutableDictionary() ) + ) - let diagnostics = diag.ToImmutableArray() - cache.Remove(key) |> ignore + let diagnostics = diag.ToImmutableArray() + cache.Remove(key) |> ignore - let data = - { - Hash = textVersionHash - Diagnostics = diagnostics - } + let data = + { + Hash = textVersionHash + Diagnostics = diagnostics + } - let cacheItem = CacheItem(key, data) + let cacheItem = CacheItem(key, data) - let policy = - CacheItemPolicy(SlidingExpiration = DefaultTuning.PerDocumentSavedDataSlidingWindow) + let policy = + CacheItemPolicy(SlidingExpiration = DefaultTuning.PerDocumentSavedDataSlidingWindow) - cache.Set(cacheItem, policy) - return diagnostics - finally - guard.Release() |> ignore - } - |> Async.map (Option.defaultValue ImmutableArray.Empty) - |> RoslynHelpers.StartAsyncAsTask cancellationToken + cache.Set(cacheItem, policy) + return diagnostics + finally + guard.Release() |> ignore + } + |> Async.map (Option.defaultValue ImmutableArray.Empty) + |> RoslynHelpers.StartAsyncAsTask cancellationToken