Не все InvocationExpression переписаны - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу переписать все InvocationExpression «MyMethod» в SyntaxTree, чтобы добавить буквальный параметр 0 с

private class Rewriter : CSharpSyntaxRewriter
    {
        public int Id { get; set; }
        public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
        {
            var invokName = node.Expression.ToString();
            if (invokName == "MyMethod")
            {
                var argus = node.ArgumentList.AddArguments(
SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(Id))));
                return node.Update((ExpressionSyntax)Visit(node.Expression), argus);
            }
            return node;
        }
    }
    static void Main(string[] args)
    {
        SyntaxTree oriTree = CSharpSyntaxTree.ParseText(@"
        public class MyClass
        {
            public string MyMethod(int id)
            {
                return $""{id}"";
            }
            public void Say()
            {
                var tmp = MyMethod();//worked
                var tmp1 = MyMethod();//worked
                var tmp2 = ""Hi "" + MyMethod();//worked
                Console.WriteLine($""Say {MyMethod()}"");//Not worked
                Console.WriteLine(""Hello "" + MyMethod());//Not worked                    
            }
        }");
        var syntaxRoot = oriTree.GetCompilationUnitRoot();
        var visitor = new Rewriter();
        visitor.Id = 0;
        var changedSyntaxTree = visitor.Visit(syntaxRoot).SyntaxTree;
    }

Но не все переписываются.

С

var methods = syntaxRoot.DescendantNodes().OfType<InvocationExpressionSyntax>().Where(o => o.Expression.ToString() == "MyMethod");

Я могу перечислить все InvocationExpression из "MyMethod". Но я не знаю, как изменить синтаксическое дерево без CSharpSyntaxRewriter.

Как я могу это сделать? Спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Это решено на основе ответа Сайруса Наймабади

Вам нужно сделать это вместо этого:

      public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
        {
            node = (InvocationExpressionSyntax)base.VisitInvocationExpression(node);
            // now, the rest of your code:
            var invokName = node.Expression.ToString();
            // etc.

Спасибо CyrusNajmabadi!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...