跳至主要内容

语言服务器概述

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
}

将为语言服务器的此实例启用具有不稳定 API 的 Deno。

当语言服务器收到 `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。

    它还支持一个特殊的 URL deno:/status.md,它提供一个包含有关 LSP 状态详细信息的 Markdown 格式文本文档,供用户显示。

    它期望以下参数

    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"