visual-studio-code - 如何通过语言服务器实现 quickfix

标签 visual-studio-code vscode-extensions language-server-protocol

我已经实现了一个提供一些 linting 的语言服务器。 linter 检查所需的属性并发出“缺少属性”错误。我想为这些错误提供相应的“插入缺失属性”快速修复。

我认为 LSP 协议(protocol)的一般领域是:

textDocument/codeAction

这样,服务器可以为“缺少属性”诊断标记返回“插入缺失属性”命令。

但是服务器如何实现“插入缺失的属性”命令本身呢?

查看 lsp 规范,我找不到任何让服务器注册命令的东西。

我确实在这里找到了一些关于用于在客户端注册命令的 vscode api 的信息:https://code.visualstudio.com/docs/extensionAPI/vscode-api

所以我想我可以在客户端注册并实现“插入缺失的属性”,但是......

客户端只是将大部分工作委派给服务器的“愚蠢”包装器。因此,它并不真正了解文档结构,也不是实现需要了解该结构的文档转换的好地方。

似乎我最好的选择是向我的语言服务器添加一些“自定义”协议(protocol),以便我可以在客户端实现“插入缺少的属性”命令,但将计算快速修复编辑的困难部分委托(delegate)给服务器.

或者,还有更好的方法?

最佳答案

是的,有一种更好的方法不需要任何自定义协议(protocol)扩展。大致是这些步骤:

首先确保你的 vscode 扩展的 package.json有一个最新的语言服务器客户端。我的使用版本 3.2.x .我还需要将 vscode 引擎版本更新为 1.6.x .这是 example package.json

现在我们可以使用 Version 3 (在撰写本文时只是一个草稿,但已经可用)语言服务器协议(protocol)。这些是有趣的部分:

  • textDocument/codeAction :在服务器端实现它以计算代表快速修复的命令列表。
  • workspace/executeCommand :在服务器端实现这个来执行命令。可以使用workspace/applyEdit向客户端发送请求以对工作区中的文档进行更改。
  • client/registerCapability : 服务器可以用 ExecuteCommandRegistrationOptions 调用它目的。这会将您的服务器端命令注册到客户端,以便它知道通过 workspace/executeCommand 执行它们。处理程序在上一步中实现。
  • initialize : 替代使用 client/registerCapability您还可以通过返回 WorkspaceCapabilities 来注册服务器端命令对象的executeCommandProvider 具有适当的设置属性。这种方法稍微不那么复杂(但只能在不需要动态注册/注销命令的情况下使用)。

  • 另请参阅 vscode issue ticket关于实现快速修复的主题。

    重要提示 : 语言服务器客户端实现的 3.2.0 版有 bug ,它使用了错误的名称client/registerFeature而不是 client/registerCapability所以你可能不得不解决这个问题,直到该错误得到修复。如果您使用 initialize方法,那么您不会受到此错误的影响。

    关于visual-studio-code - 如何通过语言服务器实现 quickfix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43328582/

    相关文章:

    typescript - 如何在 Deno 中提取类型

    visual-studio-code - 我如何配置任务以在 vscode 中调用 powershell 脚本

    javascript - 如何在 VSCode 中突出显示全局变量?

    visual-studio-code - 使用 VSCode 扩展 API 关闭特定打开的选项卡

    typescript - Emacs LSP 模式 - 是否可以避免单击鼠标来完成建议的操作?

    javascript - 导入包的 Visual Studio 代码 JS Intellisense 不起作用

    git - vscode 不显示 git 密码提示

    visual-studio-code - 插入方法/函数名称的 Visual Studio 代码片段?

    visual-studio-code - 调试崩溃的语言服务器

    visual-studio-code - 如何在Visual Studio Code中启用语言服务器的日志