2017-04-10 77 views
0

我已經實現了一個提供一些linting的語言服務器。 linter檢查所需的屬性併發出「缺失的屬性」錯誤。我想爲這些錯誤提供相應的「插入缺失屬性」快速修復。如何通過語言服務器實現quickfix

我覺得LSP協議面積一般意味着是這樣的:

textDocument/codeAction

這樣,服務器可以做一個「丟失的財產」的診斷標記返回一個「插入缺失屬性」命令。

但是,服務器如何實現'insert missing property'命令本身?

翻看lsp規範,我找不到任何讓服務器註冊命令的東西。

我沒有找到有關客戶端上這裏登記命令vscode API的一些信息:https://code.visualstudio.com/docs/extensionAPI/vscode-api

所以我想我可以註冊並執行「插入缺失的屬性」的客戶端,但...

客戶端只是將大部分工作委託給服務器的「愚蠢」包裝器。因此,它並不真正理解文檔結構,也不是一個非常好的地方來實現需要理解該結構的文檔轉換。

看來我最好的選擇是向我的語言服務器添加一些'自定義'協議,這樣我就可以在客戶端實現'插入缺少屬性'命令,但委託計算quickfix編輯的難題回到服務器。

或...有沒有更好的方法?

回答

0

是的還有一種更好的方式,它不需要任何自定義協議擴展。這些大致步驟如下:

首先確保您的vscode擴展的package.json具有最新的語言服務器客戶端。礦山使用版本3.2.x。我還需要將vscode引擎版本更新爲1.6.x。這裏是一個example package.json

現在我們可以使用Version 3(只寫本書時的草稿,但已經可以使用)的語言服務器協議。這些都是有趣的作品:

  • textDocument/codeAction:實現這個在服務器端的計算代表了快速修復命令的列表。

  • workspace/executeCommand:在服務器端執行此命令來執行命令。它可以使用workspace/applyEdit向客戶端發送請求,以對工作區中的文檔執行更改。

  • client/registerCapability:服務器可以使用ExecuteCommandRegistrationOptions對象調用此對象。這會向客戶端註冊您的服務器端命令,以便它知道通過上一步中實現的workspace/executeCommand處理程序來執行它們。

  • initialize:或者使用client/registerCapability也可以通過用其executeCommandProvider屬性的適當的設置返回WorkspaceCapabilities對象註冊服務器端的命令。這種方法稍微不復雜(但只能在不需要動態註冊/取消註冊命令的情況下使用)。

另請參閱此vscode issue ticket關於實現quickfixes的主題。

重要提示:語言服務器客戶端實現的3.2.0版本有一個bug,它使用了錯誤的名稱client/registerFeature而不是client/registerCapability所以你可能要解決的是,直到錯誤是固定的。如果你使用initialize方法,那麼你不會受到這個錯誤的影響。