public bool SupportAnalysisKind(DiagnosticAnalyzer analyzer, string language, AnalysisKind kind) { // compiler diagnostic analyzer always supports all kinds: if (IsCompilerDiagnosticAnalyzer(language, analyzer)) { return(true); } return(kind switch { AnalysisKind.Syntax => analyzer.SupportsSyntaxDiagnosticAnalysis(), AnalysisKind.Semantic => analyzer.SupportsSemanticDiagnosticAnalysis(), _ => throw ExceptionUtilities.UnexpectedValue(kind) });
public async Task <IEnumerable <Diagnostic> > GetSyntaxDiagnosticsAsync(DiagnosticAnalyzer analyzer) { var compilation = this.document.Project.SupportsCompilation ? await this.document.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false) : null; Contract.ThrowIfNull(this.document); Contract.ThrowIfFalse(analyzer.SupportsSyntaxDiagnosticAnalysis(this)); using (var pooledObject = SharedPools.Default <List <Diagnostic> >().GetPooledObject()) { var diagnostics = pooledObject.Object; this.cancellationToken.ThrowIfCancellationRequested(); var documentAnalyzer = analyzer as DocumentDiagnosticAnalyzer; if (documentAnalyzer != null) { try { await documentAnalyzer.AnalyzeSyntaxAsync(this.document, diagnostics.Add, this.cancellationToken).ConfigureAwait(false); return(diagnostics.ToImmutableArrayOrEmpty()); } catch (Exception e) when(CatchAnalyzerException(e, analyzer)) { var exceptionDiagnostics = AnalyzerExceptionToDiagnostics(analyzer, e, cancellationToken); return(GetFilteredDocumentDiagnostics(exceptionDiagnostics, compilation).ToImmutableArray()); } } var analyzerActions = await this.GetAnalyzerActionsAsync(analyzer, diagnostics.Add).ConfigureAwait(false); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)logAggregator); if (analyzerActions != null) { if (this.document.SupportsSyntaxTree) { AnalyzerDriverHelper.ExecuteSyntaxTreeActions(analyzerActions, this.root.SyntaxTree, this.analyzerOptions, diagnostics.Add, CatchAnalyzerException, this.cancellationToken); } } if (diagnostics.Count == 0) { return(SpecializedCollections.EmptyEnumerable <Diagnostic>()); } return(GetFilteredDocumentDiagnostics(diagnostics, compilation).ToImmutableArray()); } }
private static bool ShouldRunProviderForStateType(StateType stateTypeId, DiagnosticAnalyzer provider, DiagnosticAnalyzerDriver driver, out bool supportsSemanticInSpan, ImmutableHashSet<string> diagnosticIds = null, Func<DiagnosticAnalyzer, ImmutableArray<DiagnosticDescriptor>> getDescriptor = null) { Debug.Assert(!IsAnalyzerSuppressed(provider, driver.Project.CompilationOptions, driver)); supportsSemanticInSpan = false; if (diagnosticIds != null && getDescriptor(provider).All(d => !diagnosticIds.Contains(d.Id))) { return false; } switch (stateTypeId) { case StateType.Syntax: return provider.SupportsSyntaxDiagnosticAnalysis(driver); case StateType.Document: return provider.SupportsSemanticDiagnosticAnalysis(driver, out supportsSemanticInSpan); case StateType.Project: return provider.SupportsProjectDiagnosticAnalysis(driver); default: throw ExceptionUtilities.Unreachable; } }
public async Task<IEnumerable<Diagnostic>> GetSyntaxDiagnosticsAsync(DiagnosticAnalyzer analyzer) { var compilation = _document.Project.SupportsCompilation ? await _document.Project.GetCompilationAsync(_cancellationToken).ConfigureAwait(false) : null; Contract.ThrowIfNull(_document); Contract.ThrowIfFalse(analyzer.SupportsSyntaxDiagnosticAnalysis(this)); using (var pooledObject = SharedPools.Default<List<Diagnostic>>().GetPooledObject()) { var diagnostics = pooledObject.Object; _cancellationToken.ThrowIfCancellationRequested(); var documentAnalyzer = analyzer as DocumentDiagnosticAnalyzer; if (documentAnalyzer != null) { try { await documentAnalyzer.AnalyzeSyntaxAsync(_document, diagnostics.Add, _cancellationToken).ConfigureAwait(false); return diagnostics.ToImmutableArrayOrEmpty(); } catch (Exception e) when(CatchAnalyzerException(e, analyzer)) { var exceptionDiagnostics = AnalyzerExceptionToDiagnostics(analyzer, e, _cancellationToken); return GetFilteredDocumentDiagnostics(exceptionDiagnostics, compilation).ToImmutableArray(); } } var analyzerActions = await this.GetAnalyzerActionsAsync(analyzer, diagnostics.Add).ConfigureAwait(false); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)_logAggregator); if (analyzerActions != null) { if (_document.SupportsSyntaxTree) { AnalyzerDriverHelper.ExecuteSyntaxTreeActions(analyzerActions, _root.SyntaxTree, _analyzerOptions, diagnostics.Add, CatchAnalyzerException, _cancellationToken); } } if (diagnostics.Count == 0) { return SpecializedCollections.EmptyEnumerable<Diagnostic>(); } return GetFilteredDocumentDiagnostics(diagnostics, compilation).ToImmutableArray(); } }