如何防止_loosing_缩进(WhiteSpaceTrivia)时重写标识符名称与CSharpSyntaxRewrit

本文关键字:标识符 重写 CSharpSyntaxRewrit loosing 何防止 缩进 WhiteSpaceTrivia | 更新日期: 2023-09-27 18:02:26

我正在实现一个CSharpSyntaxRewriter使用Roslyn重命名变量标识符。

(请注意:重写将在命令行实用程序的上下文中运行,而不是Visual Studio CodeAction)

请不要建议格式化整个文档,因为这不是我的选择:我希望保持所有格式化在原始文档中应用的内容。我想"只是"重命名标识符,并保留所有其他方面的完整性。

下面代码的问题是,它完全修剪了像这样的行中的前导缩进:(更正确地说:我失去了一些父母的前导和尾随琐事:

    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;
}

Thanks in advance

如何防止_loosing_缩进(WhiteSpaceTrivia)时重写标识符名称与CSharpSyntaxRewrit

这很容易…

try #59458后,结果到达:

  name = name
       .WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText)))
       .WithLeadingTrivia(name.GetLeadingTrivia())
       .WithTrailingTrivia(name.GetTrailingTrivia());