语言服务器概述
Deno 语言服务器提供了一个 语言服务器协议 的服务器实现,专门针对提供代码的 Deno 视图。它集成到命令行中,可以通过 lsp 子命令启动。
大多数用户永远不会直接与服务器交互,而是通过 vscode_deno 或其他 编辑器扩展 进行交互。本文档面向那些实现编辑器客户端的人。
结构
启动语言服务器时,会创建一个 LanguageServer 实例,它保存语言服务器的所有状态。它还定义了客户端通过语言服务器 RPC 协议调用的所有方法。
设置
语言服务器支持工作区的一些设置
deno.enabledeno.enablePathsdeno.cachedeno.certificateStoresdeno.configdeno.importMapdeno.internalDebugdeno.codeLens.implementationsdeno.codeLens.referencesdeno.codeLens.referencesAllFunctionsdeno.codeLens.testdeno.suggest.completeFunctionCallsdeno.suggest.namesdeno.suggest.pathsdeno.suggest.autoImportsdeno.suggest.imports.autoDiscoverdeno.suggest.imports.hostsdeno.lintdeno.tlsCertificatedeno.unsafelyIgnoreCertificateErrorsdeno.unstable
语言服务器支持在每个资源的基础上设置
deno.enabledeno.enablePathsdeno.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/virtualTextDocumentAPI。它还支持一个特殊的 URL
deno:/status.md,它提供一个包含有关 LSP 状态详细信息的 Markdown 格式文本文档,供用户显示。它期望以下参数
interface VirtualTextDocumentParams {
textDocument: TextDocumentIdentifier;
} -
deno/task- 请求返回可用的 Deno 任务,请参阅 task_runner。它不期望任何参数。
通知
目前有一个自定义通知从服务器发送到客户端。
-
deno/registryState- 当deno.suggest.imports.autoDiscover为true且要添加到文档中的导入的来源未在deno.suggest.imports.hosts中显式设置时,将检查来源并向客户端发送状态通知。当收到通知时,如果参数
suggestion为true,客户端应向用户提供选择,以启用源并将其添加到deno.suggest.imports.hosts的配置中。如果suggestion为false,客户端应将其添加到配置中,值为false,以阻止语言服务器尝试检测是否支持建议。通知的参数为
interface RegistryStatusNotificationParams {
origin: string;
suggestions: boolean;
}
语言 ID
语言服务器支持以下文本文档语言 ID的诊断和格式化
"javascript""javascriptreact""jsx"非标准,与javascriptreact相同"typescript""typescriptreact""tsx"非标准,与typescriptreact相同
语言服务器仅支持以下语言 ID 的格式化
"json""jsonc""markdown"