예제 #1
0
        public static AttributeSyntax RenameNameEquals(this AttributeSyntax node, string nameEquals, string renameTo)
        {
            var candidate = FindByNameEquals(node.ArgumentList, nameEquals);

            if (candidate != null)
            {
                return(node.ReplaceNode(candidate, candidate.WithNameEquals(SyntaxFactory.NameEquals(renameTo))));
            }

            return(node);
        }
예제 #2
0
        public override SyntaxNode VisitAttribute(AttributeSyntax node)
        {
            var kindWhitelist = new List <SyntaxKind>
            {
                SyntaxKind.AttributeArgument,
                SyntaxKind.Attribute,
                SyntaxKind.AttributeList,
                SyntaxKind.AttributeArgumentList,
                SyntaxKind.Parameter
            };

            SyntaxNode parent = node;

            while (parent.Kind() != SyntaxKind.Parameter)
            {
                parent = parent.Parent;

                if (!kindWhitelist.Contains(parent.Kind()))
                {
                    return(base.VisitAttribute(node));
                }
            }

            if (node.Name.ToFullString() != "FromHeader")
            {
                return(base.VisitAttribute(node));
            }

            if (!(parent is ParameterSyntax))
            {
                return(base.VisitAttribute(node));
            }

            var parameterName = (parent as ParameterSyntax).Identifier.ToFullString();

            var name      = SyntaxFactory.ParseName("MyAttribute");
            var arguments = SyntaxFactory.ParseAttributeArgumentList($"(Name = \"{parameterName}\")");
            var attribute = SyntaxFactory.Attribute(name, arguments);

            //var attributeList = new SeparatedSyntaxList<AttributeSyntax>();
            //attributeList = attributeList.Add(attribute);
            //var list = AttributeList(attributeList);

            node = node.ReplaceNode(node, attribute);

            return(base.VisitAttribute(node));
        }
예제 #3
0
        private static AttributeListSyntax CreateAttribute(string @namespace, AttributeSyntax attribute)
        {
            var list = attribute.FirstAncestorOrSelf <AttributeListSyntax>();

            if (list?.Attributes.Count != 1)
            {
                return(null);
            }

            if (!Attribute.TryFindArgument(attribute, 1, KnownSymbol.XmlnsDefinitionAttribute.ClrNamespaceArgumentName, out AttributeArgumentSyntax oldArgument))
            {
                return(null);
            }

            var newArgument = oldArgument.WithExpression(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(@namespace)));

            return(list.WithAttributes(SyntaxFactory.SingletonSeparatedList(attribute.ReplaceNode(oldArgument, newArgument))).WithAdditionalAnnotations(Formatter.Annotation));
        }
