跳至主要內容

語言伺服器概觀

Deno 語言伺服器提供 語言伺服器通訊協定 的伺服器實作,特別針對提供程式碼的 Deno 檢視而設計。它整合到命令列中,並可透過 lsp 子命令啟動。

大多數使用者永遠不會直接與伺服器互動,而是透過 vscode_deno 或其他 編輯器擴充功能。此文件是提供給實作編輯器客戶端的人員。

結構

當語言伺服器啟動時,會建立一個包含語言伺服器所有狀態的 LanguageServer 實例。它也定義了所有透過語言伺服器 RPC 協定由用戶端呼叫的方法。

設定

語言伺服器支援工作區的數個設定

  • deno.enable
  • deno.enablePaths
  • deno.cache
  • deno.certificateStores
  • deno.config
  • deno.importMap
  • deno.internalDebug
  • deno.codeLens.implementations
  • deno.codeLens.references
  • deno.codeLens.referencesAllFunctions
  • deno.codeLens.test
  • deno.suggest.completeFunctionCalls
  • deno.suggest.names
  • deno.suggest.paths
  • deno.suggest.autoImports
  • deno.suggest.imports.autoDiscover
  • deno.suggest.imports.hosts
  • deno.lint
  • deno.tlsCertificate
  • deno.unsafelyIgnoreCertificateErrors
  • deno.unstable

語言伺服器支援每個資源的設定

  • deno.enable
  • deno.enablePaths
  • deno.codeLens.test

在 Deno 分析這些設定的過程中,有幾個點。首先,當用戶端發出 initialize 要求時,initializationOptions 會假設為一個代表選項的 deno 命名空間的物件。例如,下列值

{
"enable": true,
"unstable": true
}

會針對語言伺服器這個實例啟用 Deno 和不穩定的 API。

當語言伺服器收到 workspace/didChangeConfiguration 通知時,它會評估用戶端是否已指出它具有 workspaceConfiguration 功能。如果有的話,它會傳送一個 workspace/configuration 要求,其中會包含工作區組態的要求,以及語言伺服器目前追蹤的所有 URI 的組態。

如果用戶端具有 workspaceConfiguration 功能,語言伺服器會在收到 textDocument/didOpen 通知時傳送一個 URI 的組態要求,以取得資源的特定設定。

如果客戶端沒有 workspaceConfiguration 功能,語言伺服器會假設工作區設定套用至所有資源。

指令

語言伺服器可能會向客戶端發出多個指令,而客戶端預期會實作這些指令

  • deno.cache - 當有未快取的模組識別碼匯入模組時,會將此指令作為解析程式碼動作傳送。它會傳送一個引數,其中包含要快取的解析識別碼字串。
  • deno.showReferences - 此指令會作為某些程式碼鏡片的指令傳送,用於顯示參考位置。引數包含指令的主旨識別碼、目標的起始位置和要顯示的參考位置。
  • deno.test - 此指令會作為測試程式碼鏡片的一部分傳送,客戶端預期會根據引數執行測試,這些引數包括包含測試的識別碼和用於過濾測試的測試名稱。

要求

LSP 目前支援下列自訂要求。客戶端應實作這些要求,才能與 Deno 充分整合,並擁有完整運作的客戶端

  • deno/cache - 此指令會指示 Deno 嘗試快取模組及其所有相依性。如果只傳遞 referrer,則會載入模組識別碼的所有相依性。如果 uris 中有值,則只會快取那些 uris

    它預期的參數為

    interface CacheParams {
    referrer: TextDocumentIdentifier;
    uris: TextDocumentIdentifier[];
    }
  • deno/performance - 要求傳回 Deno 內部儀器的計時平均值。

    它不預期任何參數。

  • deno/reloadImportRegistries - 重新載入匯入登錄檔中的任何快取回應。

    它不預期任何參數。

  • deno/virtualTextDocument - 從 LSP 要求虛擬文字文件,這是一個唯讀文件,可以在客戶端顯示。這允許客戶端存取 Deno 快取中的文件,例如遠端模組和內建於 Deno 中的 TypeScript 函式庫檔案。Deno 語言伺服器會將所有內部檔案編碼在自訂架構 deno: 下,因此客戶端應將所有 deno: 架構的請求路由回 deno/virtualTextDocument API。

    它還支援 deno:/status.md 的特殊 URL,該 URL 提供標記格式的文字文件,其中包含供使用者顯示的 LSP 狀態詳細資料。

    它預期的參數為

    interface VirtualTextDocumentParams {
    textDocument: TextDocumentIdentifier;
    }
  • deno/task - 要求傳回可用的 deno 任務,請參閱 task_runner

    它不預期任何參數。

通知

目前有一個自訂通知從伺服器傳送至客戶端

  • deno/registryState - 當 deno.suggest.imports.autoDiscovertrue 且要新增至文件的匯入來源未明確設定在 deno.suggest.imports.hosts 中時,將會檢查來源,並將通知傳送至客戶端以了解狀態。

    收到通知時,如果參數 suggestiontrue,客戶端應提供使用者選擇啟用來源並將其新增至 deno.suggest.imports.hosts 的組態。如果 suggestionfalse,客戶端應將其新增至組態為 false,以停止語言伺服器嘗試偵測是否支援建議。

    通知的參數為

    interface RegistryStatusNotificationParams {
    origin: string;
    suggestions: boolean;
    }

語言 ID

語言伺服器支援下列 文字文件語言 ID 的診斷和格式化

  • "javascript"
  • "javascriptreact"
  • "jsx" 非標準,與 javascriptreact 相同
  • "typescript"
  • "typescriptreact"
  • "tsx" 非標準,與 typescriptreact 相同

語言伺服器僅支援下列語言 ID 的格式化

  • "json"
  • "jsonc"
  • "markdown"