public async Task <Solution> FormatAsync( Solution solution, ImmutableArray <DocumentId> formattableDocuments, FormatOptions formatOptions, ILogger logger, List <FormattedFile> formattedFiles, CancellationToken cancellationToken) { var projectAnalyzersAndFixers = _informationProvider.GetAnalyzersAndFixers(solution, formatOptions, logger); if (projectAnalyzersAndFixers.IsEmpty) { return(solution); } var allFixers = projectAnalyzersAndFixers.Values.SelectMany(analyzersAndFixers => analyzersAndFixers.Fixers).ToImmutableArray(); // Only include compiler diagnostics if we have a fixer that can fix them. var includeCompilerDiagnostics = allFixers.Any( codefix => codefix.FixableDiagnosticIds.Any( id => id.StartsWith("CS") || id.StartsWith("BC"))); var analysisStopwatch = Stopwatch.StartNew(); logger.LogTrace(Resources.Running_0_analysis, _name); var formattablePaths = formattableDocuments.Select(id => solution.GetDocument(id) !.FilePath) .OfType <string>().ToImmutableHashSet(); logger.LogTrace(Resources.Determining_diagnostics); var severity = _informationProvider.GetSeverity(formatOptions); // Filter to analyzers that report diagnostics with equal or greater severity. var projectAnalyzers = await FilterBySeverityAsync(solution, projectAnalyzersAndFixers, formattablePaths, severity, cancellationToken).ConfigureAwait(false); // Determine which diagnostics are being reported for each project. var projectDiagnostics = await GetProjectDiagnosticsAsync(solution, projectAnalyzers, formattablePaths, formatOptions, severity, includeCompilerDiagnostics, logger, formattedFiles, cancellationToken).ConfigureAwait(false); var projectDiagnosticsMS = analysisStopwatch.ElapsedMilliseconds; logger.LogTrace(Resources.Complete_in_0_ms, projectDiagnosticsMS); // Only run code fixes when we are saving changes. if (formatOptions.SaveFormattedFiles) { logger.LogTrace(Resources.Fixing_diagnostics); // Run each analyzer individually and apply fixes if possible. solution = await FixDiagnosticsAsync(solution, projectAnalyzers, allFixers, projectDiagnostics, formattablePaths, severity, includeCompilerDiagnostics, logger, cancellationToken).ConfigureAwait(false); var fixDiagnosticsMS = analysisStopwatch.ElapsedMilliseconds - projectDiagnosticsMS; logger.LogTrace(Resources.Complete_in_0_ms, fixDiagnosticsMS); } logger.LogTrace(Resources.Analysis_complete_in_0ms_, analysisStopwatch.ElapsedMilliseconds); return(solution); }
public async Task <Solution> FormatAsync( Solution solution, ImmutableArray <DocumentId> formattableDocuments, FormatOptions formatOptions, ILogger logger, List <FormattedFile> formattedFiles, CancellationToken cancellationToken) { var(analyzers, fixers) = _informationProvider.GetAnalyzersAndFixers(solution, formatOptions, logger); if (analyzers.IsEmpty && fixers.IsEmpty) { return(solution); } var analysisStopwatch = Stopwatch.StartNew(); logger.LogTrace(Resources.Running_0_analysis, _name); var formattablePaths = formattableDocuments.Select(id => solution.GetDocument(id) !.FilePath) .OfType <string>().ToImmutableHashSet(); logger.LogTrace(Resources.Determining_diagnostics); var severity = _informationProvider.GetSeverity(formatOptions); // Filter to analyzers that report diagnostics with equal or greater severity. var projectAnalyzers = await FilterBySeverityAsync(solution.Projects, analyzers, formattablePaths, severity, cancellationToken).ConfigureAwait(false); // Determine which diagnostics are being reported for each project. var projectDiagnostics = await GetProjectDiagnosticsAsync(solution, projectAnalyzers, formattablePaths, formatOptions, severity, logger, formattedFiles, cancellationToken).ConfigureAwait(false); var projectDiagnosticsMS = analysisStopwatch.ElapsedMilliseconds; logger.LogTrace(Resources.Complete_in_0_ms, projectDiagnosticsMS); logger.LogTrace(Resources.Fixing_diagnostics); // Run each analyzer individually and apply fixes if possible. solution = await FixDiagnosticsAsync(solution, analyzers, fixers, projectDiagnostics, formattablePaths, severity, logger, cancellationToken).ConfigureAwait(false); var fixDiagnosticsMS = analysisStopwatch.ElapsedMilliseconds - projectDiagnosticsMS; logger.LogTrace(Resources.Complete_in_0_ms, fixDiagnosticsMS); logger.LogTrace(Resources.Analysis_complete_in_0ms_, analysisStopwatch.ElapsedMilliseconds); return(solution); }