【发布时间】:2021-06-13 07:43:48
【问题描述】:
所以:
- C# 编译器输出(行、列)样式位置。
- Roslyn API 需要连续的文本位置
如何将前者映射到后者?
C# 代码可以是带或不带 BOM 的 UTF8,甚至可以是 UTF16。它可以包含 cmets 或嵌入字符串形式的各种字符。
让我们假设我们知道编码并且有相应的Encoding 对象方便。我可以将文件字节转换为char[]。问题是某些字符可能对最终的顺序位置贡献为零。我知道 BOM 字符可以。我不知道其他人是否也可以。
现在,如果我们确定 BOM 是唯一对长度贡献为 0 的字符,那么我可以跳过它并计算字符数,我的问题就变得微不足道了。这就是我今天要做的——我只是假设 BOM 是唯一的“坏”玩家。
但也许有更好的方法?也许 Roslyn API 包含一些隐藏的宝石,它知道接受(行、列)的更改并吐出顺序位置?或者可能是一些Microsoft.Build 库?
编辑 1
根据接受的答案,以下给出了位置:
var srcText = SourceText.From(File.ReadAllText(err.FilePath));
int location = srcText.Lines[err.Line - 1].Start + err.Column - 1;
【问题讨论】:
-
肮脏的生意。每个编码都实现了抽象的Decoder 类GetCharCount 方法。例如,
Encoding.UTF8.GetCharCount()。那里的注释和GetBytes 中的过程可以给你一个想法。如果Encoding.[SomeEncoding].GetCharCount()还不够(标准实现),那么对当前问题进行更实用的描述可能会有所帮助。 -
很公平。我会修改问题以反映真正的问题。
-
@Jimi - 我修改了这个问题。非常感谢。
标签: c# text build internationalization roslyn