File: CodeFixes\Suppression\AbstractSuppressionCodeFixProvider.RemoveSuppressionCodeAction_Attribute.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editing;
 
namespace Microsoft.CodeAnalysis.CodeFixes.Suppression;
 
internal abstract partial class AbstractSuppressionCodeFixProvider : IConfigurationFixProvider
{
    internal abstract partial class RemoveSuppressionCodeAction
    {
        /// <summary>
        /// Code action to remove suppress message attributes for remove suppression.
        /// </summary>
        private sealed class AttributeRemoveAction : RemoveSuppressionCodeAction
        {
            private readonly Project _project;
            private readonly AttributeData _attribute;
 
            public static AttributeRemoveAction Create(
                AttributeData attribute,
                Project project,
                Diagnostic diagnostic,
                AbstractSuppressionCodeFixProvider fixer)
            {
                return new AttributeRemoveAction(attribute, project, diagnostic, fixer);
            }
 
            private AttributeRemoveAction(
                AttributeData attribute,
                Project project,
                Diagnostic diagnostic,
                AbstractSuppressionCodeFixProvider fixer,
                bool forFixMultipleContext = false)
                : base(diagnostic, fixer, forFixMultipleContext)
            {
                _project = project;
                _attribute = attribute;
            }
 
            public override RemoveSuppressionCodeAction CloneForFixMultipleContext()
                => new AttributeRemoveAction(_attribute, _project, _diagnostic, Fixer, forFixMultipleContext: true);
 
            public override SyntaxTree SyntaxTreeToModify => _attribute.ApplicationSyntaxReference.SyntaxTree;
 
            public async Task<SyntaxNode> GetAttributeToRemoveAsync(CancellationToken cancellationToken)
            {
                var attributeNode = await _attribute.ApplicationSyntaxReference.GetSyntaxAsync(cancellationToken).ConfigureAwait(false);
                return Fixer.IsSingleAttributeInAttributeList(attributeNode)
                    ? attributeNode.Parent
                    : attributeNode;
            }
 
            protected override async Task<Solution> GetChangedSolutionAsync(
                IProgress<CodeAnalysisProgress> progress, CancellationToken cancellationToken)
            {
                var attributeNode = await GetAttributeToRemoveAsync(cancellationToken).ConfigureAwait(false);
                var documentWithAttribute = _project.GetDocument(attributeNode.SyntaxTree);
                if (documentWithAttribute == null)
                {
                    return _project.Solution;
                }
 
                var editor = await DocumentEditor.CreateAsync(documentWithAttribute, cancellationToken).ConfigureAwait(false);
                editor.RemoveNode(attributeNode);
                return editor.GetChangedDocument().Project.Solution;
            }
        }
    }
}