无法解析的代码片段罗斯林(Unable to parse code snippet in rosly

2019-09-29 06:46发布

我试图从小块代码动态建立一个C#类。 我们有一个窗口,用户可以进入C#代码(有效与否),我们分析这些字符串放到罗斯林。 我最近发现一个问题,当我使用这个:

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面临着同样的问题。

谢谢你的帮助 :)

文章来源: Unable to parse code snippet in roslyn