private static async Task<ImmutableDictionary<DiagnosticAnalyzer, SemaphoreSlim>> GetAnalyzerGateMapAsync( ImmutableArray<DiagnosticAnalyzer> analyzers, AnalyzerManager analyzerManager, AnalyzerExecutor analyzerExecutor) { var builder = ImmutableDictionary.CreateBuilder<DiagnosticAnalyzer, SemaphoreSlim>(); foreach (var analyzer in analyzers) { var isConcurrent = await analyzerManager.IsConcurrentAnalyzerAsync(analyzer, analyzerExecutor).ConfigureAwait(false); if (!isConcurrent) { // Non-concurrent analyzers need their action callbacks from the analyzer driver to be guarded by a gate. var gate = new SemaphoreSlim(initialCount: 1); builder.Add(analyzer, gate); } } return builder.ToImmutable(); }