簡體   English   中英

如何將 map C# 編譯器錯誤位置(行、列)放到 Roslyn API 生成的 SyntaxTree 上?

[英]How to map C# compiler error location (line, column) onto the SyntaxTree produced by Roslyn API?

所以:

  • C# 編譯器輸出(行、列)樣式位置。
  • Roslyn API 需要順序文本位置

map如何將前者轉為后者?

C# 代碼可以是帶或不帶 BOM 的 UTF8,甚至可以是 UTF16。 它可以包含注釋或嵌入字符串形式的各種字符。

讓我們假設我們知道編碼並且有相應的Encoding object 方便。 我可以將文件字節轉換為char[] 問題是某些字符可能對最終的順序 position 貢獻為零。 我知道 BOM 字符可以。 我不知道其他人是否也可以。

現在,如果我們確定 BOM 是唯一對長度貢獻為 0 的字符,那么我可以跳過它並計算字符數,我的問題就變得微不足道了。 這就是我今天所做的——我只是假設 BOM 是唯一的“壞”玩家。

但也許有更好的方法? 也許 Roslyn API 包含一些隱藏的寶石,它們知道接受(行、列)的更改並吐出順序的 position? 或者也許是一些Microsoft.Build庫?

編輯 1

根據接受的答案,以下給出了位置:

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

您已經發現了 roslyn api 中存在SourceText類型的原因。 它的全部目的是處理字符串的編碼和行、列和跨度的預計算。

由於 .NET 處理 unicode 的方式,並且根據您的操作系統中安裝的代碼頁, SourceText可能無法滿足您的需求。 不過,對於我們的目的,它通常已被證明“足夠好”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM