2

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

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

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

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

4

1 回答 1

0

假设只有用户更新的文本文档需要(重新)验证,我发现通过实现语言服务器更方便(至少对于需要一起验证多个源文件的那种 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 验证。该延迟是可配置的。

于 2017-11-06T20:57:49.293 回答