【问题标题】:How to map C# compiler error location (line, column) onto the SyntaxTree produced by Roslyn API?如何将 C# 编译器错误位置(行、列)映射到 Roslyn API 生成的 SyntaxTree?
【发布时间】: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;

【问题讨论】:

  • 肮脏的生意。每个编码都实现了抽象的DecoderGetCharCount 方法。例如,Encoding.UTF8.GetCharCount()。那里的注释和GetBytes 中的过程可以给你一个想法。如果Encoding.[SomeEncoding].GetCharCount() 还不够(标准实现),那么对当前问题进行更实用的描述可能会有所帮助。
  • 很公平。我会修改问题以反映真正的问题。
  • @Jimi - 我修改了这个问题。非常感谢。

标签: c# text build internationalization roslyn


【解决方案1】:

您已经发现了 SourceText 类型存在于 roslyn api 中的原因。它的全部目的是处理字符串的编码和行、列和跨度的预计算。

由于 .NET 处理 unicode 的方式以及根据您的操作系统中安装的代码页,SourceText 可能无法满足您的需求。不过,对于我们的目的,它通常已被证明“足够好”。

【讨论】:

  • 有趣。我需要检查一下。有示例代码吗?
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2018-05-20
  • 2015-06-19
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多