public static DiagnosticAnalyzerCategory GetDiagnosticAnalyzerCategory(this DiagnosticAnalyzer analyzer, DiagnosticAnalyzerDriver driver) { var category = DiagnosticAnalyzerCategory.None; if (analyzer is DocumentDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; } else if (analyzer is ProjectDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } else if (driver != null) { // If an analyzer requires or might require the entire document, then it cannot promise // to be able to operate on a limited span of the document. In practical terms, no analyzer // can have both SemanticDocumentAnalysis and SemanticSpanAnalysis as categories. bool cantSupportSemanticSpanAnalysis = false; var analyzerActions = driver.GetAnalyzerActionsAsync(analyzer).WaitAndGetResult(driver.CancellationToken); if (analyzerActions != null) { if (analyzerActions.SyntaxTreeActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis; } if (analyzerActions.SemanticModelActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationStartActionsCount > 0) { // It is not possible to know what actions a compilation start action will register without executing it, // so return a worst-case categorization. category |= DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis | DiagnosticAnalyzerCategory.ProjectAnalysis; cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationEndActionsCount > 0 || analyzerActions.CompilationActionsCount > 0 || analyzerActions.CompilationStartActionsCount > 0) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } if (!cantSupportSemanticSpanAnalysis) { if (analyzerActions.SymbolActionsCount > 0 || analyzerActions.CodeBlockStartActionsCount > 0 || analyzerActions.CodeBlockEndActionsCount > 0 || analyzerActions.SyntaxNodeActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SemanticSpanAnalysis; } } } } return(category); }
public static async Task <DiagnosticAnalyzerCategory> GetDiagnosticAnalyzerCategoryAsync(this DiagnosticAnalyzer analyzer, DiagnosticAnalyzerDriver driver) { var category = DiagnosticAnalyzerCategory.None; if (analyzer is DocumentDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; } else if (analyzer is ProjectDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } else if (driver != null) { // If an analyzer requires or might require the entire document, then it cannot promise // to be able to operate on a limited span of the document. In practical terms, no analyzer // can have both SemanticDocumentAnalysis and SemanticSpanAnalysis as categories. bool cantSupportSemanticSpanAnalysis = false; var analyzerActions = await driver.GetAnalyzerActionsAsync(analyzer).ConfigureAwait(false); if (analyzerActions != null) { if (analyzerActions.SyntaxTreeActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis; } if (analyzerActions.SemanticModelActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationStartActionsCount > 0) { // It is not possible to know what actions a compilation start action will register without executing it, // so return a worst-case categorization. category |= (DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis | DiagnosticAnalyzerCategory.ProjectAnalysis); cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationActionsCount > 0 || analyzerActions.CompilationStartActionsCount > 0) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } if (HasSemanticDocumentActions(analyzerActions)) { var semanticDocumentAnalysisCategory = cantSupportSemanticSpanAnalysis ? DiagnosticAnalyzerCategory.SemanticDocumentAnalysis : DiagnosticAnalyzerCategory.SemanticSpanAnalysis; category |= semanticDocumentAnalysisCategory; } } } return(category); }
public static async Task<DiagnosticAnalyzerCategory> GetDiagnosticAnalyzerCategoryAsync(this DiagnosticAnalyzer analyzer, DiagnosticAnalyzerDriver driver) { var category = DiagnosticAnalyzerCategory.None; if (analyzer is DocumentDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; } else if (analyzer is ProjectDiagnosticAnalyzer) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } else if (driver != null) { // If an analyzer requires or might require the entire document, then it cannot promise // to be able to operate on a limited span of the document. In practical terms, no analyzer // can have both SemanticDocumentAnalysis and SemanticSpanAnalysis as categories. bool cantSupportSemanticSpanAnalysis = false; var analyzerActions = await driver.GetAnalyzerActionsAsync(analyzer).ConfigureAwait(false); if (analyzerActions != null) { if (analyzerActions.SyntaxTreeActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SyntaxAnalysis; } if (analyzerActions.SemanticModelActionsCount > 0) { category |= DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationStartActionsCount > 0) { // It is not possible to know what actions a compilation start action will register without executing it, // so return a worst-case categorization. category |= (DiagnosticAnalyzerCategory.SyntaxAnalysis | DiagnosticAnalyzerCategory.SemanticDocumentAnalysis | DiagnosticAnalyzerCategory.ProjectAnalysis); cantSupportSemanticSpanAnalysis = true; } if (analyzerActions.CompilationActionsCount > 0 || analyzerActions.CompilationStartActionsCount > 0) { category |= DiagnosticAnalyzerCategory.ProjectAnalysis; } if (HasSemanticDocumentActions(analyzerActions)) { var semanticDocumentAnalysisCategory = cantSupportSemanticSpanAnalysis ? DiagnosticAnalyzerCategory.SemanticDocumentAnalysis : DiagnosticAnalyzerCategory.SemanticSpanAnalysis; category |= semanticDocumentAnalysisCategory; } } } return category; }