使用Roslyn用CSharpSyntaxRewriter重写标识符名称时如何防止_loosing_ indentation(WhiteSpaceTrivia)

时间:2014-05-09 08:37:31

标签: c# roslyn

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

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

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

以下代码的问题在于它完全修剪了这样的行中的前导缩进:(更正确:我正在失去一些父母领导和尾随trivias:

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

提前致谢

1 个答案:

答案 0 :(得分:2)

很容易......

尝试#59458后,结果到达:

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

感谢所有试过这个问题的人......