roslyn を使用してコード ジェネレーターを作成しています。とりわけ、ユーザーはメソッド本体の単一のステートメントまたはプロパティのゲッター/セッターの本体を指定できる必要があります。したがって、彼は文字列のリストを翻訳メソッドに渡します。単一の中括弧をステートメントとして渡すと、閉じ中括弧が何らかの形で飲み込まれます。
メソッド:
internal static SyntaxList<StatementSyntax> GetSyntaxListOfStatementSyntaxs(IEnumerable<string> statements)
{
if (statements.Any())
{
var statementSyntaxs = statements.Select(s => Syntax.ParseStatement(s));
return Syntax.List(statementSyntaxs);
}
return Syntax.List<StatementSyntax>();
}
入力:
var list = new List<string>
{
"if (this.field != null)",
"{",
"this.field = new MyType();",
"}",
"return this.field;"
};
SyntaxList は、新しいメソッド宣言 (最後のパラメーター) で使用されます。
var methodDeclarationSyntax = Syntax.MethodDeclaration(
Syntax.List<AttributeDeclarationSyntax>(),
Syntax.TokenList(),
Syntax.IdentifierName("MyType"),
null,
Syntax.Identifier("MethodIdentifier"),
null,
Syntax.ParameterList(),
Syntax.List<TypeParameterConstraintClauseSyntax>(),
Syntax.Block(statementSyntaxList));
また、単一の右中括弧を個別に処理しようとしましたが、右中括弧が 1 つだけのステートメントを作成できませんでした。
奇妙なことに、単一の左中括弧が構文ブロックとして解析されます (正しいかどうかに関係なく) が、その構文ブロックを手動で作成することは不可能のようです。開き括弧でも閉じ括弧でもありません。
これらのステートメントのカスタム解析を追加したくありません。なぜなら、Roslyn には解析タスクがないと決めたからです。誰かがこれらの特別なステートメントを処理する方法を知っていますか? あるいは、誰かがこの問題を処理する別の方法を提案できるかもしれません。どんな助けでも感謝します。前もって感謝します。