繁体   English   中英

如何从头开始在Roslyn中创建语法节点?

[英]How do I create syntax nodes in Roslyn from scratch?

我想用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的记录位置。

正如另一个答案所述, 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项目 ,您可以使用该SyntaxFactory为您生成SyntaxFactory代码。

如果您想进一步阅读,我最近就此主题撰写了一篇博文

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM