コード例 #1
0
        protected override async Task <Document> PerformCodeFixActionAsync(CodeFixContext context, SyntaxNode syntaxNode, CancellationToken cancellationToken)
        {
            var document      = context.Document;
            var semanticModel = await document.GetSemanticModelAsync(cancellationToken);

            var argument   = syntaxNode as AttributeArgumentSyntax;
            var targetType = GetTypeSymbol(argument);

            argument.GetAttributeRelatedParents(out var argumentList, out var attribute, out var attributeList);

            var typeParameter = attributeList.Parent as TypeParameterSyntax;
            var attributes    = typeParameter.AttributeLists.SelectMany(l => l.Attributes)
                                .Where(a => a.ArgumentList?.Arguments.Count > 0)
                                .Where(a => a.IsGenericConstraintAttribute <ConstrainedTypesAttributeBase>(semanticModel));

            var arguments = attributes.SelectMany(a => a.ArgumentList.Arguments);

            arguments = arguments.Where(a => a != argument);
            var removed = arguments.Where(ArgumentRemovalPredicate);

            return(await context.RemoveAttributeArgumentsCleanAsync(removed, SyntaxRemoveOptions.KeepNoTrivia, cancellationToken));

            ITypeSymbol GetTypeSymbol(AttributeArgumentSyntax arg)
            {
                return(semanticModel.GetTypeInfo((arg.Expression as TypeOfExpressionSyntax)?.Type).Type);
            }

            bool ArgumentRemovalPredicate(AttributeArgumentSyntax arg)
            {
                var typeSymbol = GetTypeSymbol(arg);

                return(typeSymbol.Equals(targetType, SymbolEqualityComparer.Default));
            }
        }