3

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 には解析タスクがないと決めたからです。誰かがこれらの特別なステートメントを処理する方法を知っていますか? あるいは、誰かがこの問題を処理する別の方法を提案できるかもしれません。どんな助けでも感謝します。前もって感謝します。

4

1 に答える 1

3

問題は、左中括弧も右中括弧もステートメントではないため、ステートメントとして解析できないことです。

Roslyn は無効なコードでも解析しようとしBlockSyntaxます{。しかし、これは不完全なブロックであり、右中括弧がありません。

メソッド本体全体を一度に解析する必要があると思います。行を結合して 1 つの文字列にし、左中括弧と右中括弧を追加することで、これを行うことができます。

したがって、実際にステートメントとして解析する文字列は次のようになります。

{
if (this.field != null)
{
this.field = new MyType();
}
return this.field;
}
于 2012-07-09T13:33:53.513 に答える