Roslyn-替换节点并修复空白 [英] Roslyn - replace node and fix the whitespaces
问题描述
在我的程序中,我使用Roslyn,并且需要用新节点替换一个节点。例如,如果我有这样的代码
In my program I use Roslyn and I need to replace a node with a new node. For example, if I have code like
public void Foo()
{
for(var i = 0; i < 5; i++)
Console.WriteLine("");
}
我想插入括号以供声明,我得到
and I want to insert brackes for for statement, I get
public void Foo()
{
for(var i = 0; i < 5; i++)
{
Console.WriteLine("");
}
}
我尝试使用NormalizeWhitespace,但是如果使用它在声明中,我得到
I tried to use NormalizeWhitespace, but if I use it on for statement, I get
public void Foo()
{
for(var i = 0; i < 5; i++)
{
Console.WriteLine("");
}
}
但是,我想将语句格式化正确地。
However, I'd like to have for statement formatted correctly. Any hints how to do it?
编辑:
我使用以下方法解决了这个问题:
I solved it by using:
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的答案也是正确的。
However, the answer from Sam is also correct.
推荐答案
您需要在要格式化的特定元素上使用 .WithAdditionalAnnotations(Formatter.Annotation)
。这是来自 NullParameterCheckRefactoring 项目的示例。
You need to use .WithAdditionalAnnotations(Formatter.Annotation)
, but only on the specific element you want to format. Here's an example from the NullParameterCheckRefactoring project.
IfStatementSyntax nullCheckIfStatement = SyntaxFactory.IfStatement(
SyntaxFactory.Token(SyntaxKind.IfKeyword),
SyntaxFactory.Token(SyntaxKind.OpenParenToken),
binaryExpression,
SyntaxFactory.Token(SyntaxKind.CloseParenToken),
syntaxBlock, null).WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation);
这篇关于Roslyn-替换节点并修复空白的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!