在本页

语言服务器概述

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。

    它还支持一个特殊的 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"