私は、フラグメントを実行するためにLinqPadを使ってRoslynのコード生成機能を試しています。 LinqPadの.Dump()拡張メソッドは、オブジェクトのフォーマットされたビューを結果ペインにレンダリングします。Roslynの ".WithFooToken()"は不要ですか?
http://roslynquoter.azurewebsites.net/によって生成されたコードには、膨れを追加する以外の多くの機能を備えていないようなコードが多数含まれています。次のコードは、.WithFooToken(...)
呼び出しがコメントアウトされているかどうかを出力するreturn null;
を出力します。
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
var syn =
SyntaxFactory.ReturnStatement(
SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)
// .WithToken(SyntaxFactory.Token(SyntaxKind.NullKeyword))
)
// .WithReturnKeyword(
// SyntaxFactory.Token(SyntaxKind.ReturnKeyword)
// )
// .WithSemicolonToken(
// SyntaxFactory.Token(SyntaxKind.SemicolonToken)
// )
;
syn.NormalizeWhitespace().ToFullString().Dump();
このような呼び出しは、すべての言語でオプションか、Roslynサポートライブラリに組み込まれた適切なデフォルトを持つ言語に対してのみ有効ですか?
これらの呼び出しは、 'return/**/null;'のような場合には有効です。それらが常に含まれている理由については、何らかの理由で2つのケースを区別するのが難しいかもしれません。 – svick
コードが部分的にしか構成されていない場合があります。デフォルトでは、 'return'キーワードを仮定してセミコロンがあるので、デフォルトで追加しますが、セミコロンがまだ入力されていない場合はどうなりますか? 'syntax = syntax.WithSemicolonToken(SyntaxFactory.MissingToken(SyntaxKind.SemicolonToken));' –