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

时间:2017-03-01 00:14:02

标签: c# .net roslyn

我是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();
    ...
}

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

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();
                ...
            }

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

  • 我无法使用Formatter.Format,因为它需要Workspace个参数,看起来我无法访问WorkspaceNormalizeWhitespace() 3}}

  • 我尝试在文档的语法根目录上使用ForEachStatementSyntax,但是有条理地格式化了与修复程序无关的其他代码。我尝试仅在与foreach块关联的syntaxRoot = syntaxRoot.ReplaceNode(oldForEach, newForEach)上使用它,然后调用foreach,但这会导致整个namespace ConsoleApp1 { class Program { static void Main(string[] args) { var array = new int[0]; int length = array.Length; foreach (int i in array) { string item = i.ToString(); } } } } 正确缩进。

    babel-node index.js
    

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

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用Formatter Annotation

WithAdditionalAnnotations添加到您希望格式化程序运行的节点上

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