示例#1
0
        private async Task <ImmutableArray <Diagnostic> > TryPerformCodeFixesAsync(
            Workspace workspace,
            ImmutableArray <Diagnostic> diagnostics)
        {
            var currentDiagnostics = diagnostics;

            foreach (var _ in Enumerable.Range(0, diagnostics.Length))
            {
                var diagnostic = currentDiagnostics
                                 .Where(d => CodeFixProvider.FixableDiagnosticIds.Contains(d.Id))
                                 .FirstOrDefault();
                if (diagnostic is null)
                {
                    break;
                }

                var document = workspace.CurrentSolution.GetDocument(diagnostic.Location.SourceTree);
                if (document is null)
                {
                    continue;
                }

                var codeActions = new List <CodeAction>();

                var context = new CodeFixContext(
                    document,
                    diagnostic,
                    (codeAction, applicableDiagnostics) => codeActions.Add(codeAction),
                    CancellationToken.None);

                await CodeFixProvider.RegisterCodeFixesAsync(context);

                if (codeActions.Count == 0)
                {
                    break;
                }

                var operations = await codeActions[0].GetOperationsAsync(CancellationToken.None);
                foreach (var operation in operations)
                {
                    operation.Apply(workspace, CancellationToken.None);
                }

                currentDiagnostics = await workspace.AnalyzeAsync(Analyzer);
            }

            return(currentDiagnostics);
        }