roslyn - 为什么 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 代码的评论将不胜感激,只是学习代码修改的技巧。
解决方案
推荐阅读
- java - LazyInitializationException:跨多个 EJB 的事务
- javascript - 关于如何禁用文本字段而不影响其他人的 Jquery 单选按钮
- node.js - Powershell 不显示 gulp 任务的值
- networking - 在 getInetAddress() 中获取 ip6 格式
- javascript - 如何在xslt2.0中使用javascript函数?
- r - API调用问题
- sharepoint-2016 - 尝试在 SharePoint 管理中心创建网站集时出错
- jquery - 在 Jquery / Ajax 中使用 for 循环动态创建行
- python - 通过 Python win32com 从 Outlook 中读取联系人详细信息
- node.js - 如何以编程方式使用节点 js 使用 gnupg 创建密钥对?