Roslyn - 替换节点并修复空格

mac*_*pak 5 code-formatting roslyn

在我的程序中,我使用 Roslyn,并且需要用新节点替换节点。例如,如果我有类似的代码

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

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

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

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

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

但是,我希望 for 语句格式正确。有任何提示如何做吗?

编辑:我通过使用解决了它:

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())
);
Run Code Online (Sandbox Code Playgroud)

不过,Sam的回答也是正确的。

Sam*_*ell 5

您需要使用.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);
Run Code Online (Sandbox Code Playgroud)