vscode-languageserver-node 中的服务器端命令如何知道哪个是当前文档?

How does a server-side command in vscode-languageserver-node know which is the current document?

我正在为 vscode 开发 DSL 的语言扩展。该架构使用来自微软 github 的 vscode-languageserver-node 基础设施,带有一个可以评估 DSL 的 REST 后端。

我有一个名为 Evaluate 的命令,它应该将当前打开的文件文本发送到后端服务器进行评估。

我尝试将其建模为使用 onExecuteCommand 执行的服务器端命令,但是在服务器处理程序中,并没有办法找出当前聚焦的源文件在客户端。至少我不知道。

我想我可以将其建模为客户端命令,然后使用包含我需要的信息的参数手动调用 sendRequest(ExecuteCommandRequest) 到该客户端处理程序中的服务器,但我想知道我是否遗漏了东西。

假设只有用户更新的文本文档需要(重新)验证,我觉得这样做更方便(至少对于那种需要多个源文件一起验证的DSL)通过实现语言服务器,它在初始化时做两件事:

  1. 遍历工作区中打开的文档 workspace.textDocuments(那些在上一个 VS Code 会话中在工作区中打开的文本文档)并将它们添加到要验证的文件集合中
  2. 订阅工作区事件:
    • workspace.onDidOpenTextDocument --> 应验证文件并显示诊断信息
    • workspace.onDidChangeTextDocument --> 应重新验证文件,显示诊断信息
    • workspace.onDidCloseTextDocument --> 应该删除诊断信息

这是一个很好的起点: https://code.visualstudio.com/docs/extensions/example-language-server

... 但不是在语言服务器中处理评估,您可以将其委托给您的 RESTful 后端服务器。该通信可以以您想要的任何方式处理,并且接口不需要遵守语言服务器协议。

引入此类更改请求的队列并限制验证请求可能是个好主意。如果文件在 3 秒内没有更新,我只会触发实际的 DSL 验证。该延迟是可配置的。