3

我们正在用 roslyn 编写代码生成器。除其他事项外,用户应该能够指定方法主体的单个语句或属性的 getter/setter 主体。因此,他将字符串列表传递给翻译方法。当将单个花括号作为语句传递时,右括号会以某种方式被吞掉。

方法:

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));

我还尝试单独处理单个右大括号,但我没有设法创建一个只有一个右大括号的语句。

奇怪的是,单个左大括号被解析为语法块(正确与否),但手动创建该语法块似乎是不可能的。既不用于开口,也不用于闭合支架。

我不想添加对这些语句的自定义解析,因为我们决定让 Roslyn 摆脱解析任务。有人知道如何处理这些特殊声明吗?或者也许有人可以用另一种方法来处理这个问题。任何帮助表示赞赏。提前致谢。

4

1 回答 1

3

问题是左大括号和右大括号都不是语句,因此您不能这样解析它们。

Roslyn 甚至会尝试解析无效代码,这就是为什么您在BlockSyntaxparse 时得到 a 的原因{。但它是一个不完整的块,缺少右大括号。

我认为您应该立即解析整个方法体。您可以通过将这些线连接成一个字符串并添加一个左大括号和一个右大括号来做到这一点。

因此,您实际解析为语句的字符串如下所示:

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