【问题标题】:How do I create syntax nodes in Roslyn from scratch?如何从头开始在 Roslyn 中创建语法节点?
【发布时间】:2015-09-14 19:49:54
【问题描述】:

我想在没有预先存在的语法节点的情况下使用 Roslyn API 生成语法节点。也就是说,我不能简单地对现有对象使用 WithXYZ() 方法来修改它,因为没有现有对象。

例如,我想生成一个 InvocationExpressionSyntax 对象。假设构造函数可用,我可以做类似的事情

var invoke = new InvocationExpressionSyntax(expression, arguments);

InvocationExpressionSyntax 的构造函数似乎不公开。

http://www.philjhale.com/2012/10/getting-started-with-roslyn.html

这个博客建议我可以使用一个 API,例如

Syntax.InvocationExpression()

但我看不到 Syntax 指的是什么,而且我在 Roslyn API 中看不到任何类似的东西。

我确实找到了可以让我这样做的 Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory

var invoke = SyntaxFactory.InvocationExpression().WithExpression(expression);

这对我来说已经足够好了。还有Microsoft.CodeAnalysis.CSharp.SyntaxFactory 供任何想知道的人使用。

SyntaxFactory 是创建新语法节点的正确方法吗?

我找到 SyntaxFactory.InvocationExpression 的方法是查看 src/Compilers/VisualBasic/Portable 目录下 roslyn 源代码 (https://github.com/dotnet/roslyn) 中的 PublicAPI.txt 文件。否则,我看不到 SyntaxFactory 记录在哪里。

【问题讨论】:

    标签: c# vb.net roslyn


    【解决方案1】:

    正如另一个答案所述,SyntaxFactory 是正确使用的类。如您所见,有两个可用的语法工厂,Microsoft.CodeAnalysis.CSharp.SyntaxFactoryMicrosoft.CodeAnalysis.VisualBasic.SyntaxFactory,具体取决于您使用的语言。

    通常对SyntaxFactory 的调用被链接在一起,因此您最终会多次调用SytnaxFactory 方法来生成甚至简单的代码行。例如,代码Console.WriteLine("A"); 将由以下对语法工厂的调用表示:

    var console = SyntaxFactory.IdentifierName("Console");
    var writeline = SyntaxFactory.IdentifierName("WriteLine");
    var memberaccess = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, console, writeline);
    
    var argument = SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal("A")));
    var argumentList = SyntaxFactory.SeparatedList(new[] { argument });
    
    var writeLineCall =
        SyntaxFactory.ExpressionStatement(
        SyntaxFactory.InvocationExpression(memberaccess,
        SyntaxFactory.ArgumentList(argumentList)));
    

    如果您不确定如何为某些特定代码生成节点,Kirill Osenkov 在 GitHub 上创建了 Roslyn Quoter project,您可以使用它为您生成 SyntaxFactory 代码。

    如果您想进一步阅读,我最近就这个主题做了blog post

    【讨论】:

    • 您知道使用 Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory 的任何示例吗?
    【解决方案2】:

    是的,SyntaxFactory 类型是从头开始创建语法节点的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2021-04-12
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多