Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止在使用Roslyn使用CSharpSyntaxRewriter重写标识符名称时出现缩进(WhiteSpaceTrivia)_C#_Roslyn - Fatal编程技术网

C# 如何防止在使用Roslyn使用CSharpSyntaxRewriter重写标识符名称时出现缩进(WhiteSpaceTrivia)

C# 如何防止在使用Roslyn使用CSharpSyntaxRewriter重写标识符名称时出现缩进(WhiteSpaceTrivia),c#,roslyn,C#,Roslyn,我正在实现一个CSharpSyntaxRewriter,使用Roslyn重命名变量标识符 (请注意:重写将在命令行实用程序的上下文中运行,而不是在Visual Studio CodeAction中运行) 请不要建议格式化整个文档,因为这不是我的选项: 我希望保留原始文档中应用的所有格式。我想“只是”重命名标识符,并保留所有其他方面不变 以下代码的问题是它完全修剪了行的前导缩进,如下所示:(更准确地说:我丢失了一些父级前导和尾随琐事: x = 3; 变成 y= 3; 注意缩进已经消失,

我正在实现一个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;
}
提前谢谢

这很容易

尝试后#59458结果到达:

  name = name
       .WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText)))
       .WithLeadingTrivia(name.GetLeadingTrivia())
       .WithTrailingTrivia(name.GetTrailingTrivia());
感谢所有尝试此功能的人…

您可以使用.WithTriviaFrom(name)在一次通话中复制前导和尾随的琐事。