如何使用 Roslyn 将语句插入具有规范化空白的块中?

How do I insert a statement into a block with normalized whitespace using Roslyn?

我是罗斯林的新手。我正在编写一个代码修复提供程序来转换 foreach 块,这些块迭代 Select 的结果,例如

foreach (var item in new int[0].Select(i => i.ToString()))
{
    ...
}

foreach (int i in new int[0])
{
    var item = i.ToString();
    ...
}

为此,我需要在代表 foreach 块的 ForEachStatementSyntax 内的 BlockSyntax 开头插入一条语句。这是我的代码:

var blockStatement = forEach.Statement as BlockSyntax;
if (blockStatement == null)
{
    return document;
}
forEach = forEach.WithStatement(
    blockStatment.WithStatements(
        blockStatement.Statements.Insert(0, selectorStatement));

不幸的是,这样做会导致空白被关闭:

            foreach (int i in new int[0])
            {
var item = i.ToString();
                ...
            }

我用谷歌搜索了解决方案。我遇到了 this answer,建议使用 Formatter.FormatSyntaxNode.NormalizeWhitespace

那么是否可以简单地首先插入带有正确缩进的语句,而无需格式化其他代码?

谢谢。

您可以添加 Formatter Annotation to the nodes that you want the formatter to run on using WithAdditionalAnnotations

blockStatement.Statements.Insert(0, selectorStatement.WithAdditionalAnnotations(Formatter.Annotation))