c# - 使用 Roslyn 使用 CSharpSyntaxRewriter 重写标识符名称时如何防止_loosing_缩进(WhiteSpaceTrivia)

标签 c# roslyn

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

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

请不要建议格式化整个文档,因为这对我来说不是一个选项: 我想保留所有 原始文档中应用的格式。我想“只是”重命名标识符并保持所有其他方面不变。

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

    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());

感谢所有试过这个数字的人...

关于c# - 使用 Roslyn 使用 CSharpSyntaxRewriter 重写标识符名称时如何防止_loosing_缩进(WhiteSpaceTrivia),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23560089/

相关文章:

c# - Roslyn CTP - 随机代码修改

c# - 如何在 OPENXML 电子表格单元格中插入换行符?

c# - 如何表示 B 树节点?

c# - 如何在 Roslyn 上获取扩展方法?

c# - 使用 Roslyn API 读取 *.csproj 属性值?

roslyn - SyntaxRewriter 和多个语句

c# - 仅在“编辑并继续”中出现错误 CS7038(无法发出模块)

c# - 如何在 C# 中调用 protected 构造函数?

c# - Azure WebJob 运行后更新 UI

c# - 即使在释放资源后也无法关闭 excel