/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public bool HasPendingSymbolAnalysis(AnalysisScope analysisScope) { Debug.Assert(analysisScope.FilterTreeOpt != null); var symbolDeclaredEvents = GetPendingSymbolDeclaredEvents(analysisScope.FilterTreeOpt); foreach (var symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (var analyzer in analysisScope.Analyzers) { if (_analyzerStateMap[analyzer].HasPendingSymbolAnalysis(symbolDeclaredEvent.Symbol)) { return(true); } } } } return(false); }
/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public bool HasPendingSymbolAnalysis(AnalysisScope analysisScope, CancellationToken cancellationToken) { Debug.Assert(analysisScope.FilterTreeOpt != null); var symbolDeclaredEvents = GetPendingSymbolDeclaredEvents(analysisScope.FilterTreeOpt, cancellationToken); foreach (var symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (var analyzer in analysisScope.Analyzers) { var analyzerState = GetAnalyzerState(analyzer); if (analyzerState.HasPendingSymbolAnalysis(symbolDeclaredEvent.Symbol)) { return(true); } } } } return(false); }
/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public bool HasPendingSymbolAnalysis(AnalysisScope analysisScope) { Debug.Assert(analysisScope.FilterTreeOpt != null); ImmutableArray <SymbolDeclaredCompilationEvent> symbolDeclaredEvents = GetPendingSymbolDeclaredEvents(analysisScope.FilterTreeOpt); foreach (SymbolDeclaredCompilationEvent symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (DiagnosticAnalyzer analyzer in analysisScope.Analyzers) { PerAnalyzerState analyzerState = GetAnalyzerState(analyzer); if (analyzerState.HasPendingSymbolAnalysis(symbolDeclaredEvent.Symbol)) { return(true); } } } } return(false); }
/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public async Task <bool> HasPendingSymbolAnalysisAsync(AnalysisScope analysisScope, CancellationToken cancellationToken) { Debug.Assert(analysisScope.FilterTreeOpt != null); var symbolDeclaredEvents = await GetPendingSymbolDeclaredEventsAsync(analysisScope.FilterTreeOpt, cancellationToken).ConfigureAwait(false); foreach (var symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (var analyzer in analysisScope.Analyzers) { var analyzerState = GetAnalyzerState(analyzer); if (await analyzerState.HasPendingSymbolAnalysisAsync(symbolDeclaredEvent.Symbol, cancellationToken).ConfigureAwait(false)) { return(true); } } } } return(false); }
private void ProcessCompilationUnitCompleted(CompilationUnitCompletedEvent completedEvent, AnalysisScope analysisScope, AnalysisState analysisStateOpt, CancellationToken cancellationToken) { // When the compiler is finished with a compilation unit, we can run user diagnostics which // might want to ask the compiler for all the diagnostics in the source file, for example // to get information about unnecessary usings. var semanticModel = analysisStateOpt != null ? GetOrCreateCachedSemanticModel(completedEvent.CompilationUnit, completedEvent.Compilation, cancellationToken) : completedEvent.SemanticModel; if (!analysisScope.ShouldAnalyze(semanticModel.SyntaxTree)) { return; } try { foreach (var analyzer in analysisScope.Analyzers) { ImmutableArray<SemanticModelAnalyzerAction> semanticModelActions; if (_semanticModelActionsMap.TryGetValue(analyzer, out semanticModelActions)) { // Execute actions for a given analyzer sequentially. analyzerExecutor.ExecuteSemanticModelActions(semanticModelActions, analyzer, semanticModel, completedEvent, analysisScope, analysisStateOpt); } else { analysisStateOpt?.MarkEventComplete(completedEvent, analyzer); } } } finally { completedEvent.FlushCache(); } }
private void ExecuteSymbolActions(SymbolDeclaredCompilationEvent symbolEvent, AnalysisScope analysisScope, AnalysisState analysisStateOpt, CancellationToken cancellationToken) { var symbol = symbolEvent.Symbol; if (!analysisScope.ShouldAnalyze(symbol)) { return; } Action<Diagnostic> addDiagnosticForSymbol = GetDiagnosticSinkWithSuppression(DiagnosticQueue.Enqueue, symbolEvent.Compilation, symbol); Action<Diagnostic, DiagnosticAnalyzer, bool> addLocalDiagnosticForSymbol = analysisScope.CategorizeDiagnostics ? GetDiagnosticSinkWithSuppression(DiagnosticQueue.EnqueueLocal, symbolEvent.Compilation, symbol) : null; Action<Diagnostic, DiagnosticAnalyzer> addNonLocalDiagnosticForSymbol = analysisScope.CategorizeDiagnostics ? GetDiagnosticSinkWithSuppression(DiagnosticQueue.EnqueueNonLocal, symbolEvent.Compilation, symbol) : null; foreach (var analyzer in analysisScope.Analyzers) { // Invoke symbol analyzers only for source symbols. ImmutableArray<ImmutableArray<SymbolAnalyzerAction>> actionsByKind; if (_symbolActionsByKind.TryGetValue(analyzer, out actionsByKind) && (int)symbol.Kind < actionsByKind.Length) { analyzerExecutor.ExecuteSymbolActions(actionsByKind[(int)symbol.Kind], analyzer, symbol, addDiagnosticForSymbol, addLocalDiagnosticForSymbol, addNonLocalDiagnosticForSymbol, GetTopmostNodeForAnalysis, analysisScope, analysisStateOpt); } else { analysisStateOpt?.MarkSymbolComplete(symbol, analyzer); } } }
private void ExecuteSymbolActions(SymbolDeclaredCompilationEvent symbolEvent, AnalysisScope analysisScope, AnalysisState analysisStateOpt, CancellationToken cancellationToken) { var symbol = symbolEvent.Symbol; if (!analysisScope.ShouldAnalyze(symbol)) { return; } foreach (var analyzer in analysisScope.Analyzers) { // Invoke symbol analyzers only for source symbols. ImmutableArray<ImmutableArray<SymbolAnalyzerAction>> actionsByKind; if (_symbolActionsByKind.TryGetValue(analyzer, out actionsByKind) && (int)symbol.Kind < actionsByKind.Length) { analyzerExecutor.ExecuteSymbolActions(actionsByKind[(int)symbol.Kind], analyzer, symbol, GetTopmostNodeForAnalysis, analysisScope, analysisStateOpt); } else { analysisStateOpt?.MarkSymbolComplete(symbol, analyzer); } } }
/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public bool HasPendingSymbolAnalysis(AnalysisScope analysisScope) { Debug.Assert(analysisScope.FilterTreeOpt != null); var symbolDeclaredEvents = GetPendingSymbolDeclaredEvents(analysisScope.FilterTreeOpt); foreach (var symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (var analyzer in analysisScope.Analyzers) { if (_analyzerStateMap[analyzer].HasPendingSymbolAnalysis(symbolDeclaredEvent.Symbol)) { return true; } } } } return false; }
/// <summary> /// Returns true if we have any pending symbol analysis for given analysis scope. /// </summary> public async Task<bool> HasPendingSymbolAnalysisAsync(AnalysisScope analysisScope, CancellationToken cancellationToken) { Debug.Assert(analysisScope.FilterTreeOpt != null); var symbolDeclaredEvents = await GetPendingSymbolDeclaredEventsAsync(analysisScope.FilterTreeOpt, cancellationToken).ConfigureAwait(false); foreach (var symbolDeclaredEvent in symbolDeclaredEvents) { if (analysisScope.ShouldAnalyze(symbolDeclaredEvent.Symbol)) { foreach (var analyzer in analysisScope.Analyzers) { var analyzerState = GetAnalyzerState(analyzer); if (await analyzerState.HasPendingSymbolAnalysisAsync(symbolDeclaredEvent.Symbol, cancellationToken).ConfigureAwait(false)) { return true; } } } } return false; }