예제 #4
0
        public override SyntaxNode VisitAttribute(AttributeSyntax attribute)
        {
            if (attribute.Name.GetText().ToString() == "InternalsVisibleTo")
            {
                var value = attribute.ArgumentList.Arguments.Select(argument => argument.Expression).OfType <LiteralExpressionSyntax>()
                            .Select(a => a.Token.ValueText).FirstOrDefault();

                var newArgumentList = SyntaxFactory.AttributeArgumentList(
                    SyntaxFactory.SeparatedList(new[]
                {
                    SyntaxFactory.AttributeArgument(
                        SyntaxFactory.LiteralExpression(
                            SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal($"{value},myupdated value"))
                        )
                }));
                return(attribute.ReplaceNode(attribute.ArgumentList, newArgumentList));
            }
            return(attribute);
        }
        public override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            foreach (var diagnostic in context.Diagnostics)
            {
                if (!string.Equals(diagnostic.Id, JsonObjectOptInAnalyzer.DiagnosticId, StringComparison.Ordinal))
                {
                    continue;
                }

                var documentRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

                AttributeSyntax syntax = documentRoot.FindNode(diagnostic.Location.SourceSpan) as AttributeSyntax;
                if (syntax == null)
                {
                    continue;
                }

                ExpressionSyntax expression =
                    SyntaxFactory.ParseExpression("global::Newtonsoft.Json.MemberSerialization.OptIn")
                    .WithAdditionalAnnotations(Simplifier.Annotation);

                AttributeSyntax             newAttribute = null;
                AttributeArgumentListSyntax argumentList = syntax.ArgumentList;
                if (argumentList != null)
                {
                    AttributeArgumentSyntax existingArgument = null;
                    foreach (var attributeArgument in argumentList.Arguments)
                    {
                        if (string.Equals("MemberSerialization", attributeArgument.NameEquals?.Name?.Identifier.ValueText, StringComparison.Ordinal))
                        {
                            existingArgument = attributeArgument;
                            break;
                        }
                    }

                    if (existingArgument == null)
                    {
                        SemanticModel semanticModel = null;
                        foreach (var attributeArgument in argumentList.Arguments)
                        {
                            // this time only interested in arguments (no NameEquals clause)
                            if (attributeArgument.NameEquals != null)
                            {
                                continue;
                            }

                            if (string.Equals("memberSerialization", attributeArgument.NameColon?.Name?.Identifier.ValueText, StringComparison.Ordinal))
                            {
                                existingArgument = attributeArgument;
                                break;
                            }

                            if (attributeArgument.NameColon != null)
                            {
                                continue;
                            }

                            if (semanticModel == null)
                            {
                                semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken).ConfigureAwait(false);
                            }

                            if (IsMemberSerializationArgument(semanticModel, attributeArgument.Expression, context.CancellationToken))
                            {
                                existingArgument = attributeArgument;
                                break;
                            }
                        }
                    }

                    if (existingArgument != null)
                    {
                        var newArgument =
                            existingArgument
                            .WithExpression(expression)
                            .WithTriviaFrom(existingArgument)
                            .WithoutFormatting();

                        newAttribute = syntax.ReplaceNode(existingArgument, newArgument);
                    }
                }

                if (newAttribute == null)
                {
                    if (argumentList == null)
                    {
                        argumentList = SyntaxFactory.AttributeArgumentList();
                    }

                    NameEqualsSyntax nameEquals;
                    if (argumentList.Arguments.Any(argument => argument.NameEquals == null))
                    {
                        nameEquals = SyntaxFactory.NameEquals("MemberSerialization");
                    }
                    else
                    {
                        nameEquals = null;
                    }

                    AttributeArgumentSyntax defaultValueArgument = SyntaxFactory.AttributeArgument(nameEquals, null, expression);

                    argumentList = argumentList.AddArguments(defaultValueArgument);
                    newAttribute = syntax.WithArgumentList(argumentList);
                }

                SyntaxNode newRoot     = documentRoot.ReplaceNode(syntax, newAttribute);
                Document   newDocument = context.Document.WithSyntaxRoot(newRoot);
                context.RegisterCodeFix(CodeAction.Create("Add MemberSerialization.OptIn", _ => Task.FromResult(newDocument)), diagnostic);
            }
        }
예제 #6
0
        public override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            foreach (var diagnostic in context.Diagnostics)
            {
                if (!string.Equals(diagnostic.Id, JsonPropertyDefaultValueHandlingAnalyzer.DiagnosticId, StringComparison.Ordinal))
                {
                    continue;
                }

                var documentRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);

                AttributeSyntax syntax = documentRoot.FindNode(diagnostic.Location.SourceSpan) as AttributeSyntax;
                if (syntax == null)
                {
                    continue;
                }

                ExpressionSyntax expression =
                    SyntaxFactory.ParseExpression("global::Newtonsoft.Json.DefaultValueHandling.Ignore")
                    .WithAdditionalAnnotations(Simplifier.Annotation);

                AttributeSyntax             newAttribute = null;
                AttributeArgumentListSyntax argumentList = syntax.ArgumentList;
                if (argumentList != null)
                {
                    AttributeArgumentSyntax existingArgument = null;
                    foreach (var attributeArgument in argumentList.Arguments)
                    {
                        if (string.Equals("DefaultValueHandling", attributeArgument.NameEquals?.Name?.Identifier.ValueText, StringComparison.Ordinal))
                        {
                            existingArgument = attributeArgument;
                            break;
                        }
                    }

                    if (existingArgument != null)
                    {
                        var newArgument =
                            existingArgument
                            .WithExpression(expression)
                            .WithTriviaFrom(existingArgument)
                            .WithoutFormatting();

                        newAttribute = syntax.ReplaceNode(existingArgument, newArgument);
                    }
                }

                if (newAttribute == null)
                {
                    NameEqualsSyntax nameEquals = SyntaxFactory.NameEquals("DefaultValueHandling");

                    AttributeArgumentSyntax defaultValueArgument = SyntaxFactory.AttributeArgument(nameEquals, null, expression);

                    if (argumentList == null)
                    {
                        argumentList = SyntaxFactory.AttributeArgumentList();
                    }

                    argumentList = argumentList.AddArguments(defaultValueArgument);

                    newAttribute = syntax.WithArgumentList(argumentList);
                }

                SyntaxNode newRoot     = documentRoot.ReplaceNode(syntax, newAttribute);
                Document   newDocument = context.Document.WithSyntaxRoot(newRoot);
                context.RegisterCodeFix(CodeAction.Create("Add DefaultValueHandling.Ignore", _ => Task.FromResult(newDocument)), diagnostic);
            }
        }