private void SetSeverityHandler(object sender, EventArgs args) { var selectedItem = (MenuCommand)sender; var reportDiagnostic = TryMapSelectedItemToReportDiagnostic(selectedItem); if (reportDiagnostic == null) { return; } var selectedDiagnostic = TryGetSingleSelectedEntry(); if (selectedDiagnostic == null) { return; } var pathToAnalyzerConfigDoc = TryGetPathToAnalyzerConfigDoc(selectedDiagnostic, out var project); if (pathToAnalyzerConfigDoc != null) { var result = _uiThreadOperationExecutor.Execute( title: ServicesVSResources.Updating_severity, defaultDescription: ServicesVSResources.Updating_severity, allowCancellation: true, showProgress: true, action: context => { var newSolution = ConfigureSeverityAsync(context.UserCancellationToken).WaitAndGetResult(context.UserCancellationToken); var operations = ImmutableArray.Create <CodeActionOperation>(new ApplyChangesOperation(newSolution)); var scope = context.AddScope(allowCancellation: true, ServicesVSResources.Updating_severity); _editHandlerService.Apply( _workspace, fromDocument: null, operations: operations, title: ServicesVSResources.Updating_severity, progressTracker: new UIThreadOperationContextProgressTracker(scope), cancellationToken: context.UserCancellationToken); }); if (result == UIThreadOperationStatus.Completed && selectedDiagnostic.DocumentId != null) { // Kick off diagnostic re-analysis for affected document so that the configured diagnostic gets refreshed. Task.Run(() => { _diagnosticService.Reanalyze(_workspace, documentIds: SpecializedCollections.SingletonEnumerable(selectedDiagnostic.DocumentId), highPriority: true); }); } } return; // Local functions. async System.Threading.Tasks.Task <Solution> ConfigureSeverityAsync(CancellationToken cancellationToken) { var diagnostic = await selectedDiagnostic.ToDiagnosticAsync(project, cancellationToken).ConfigureAwait(false); return(await ConfigurationUpdater.ConfigureSeverityAsync(reportDiagnostic.Value, diagnostic, project, cancellationToken).ConfigureAwait(false)); } }
internal Task <Solution> GetSolutionWithUpdatedAnalyzerConfigSeverityAsync(ReportDiagnostic value, Project project, CancellationToken cancellationToken) { var effectiveSeverity = value.ToDiagnosticSeverity() ?? Descriptor.DefaultSeverity; var diagnostic = Diagnostic.Create(Descriptor, Location.None, effectiveSeverity, additionalLocations: null, properties: null); return(ConfigurationUpdater.ConfigureSeverityAsync(value, diagnostic, project, cancellationToken)); }
private async Task SetSeverityHandlerAsync(ReportDiagnostic reportDiagnostic, DiagnosticData selectedDiagnostic, Project project) { try { using var token = _listener.BeginAsyncOperation(nameof(SetSeverityHandlerAsync)); using var context = _uiThreadOperationExecutor.BeginExecute( title: ServicesVSResources.Updating_severity, defaultDescription: ServicesVSResources.Updating_severity, allowCancellation: true, showProgress: true); var newSolution = await ConfigureSeverityAsync(context.UserCancellationToken).ConfigureAwait(false); var operations = ImmutableArray.Create <CodeActionOperation>(new ApplyChangesOperation(newSolution)); using var scope = context.AddScope(allowCancellation: true, ServicesVSResources.Updating_severity); await _editHandlerService.ApplyAsync( _workspace, project.Solution, fromDocument : null, operations : operations, title : ServicesVSResources.Updating_severity, progressTracker : new UIThreadOperationContextProgressTracker(scope), cancellationToken : context.UserCancellationToken).ConfigureAwait(false); if (selectedDiagnostic.DocumentId != null) { // Kick off diagnostic re-analysis for affected document so that the configured diagnostic gets refreshed. _ = Task.Run(() => { _diagnosticService.Reanalyze(_workspace, documentIds: SpecializedCollections.SingletonEnumerable(selectedDiagnostic.DocumentId), highPriority: true); }); } } catch (OperationCanceledException) { } catch (Exception ex) when(FatalError.ReportAndCatch(ex)) { } return; // Local functions. async System.Threading.Tasks.Task <Solution> ConfigureSeverityAsync(CancellationToken cancellationToken) { var diagnostic = await selectedDiagnostic.ToDiagnosticAsync(project, cancellationToken).ConfigureAwait(false); return(await ConfigurationUpdater.ConfigureSeverityAsync(reportDiagnostic, diagnostic, project, cancellationToken).ConfigureAwait(false)); } }