首页 > 解决方案 > 为什么 Roslyn 不尊重空白琐事,而是强制制表符缩进?

问题描述

我正在开发一个小爱好项目,试图将 C# 降低到可在此存储库中编译到 NES 。在提交9b532f739be时,我的第一个 Code Fix Provider 上的一些单元测试失败,只是因为 Roslyn在 ForbidMuliplicationCodeFixProvider.cs 文件的第 90 行中忽略了来自我想要替换的节点的空白琐事。我还尝试了 NormalizeWhiteSpace 在新节点上具有相同的 WhiteSpaceTrivia 缩进大小,以及其他几次失败的尝试,但最终总是在修改后的文档上出现标准制表符大小的缩进。我必须忍受这个小虫子吗?

  var assignment = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, variableIdentifier, invocation);
  assignment = assignment.WithTriviaFrom(node);
  var syntaxRoot = await document.GetSyntaxRootAsync();
  var modifiedRoot = syntaxRoot.ReplaceNode(node, assignment);

  var modifiedDocument = document.WithSyntaxRoot(modifiedRoot);
  modifiedDocument = await AddUsingStatementAsync(cancelToken, modifiedDocument);

  return modifiedDocument;

node变量来自 WhiteSpaceTrivia 的具有 6 个空格(3 层缩进)的原始文档,本应将其复制到替换节点中,但修改后的文档的输出却有 3 个缩进制表符。

我的测试失败并显示以下消息:

The checked string has different spaces than expected one. At line 7, col 12, expected '...     test = NESMath....' was '...           test = NE...'.
The checked string:
    ["using NINNES.Platform.Shims;

namespace NINNES.RoslynAnalyzers.Tests.Assets {
  class MultiplicationAssignment {
    public void Multiply() {
      var test = 2;
            test = NESMath.Multiply(test, 42);
    }
  }
}
"]
The expected string:
    ["using NINNES.Platform.Shims;

namespace NINNES.RoslynAnalyzers.Tests.Assets {
  class MultiplicationAssignment {
    public void Multiply() {
      var test = 2;
      test = NESMath.Multiply(test, 42);
    }
  }
}
"]

顺便说一句:对 Roslyn 代码的评论将不胜感激,只是学习代码修改的技巧。

标签: roslyn

解决方案


推荐阅读