1

小さなコードから ac# クラスを動的に構築しようとしています。ユーザーが c# コード (有効かどうかに関係なく) を入力できるウィンドウがあり、これらの文字列を roslyn に解析します。私は最近、これを使用していたときに問題を発見しました:

public override IEnumerable<StatementSyntax> GenerateStatements()
{
    var result = new List<StatementSyntax>();
    if (!string.IsNullOrWhiteSpace(this.Tag.Code))
    {
        result.Add(SyntaxFactory.ParseStatement(this.Tag.Code));
    }

    return result;
}  

VB でコンパイルすると、ステートメントが複数行の場合、C# であってもすべてのテキストがインライン化されます。

次に、ヘルパー クラスを作成してダミー クラスとメソッドに解析し、解析されたステートメントのリストを取得しました。

public override IEnumerable<StatementSyntax> GenerateStatements()
{
    var result = new List<StatementSyntax>();
    if (!string.IsNullOrWhiteSpace(this.Tag.Code))
    {
        foreach (var statement in SyntaxFactoryHelper.ParseStatements(this.Tag.Code))
        {
            result.Add(statement);
        }
    }

    return result;
}

public static StatementSyntax[] ParseStatements(string code)
{
    var blockCode = string.Format(CultureInfo.InvariantCulture, "public class C {{ public void M() {{ {0} }} }}", code);
    var compilationUnit = SyntaxFactory.ParseCompilationUnit(blockCode);
    return compilationUnit
        .ChildNodes().OfType<ClassDeclarationSyntax>().First(c => c.Identifier.Text == "C")
        .ChildNodes().OfType<MethodDeclarationSyntax>().First(m => m.Identifier.Text == "M")
        .ChildNodes().OfType<BlockSyntax>().First()
        .Statements.ToArray();
}

これが私の問題です。

アプリケーションに 3 つのステートメントがあるとします。

for (var i = 0; i < 10; i++)
{

それから

i.ToString()

そして最後に

}

最初のステートメントの中括弧が自動的に閉じられるため、スコープが失われます。

無効なコードを解析して、この種の動作を回避する方法はありますか?

インライン コードが C# で有効であることは知っていますが、VB でも同じ問題に直面しています。

ご協力いただきありがとうございます :)

4

0 に答える 0