Visual studio code vscode语言服务器节点中的服务器端命令如何知道哪个是当前文档?

Visual studio code vscode语言服务器节点中的服务器端命令如何知道哪个是当前文档?,visual-studio-code,vscode-extensions,languageservice,Visual Studio Code,Vscode Extensions,Languageservice,我正在为DSL开发vscode的语言扩展。该体系结构使用来自微软github的vscode languageserver节点基础设施,并带有一个可以评估DSL的REST后端 我有一个名为Evaluate的命令,它应该将当前打开的文件文本发送到后端服务器进行评估 我尝试将其建模为使用onExecuteCommand执行的服务器端命令,但是在服务器处理程序中,实际上没有办法找出客户端中当前的焦点源文件。至少我看不出来 我想我可以将它建模为一个客户端命令,然后手动调用sendRequest(Execu

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

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

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


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

假设只有用户更新的文本文档需要(重新)验证,我发现通过实现languageserver更方便(至少对于需要同时验证多个源文件的DSL类型而言),languageserver在初始化时会做两件事:

  • 循环浏览工作区中打开的文档
    workspace.textDocuments
    (在上一次VS代码会话中在工作区中打开的文本文档),并将它们添加到要验证的文件集合中
  • 订阅工作区事件:
    • workspace.onDidOpenTextDocument
      -->应验证文件并显示诊断信息
    • workspace.onDidChangeTextDocument
      -->应重新验证文件,并显示诊断信息
    • workspace.onDidCloseTextDocument
      -->应删除诊断信息
  • 这是一个很好的起点:

    。。。但是,您可以将评估委托给RESTful后端服务器,而不是在languageserver中处理评估。这种通信可以按照您想要的任何方式处理,接口不需要遵循languageserver协议

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