外掛作者文件

如果您透過編寫編輯器外掛將 gopls 整合到編輯器中,那麼編輯器和 gopls 之間的通訊語義有相當一部分並未在 LSP 規範 中進行說明。

我們在此嘗試記錄這些細節以及對其他外掛作者有幫助的任何其他資訊。

如果您正在自己實現外掛,並且有本頁面未解答的問題,請聯絡我們提問,然後也請將您的發現貢獻回本頁面。

支援的功能

在大多數情況下,您應該檢視 功能索引 來了解 gopls 是否支援某項功能。

要獲得真正權威的答案,您應該檢視 initialize 請求的 結果,其中 gopls 在 ServerCapabilities 中列出了其支援情況。

位置和範圍

許多 LSP 請求會傳遞位置或範圍資訊。這在 LSP 規範 中有描述。

文件中的一個位置(參見下面的 Position 定義)表示為一個基於零的行和字元偏移量。偏移量基於 UTF-16 字串表示。因此,像 a𐐀b 這樣的字串,字元 a 的字元偏移量是 0,字元 𐐀 的字元偏移量是 1,字元 b 的字元偏移量是 3,因為 𐐀 在 UTF-16 中用兩個程式碼單元表示。

這意味著整合者需要計算基於 UTF-16 的列偏移量。請使用 protocol.Mapper 進行所有轉換。

編輯

為了將 gopls 的更改傳達給編輯器,LSP 在響應中支援 TextEdit 陣列,這些 TextEdit 的定義在 TextEdit 中。規範精確說明了如何應用這些 TextEdit

所有文字編輯的範圍都引用原始文件中的位置。文字編輯的範圍絕不能重疊,這意味著原始文件的任何部分都不能被多個編輯進行修改。但是,多個編輯可以具有相同起始位置:多個插入,或任意數量的插入後跟單個刪除或替換編輯。如果多個插入具有相同的位置,則陣列中的順序定義了插入的字串在結果文字中出現的順序。

所有 []TextEdit 都經過排序,以便反向應用接收到的增量陣列可以實現符合規範的期望結果。

Errors

各種錯誤程式碼在 LSP 規範 中進行了描述。我們仍在確定一個方法返回錯誤意味著什麼;錯誤是否僅用於低階 LSP/傳輸問題,還是其他情況也會導致返回錯誤?有關此問題的討論,請參見 #31526

目前選擇的方法受到當前流行的編輯器整合中實際處理方式的影響。它很可能會發生變化,並且理想情況下會跨請求變得更加一致。

檔案監控

gopls 所依賴的檔案在其關聯的編輯器外被修改是很常見的情況。

例如,進行正確型別檢查所需的檔案會在切換 git 分支時被修改,或者會被程式碼生成器更新。

直接監控 gopls 內部的檔案存在許多棘手的問題,但 LSP 規範 提供了允許 gopls 請求客戶端通知其檔案系統更改的方法,特別是 workspace/didChangeWatchedFiles。目前,社群成員正在 gopls 中新增此功能,該功能已在 #31553 中跟蹤。


本文件的原始碼可以在 golang.org/x/tools/gopls/doc 下找到。