Roslyn - 替换节点并修复空白

时间:2014-12-05 18:37:49

标签: code-formatting roslyn

在我的程序中,我使用Roslyn,我需要用新节点替换节点。例如,如果我有像

这样的代码
public void Foo()
{
   for(var i = 0; i < 5; i++)
      Console.WriteLine("");
}

我想为for语句插入括号,我得

public void Foo()
{
   for(var i = 0; i < 5; i++)
{
      Console.WriteLine("");
}
}

我尝试使用NormalizeWhitespace,但如果我在for语句中使用它,我会得到

public void Foo()
{
for(var i = 0; i < 5; i++)
{
   Console.WriteLine("");
}
}

但是,我想要正确格式化语句。有任何提示怎么做?

编辑: 我用以下方法解决了这个问题:

var blockSyntax = SyntaxFactory.Block(
            SyntaxFactory.Token(SyntaxKind.OpenBraceToken).WithLeadingTrivia(forStatementSyntax.GetLeadingTrivia()).WithTrailingTrivia(forStatementSyntax.GetTrailingTrivia()),
            syntaxNodes,
            SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithLeadingTrivia(forStatementSyntax.GetLeadingTrivia()).WithTrailingTrivia(forStatementSyntax.GetTrailingTrivia())
);

然而,Sam的回答也是正确的。

1 个答案:

答案 0 :(得分:4)

您需要使用.WithAdditionalAnnotations(Formatter.Annotation),但仅限于要格式化的特定元素。这是NullParameterCheckRefactoring项目的一个例子。

IfStatementSyntax nullCheckIfStatement = SyntaxFactory.IfStatement(
    SyntaxFactory.Token(SyntaxKind.IfKeyword),
    SyntaxFactory.Token(SyntaxKind.OpenParenToken),
    binaryExpression, 
    SyntaxFactory.Token(SyntaxKind.CloseParenToken), 
    syntaxBlock, null).WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation);