From 54c13985e07d13eddd2c3840e23c04f293274913 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 26 Feb 2021 15:17:13 -0800 Subject: [PATCH] Use ImmutableSegmentedDictionary for faster lookup in AnalyzerDriver --- .../DiagnosticAnalyzer/AnalyzerDriver.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs index 14f2380c9dfdc..04b651cedfa92 100644 --- a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs +++ b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Collections; using Microsoft.CodeAnalysis.Diagnostics.Telemetry; using Microsoft.CodeAnalysis.Operations; using Microsoft.CodeAnalysis.PooledObjects; @@ -158,16 +159,16 @@ private ImmutableDictionary AnalyzerGateMap } } - private ImmutableDictionary? _lazyGeneratedCodeAnalysisFlagsMap; + private ImmutableSegmentedDictionary _lazyGeneratedCodeAnalysisFlagsMap; /// /// Map from analyzers to their setting. /// - private ImmutableDictionary GeneratedCodeAnalysisFlagsMap + private ImmutableSegmentedDictionary GeneratedCodeAnalysisFlagsMap { get { - Debug.Assert(_lazyGeneratedCodeAnalysisFlagsMap != null); + Debug.Assert(!_lazyGeneratedCodeAnalysisFlagsMap.IsDefault); return _lazyGeneratedCodeAnalysisFlagsMap; } } @@ -532,7 +533,7 @@ private ImmutableHashSet ComputeSymbolStartAnalyzers(Immutab private static bool ComputeShouldSkipAnalysisOnGeneratedCode( ImmutableHashSet analyzers, - ImmutableDictionary generatedCodeAnalysisFlagsMap, + ImmutableSegmentedDictionary generatedCodeAnalysisFlagsMap, bool treatAllCodeAsNonGeneratedCode) { foreach (var analyzer in analyzers) @@ -549,7 +550,7 @@ private static bool ComputeShouldSkipAnalysisOnGeneratedCode( /// /// Returns true if all analyzers need to analyze and report diagnostics in generated code - we can assume all code to be non-generated code. /// - private static bool ComputeShouldTreatAllCodeAsNonGeneratedCode(ImmutableHashSet analyzers, ImmutableDictionary generatedCodeAnalysisFlagsMap) + private static bool ComputeShouldTreatAllCodeAsNonGeneratedCode(ImmutableHashSet analyzers, ImmutableSegmentedDictionary generatedCodeAnalysisFlagsMap) { foreach (var analyzer in analyzers) { @@ -570,7 +571,7 @@ private bool ShouldSkipAnalysisOnGeneratedCode(DiagnosticAnalyzer analyzer) private static bool ShouldSkipAnalysisOnGeneratedCode( DiagnosticAnalyzer analyzer, - ImmutableDictionary generatedCodeAnalysisFlagsMap, + ImmutableSegmentedDictionary generatedCodeAnalysisFlagsMap, bool treatAllCodeAsNonGeneratedCode) { if (treatAllCodeAsNonGeneratedCode) @@ -2163,13 +2164,13 @@ private static async Task return builder.ToImmutable(); } - private static async Task> CreateGeneratedCodeAnalysisFlagsMapAsync( + private static async Task> CreateGeneratedCodeAnalysisFlagsMapAsync( ImmutableHashSet analyzers, AnalyzerManager analyzerManager, AnalyzerExecutor analyzerExecutor, SeverityFilter severityFilter) { - var builder = ImmutableDictionary.CreateBuilder(); + var builder = ImmutableSegmentedDictionary.CreateBuilder(); foreach (var analyzer in analyzers) { Debug.Assert(!IsDiagnosticAnalyzerSuppressed(analyzer, analyzerExecutor.Compilation.Options, analyzerManager, analyzerExecutor, severityFilter));