我想用Roslyn API生成语法节点,而不需要预先存在的语法节点.也就是说,我不能简单地在现有对象上使用WithXYZ()方法来修改它,因为没有现有对象.
例如,我想生成一个InvocationExpressionSyntax对象.假设有一个构造函数,我可以做类似的事情
var invoke = new InvocationExpressionSyntax(expression, arguments);
Run Code Online (Sandbox Code Playgroud)
但构造函数InvocationExpressionSyntax似乎不公开.
http://www.philjhale.com/2012/10/getting-started-with-roslyn.html
这个博客建议我可以使用像这样的API
Syntax.InvocationExpression()
Run Code Online (Sandbox Code Playgroud)
但是我没有看到Syntax引用的内容,我在Roslyn API中看不到任何与它类似的内容.
我确实找到了允许我这样做的Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory
var invoke = SyntaxFactory.InvocationExpression().WithExpression(expression);
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好.也Microsoft.CodeAnalysis.CSharp.SyntaxFactory有人想知道.
是SyntaxFactory创建新语法节点的正确方法吗?
我找到SyntaxFactory.InvocationExpression的方法是查看src/Compilers/VisualBasic/Portable目录下的roslyn源代码(https://github.com/dotnet/roslyn)中的PublicAPI.txt文件.否则,我看不到记录在哪里SyntaxFactory.
Joh*_*ner 18
正如另一个答案所述,这SyntaxFactory是正确的使用类别.正如您所发现的,有两种语法工厂可用,Microsoft.CodeAnalysis.CSharp.SyntaxFactory并且Microsoft.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)));
Run Code Online (Sandbox Code Playgroud)
如果您不确定如何为某些特定代码生成节点,Kirill Osenkov 在GitHub上创建了Roslyn Quoter项目,您可以使用该项目SyntaxFactory为您生成代码.
如果您想进一步阅读,我最近就此主题撰写了一篇博文.
| 归档时间: |
|
| 查看次数: |
2801 次 |
| 最近记录: |