语言服务器概述
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.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"