[英]How to map C# compiler error location (line, column) onto the SyntaxTree produced by 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.