2015-09-14 11 views
5

既存の構文ノードを持たずにRoslyn APIで構文ノードを生成したいと考えています。つまり、既存のオブジェクトが存在しないため、既存のオブジェクトに対してWithXYZ()メソッドを使用するだけでは変更できません。Roslynで構文ノードをゼロから作成するにはどうすればよいですか?

たとえば、InvocationExpressionSyntaxオブジェクトを生成したいとします。コンストラクタが利用可能であったと仮定すると、私は

var invoke = new InvocationExpressionSyntax(expression, arguments); 

ような何かを行うことができます。しかしInvocationExpressionSyntaxのコンストラクタは、公開されないようです。

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

このブログは、私は、このような

Syntax.InvocationExpression() 

としてAPIを使用することができることを示唆しているが、私はSyntaxが参照するか見ていない、と私はそれに似ている何も表示されません。 Roslyn API。

私は私が

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

を行うことができますそして、これが私のために十分に機能Microsoft.CodeAnalysis.VisualBasic.SyntaxFactoryを見つけました。疑問のある人にはMicrosoft.CodeAnalysis.CSharp.SyntaxFactoryもあります。

SyntaxFactoryは新しい構文ノードを作成する適切な方法ですか?

SyntaxFactory.InvocationExpressionが見つかったのは、src/Compilers/VisualBasic/Portableディレクトリのroslynソースコード(https://github.com/dotnet/roslyn)のPublicAPI.txtファイルです。さもなければ、私はSyntaxFactoryが文書化されるところを見ません。

答えて

5

はい、SyntaxFactoryタイプは、構文ノードをゼロから作成する方法です。

9

もう1つの答えとして、SyntaxFactoryが正しいクラスです。あなたが使用している言語に応じて、利用可能な2つの構文ファクトリ、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))); 

あなたには、いくつかの特定のコードのためのノードを生成する方法がわからない場合は、キリルOsenkovはGitHubの上Roslyn Quoter projectを作成し、そのことができますあなたのためにSyntaxFactoryコードを生成するために使用してください。

さらに詳しくお知りになりたい場合は、最近このトピックについてblog postでした。

関連する問題