/// <summary> /// Returns a list of all analysis results inside the specific project. This is an asynchronous operation. /// </summary> /// <param name="analyzers">The list of analyzers that should be used</param> /// <param name="project">The project that should be analyzed /// <see langword="false"/> to use the behavior configured for the specified <paramref name="project"/>.</param> /// <param name="cancellationToken">The cancellation token that the task will observe.</param> /// <returns>A list of analysis results inside the project</returns> private static async Task <AnalysisResult> GetProjectAnalysisResultAsync( ImmutableArray <DiagnosticAnalyzer> analyzers, Project project, Options analyzerOptionsInternal, CancellationToken cancellationToken) { WriteLine($"Running analyzers for {project.Name}", ConsoleColor.Gray); if (analyzerOptionsInternal.RunConcurrent) { await Task.Yield(); } try { Compilation compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var newCompilation = compilation.RemoveAllSyntaxTrees().AddSyntaxTrees(compilation.SyntaxTrees); var workspaceAnalyzerOptions = new WorkspaceAnalyzerOptions(project.AnalyzerOptions, project.Solution); CompilationWithAnalyzers compilationWithAnalyzers = newCompilation.WithAnalyzers(analyzers, new CompilationWithAnalyzersOptions(workspaceAnalyzerOptions, null, analyzerOptionsInternal.RunConcurrent, logAnalyzerExecutionTime: true, reportSuppressedDiagnostics: analyzerOptionsInternal.ReportSuppressedDiagnostics)); var analystResult = await compilationWithAnalyzers.GetAnalysisResultAsync(cancellationToken).ConfigureAwait(false); return(analystResult); } catch (Exception e) { WriteLine($"Failed to analyze {project.Name} with {e.ToString()}", ConsoleColor.Red); return(null); } }
private static async Task <DocumentAnalyzerPerformance> TestDocumentPerformanceAsync(ImmutableDictionary <string, ImmutableArray <DiagnosticAnalyzer> > analyzers, Project project, DocumentId documentId, Options analyzerOptionsInternal, CancellationToken cancellationToken) { if (!analyzers.TryGetValue(project.Language, out var languageAnalyzers)) { languageAnalyzers = ImmutableArray <DiagnosticAnalyzer> .Empty; } Compilation compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var stopwatch = PerformanceTracker.StartNew(); for (int i = 0; i < analyzerOptionsInternal.TestDocumentIterations; i++) { var workspaceAnalyzerOptions = new WorkspaceAnalyzerOptions(project.AnalyzerOptions, project.Solution); CompilationWithAnalyzers compilationWithAnalyzers = compilation.WithAnalyzers(languageAnalyzers, new CompilationWithAnalyzersOptions(workspaceAnalyzerOptions, null, analyzerOptionsInternal.RunConcurrent, logAnalyzerExecutionTime: true, reportSuppressedDiagnostics: analyzerOptionsInternal.ReportSuppressedDiagnostics)); SyntaxTree tree = await project.GetDocument(documentId).GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); await compilationWithAnalyzers.GetAnalyzerSyntaxDiagnosticsAsync(tree, cancellationToken).ConfigureAwait(false); await compilationWithAnalyzers.GetAnalyzerSemanticDiagnosticsAsync(compilation.GetSemanticModel(tree), null, cancellationToken).ConfigureAwait(false); } return(new DocumentAnalyzerPerformance(analyzerOptionsInternal.TestDocumentIterations / stopwatch.Elapsed.TotalSeconds, stopwatch.AllocatedBytes / Math.Max(1, analyzerOptionsInternal.TestDocumentIterations))); }
private static void ExecuteAnalyzers( PreviewWorkspace previewWorkspace, ImmutableArray <DiagnosticAnalyzer> analyzers ) { var analyzerOptions = new AnalyzerOptions( additionalFiles: ImmutableArray <AdditionalText> .Empty ); var workspaceAnalyzerOptions = new WorkspaceAnalyzerOptions( analyzerOptions, previewWorkspace.CurrentSolution ); var compilationWithAnalyzersOptions = new CompilationWithAnalyzersOptions( workspaceAnalyzerOptions, onAnalyzerException: null, concurrentAnalysis: false, logAnalyzerExecutionTime: false ); var project = previewWorkspace.CurrentSolution.Projects.Single(); var compilation = project.GetRequiredCompilationAsync(CancellationToken.None).Result; var compilationWithAnalyzers = new CompilationWithAnalyzers( compilation, analyzers, compilationWithAnalyzersOptions ); var result = compilationWithAnalyzers.GetAnalysisResultAsync(CancellationToken.None).Result; Assert.Equal(1, result.CompilationDiagnostics.Count); }
private static async Task <DocumentAnalyzerPerformance> TestDocumentPerformanceAsync(ImmutableDictionary <string, ImmutableArray <DiagnosticAnalyzer> > analyzers, Project project, DocumentId documentId, Options analyzerOptionsInternal, CancellationToken cancellationToken) { // update the project compilation options var modifiedSpecificDiagnosticOptions = project.CompilationOptions.SpecificDiagnosticOptions .Add("AD0001", ReportDiagnostic.Error) .Add("AD0002", ReportDiagnostic.Error); // Report exceptions during the analysis process as errors var modifiedCompilationOptions = project.CompilationOptions.WithSpecificDiagnosticOptions(modifiedSpecificDiagnosticOptions); var processedProject = project.WithCompilationOptions(modifiedCompilationOptions); if (!analyzers.TryGetValue(project.Language, out var languageAnalyzers)) { languageAnalyzers = ImmutableArray <DiagnosticAnalyzer> .Empty; } var stopwatch = Stopwatch.StartNew(); for (int i = 0; i < analyzerOptionsInternal.TestDocumentIterations; i++) { Compilation compilation = await processedProject.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var workspaceAnalyzerOptions = new WorkspaceAnalyzerOptions(project.AnalyzerOptions, project.Solution.Options, project.Solution); CompilationWithAnalyzers compilationWithAnalyzers = compilation.WithAnalyzers(languageAnalyzers, new CompilationWithAnalyzersOptions(workspaceAnalyzerOptions, null, analyzerOptionsInternal.RunConcurrent, logAnalyzerExecutionTime: true, reportSuppressedDiagnostics: analyzerOptionsInternal.ReportSuppressedDiagnostics)); SyntaxTree tree = await project.GetDocument(documentId).GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); await compilationWithAnalyzers.GetAnalyzerSyntaxDiagnosticsAsync(tree, cancellationToken).ConfigureAwait(false); await compilationWithAnalyzers.GetAnalyzerSemanticDiagnosticsAsync(compilation.GetSemanticModel(tree), null, cancellationToken).ConfigureAwait(false); } return(new DocumentAnalyzerPerformance(analyzerOptionsInternal.TestDocumentIterations / stopwatch.Elapsed.TotalSeconds)); }
/// <summary> /// Returns a list of all analysis results inside the specific project. This is an asynchronous operation. /// </summary> /// <param name="analyzers">The list of analyzers that should be used</param> /// <param name="project">The project that should be analyzed /// <see langword="false"/> to use the behavior configured for the specified <paramref name="project"/>.</param> /// <param name="cancellationToken">The cancellation token that the task will observe.</param> /// <returns>A list of analysis results inside the project</returns> private static async Task<AnalysisResult> GetProjectAnalysisResultAsync( ImmutableArray<DiagnosticAnalyzer> analyzers, Project project, Options analyzerOptionsInternal, CancellationToken cancellationToken) { WriteLine($"Running analyzers for {project.Name}", ConsoleColor.Gray); if (analyzerOptionsInternal.RunConcurrent) { await Task.Yield(); } // update the project compilation options var modifiedSpecificDiagnosticOptions = project.CompilationOptions.SpecificDiagnosticOptions .Add("AD0001", ReportDiagnostic.Error) .Add("AD0002", ReportDiagnostic.Error); // Report exceptions during the analysis process as errors var modifiedCompilationOptions = project.CompilationOptions.WithSpecificDiagnosticOptions(modifiedSpecificDiagnosticOptions); var processedProject = project.WithCompilationOptions(modifiedCompilationOptions); try { Compilation compilation = await processedProject.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var newCompilation = compilation.RemoveAllSyntaxTrees().AddSyntaxTrees(compilation.SyntaxTrees); var workspaceAnalyzerOptions = new WorkspaceAnalyzerOptions(project.AnalyzerOptions, project.Solution.Options, project.Solution); CompilationWithAnalyzers compilationWithAnalyzers = newCompilation.WithAnalyzers(analyzers, new CompilationWithAnalyzersOptions(workspaceAnalyzerOptions, null, analyzerOptionsInternal.RunConcurrent, logAnalyzerExecutionTime: true, reportSuppressedDiagnostics: analyzerOptionsInternal.ReportSuppressedDiagnostics)); var analystResult = await compilationWithAnalyzers.GetAnalysisResultAsync(cancellationToken).ConfigureAwait(false); return analystResult; } catch (Exception e) { WriteLine($"Failed to analyze {project.Name} with {e.ToString()}", ConsoleColor.Red); return null; } }