C# 如何防止在使用Roslyn使用CSharpSyntaxRewriter重写标识符名称时出现缩进(WhiteSpaceTrivia)
我正在实现一个CSharpSyntaxRewriter,使用Roslyn重命名变量标识符 (请注意:重写将在命令行实用程序的上下文中运行,而不是在Visual Studio CodeAction中运行) 请不要建议格式化整个文档,因为这不是我的选项: 我希望保留原始文档中应用的所有格式。我想“只是”重命名标识符,并保留所有其他方面不变 以下代码的问题是它完全修剪了行的前导缩进,如下所示:(更准确地说:我丢失了一些父级前导和尾随琐事:C# 如何防止在使用Roslyn使用CSharpSyntaxRewriter重写标识符名称时出现缩进(WhiteSpaceTrivia),c#,roslyn,C#,Roslyn,我正在实现一个CSharpSyntaxRewriter,使用Roslyn重命名变量标识符 (请注意:重写将在命令行实用程序的上下文中运行,而不是在Visual Studio CodeAction中运行) 请不要建议格式化整个文档,因为这不是我的选项: 我希望保留原始文档中应用的所有格式。我想“只是”重命名标识符,并保留所有其他方面不变 以下代码的问题是它完全修剪了行的前导缩进,如下所示:(更准确地说:我丢失了一些父级前导和尾随琐事: x = 3; 变成 y= 3; 注意缩进已经消失,
x = 3;
变成
y= 3;
注意缩进已经消失,标识符和赋值运算符之间的尾随空格也消失了
下面是代码,以及我尝试过的四件事(内联作为注释)都没有成功:
public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax name)
{
if (someCondition)
{
name = name.WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText)));
// Try #1: Does the same
//name = name.Update(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText)));
// Additional correction tries:
//name.NormalizeWhitespace(); // Try #2: does nothing
//name = (IdentifierNameSyntax) Formatter.Format(name, _workspace); // Try #3: does nothing
//name = name.WithAdditionalAnnotations(Formatter.Annotation); // Try #4: does nothing I suppose because we are not in a VS codeaction
}
return name;
}
提前谢谢这很容易
尝试后#59458结果到达:
name = name
.WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText)))
.WithLeadingTrivia(name.GetLeadingTrivia())
.WithTrailingTrivia(name.GetTrailingTrivia());
感谢所有尝试此功能的人…您可以使用.WithTriviaFrom(name)在一次通话中复制前导和尾随的琐事。