如何将C#编译器错误位置(行、列)映射到Roslyn API生成的语法树上?

如何将C#编译器错误位置(行、列)映射到Roslyn API生成的语法树上?,c#,text,build,internationalization,roslyn,C#,Text,Build,Internationalization,Roslyn,因此: C#编译器输出(行、列)样式的位置 Roslyn API需要顺序文本位置 如何将前者映射到后者 C代码可以是UTF8,带或不带BOM,甚至可以是UTF16。它可以包含注释或嵌入字符串形式的各种字符 让我们假设我们知道编码,并且手头有相应的编码对象。我可以将文件字节转换为char[]。问题是,某些字符可能对最终顺序位置贡献零。我知道BOM字符是这样的。我不知道其他人是否也会 现在,如果我们确定BOM是唯一一个长度为0的字符,那么我可以跳过它并计算字符,我的问题就变得无关紧要了。这就是我

因此:

  • C#编译器输出(行、列)样式的位置
  • Roslyn API需要顺序文本位置
如何将前者映射到后者

C代码可以是UTF8,带或不带BOM,甚至可以是UTF16。它可以包含注释或嵌入字符串形式的各种字符

让我们假设我们知道编码,并且手头有相应的
编码
对象。我可以将文件字节转换为
char[]
。问题是,某些字符可能对最终顺序位置贡献零。我知道BOM字符是这样的。我不知道其他人是否也会

现在,如果我们确定BOM是唯一一个长度为0的字符,那么我可以跳过它并计算字符,我的问题就变得无关紧要了。这就是我今天所做的——我只是假设BOM是唯一的“坏”玩家

但也许有更好的办法?也许Roslyn API包含一些隐藏的gem,它们知道接受(行、列)更改并显示顺序位置?或者是微软的一些
Build

编辑1

根据接受的答案,以下给出了位置:

var srcText = SourceText.From(File.ReadAllText(err.FilePath));
int location = srcText.Lines[err.Line - 1].Start + err.Column - 1;

您已经揭示了roslyn API中存在该类型的原因。它的全部目的是处理字符串编码和线、列和跨距的预成型计算


由于.NET处理unicode的方式以及操作系统中安装的代码页的不同,可能会出现
SourceText
无法满足您需要的情况。不过,对于我们的目的来说,它已经被证明“足够好了”。

糟糕的生意。每个编码实现抽象类方法。例如,
Encoding.UTF8.GetCharCount()
。这里的笔记和中的步骤可以给你一个想法。如果
Encoding.[SomeEncoding].GetCharCount()
还不够(标准实现),那么对手头的问题进行更实际的描述可能会有所帮助。这很公平。我将修改这个问题以反映真正的问题。@Jimi-我修改了这个问题。非常感谢,很有趣。我需要检查一下。你有一个示例代码吗?