如何通过语言服务器实现 quickfix
How to implement quickfix via a language server
我已经实现了一个提供一些 linting 的语言服务器。 linter 检查所需的属性并发出 'missing property' 错误。我想对这些错误进行相应的 'insert missing property' 快速修复。
我认为 LSP 协议的一般区域是:
有了这个,服务器可以 return 'insert missing property' 命令用于 'missing property' 诊断标记。
但是服务器本身是如何实现'insert missing property'命令的呢?
查看 lsp 规范,我找不到任何让服务器注册命令的东西。
我确实在此处找到了一些关于 vscode 用于在客户端注册命令的 API 的信息:https://code.visualstudio.com/docs/extensionAPI/vscode-api
所以我想我可以在客户端注册并实施 'insert missing properties',但是...
客户端只是一个 'dumb' 包装器,将大部分工作委托给服务器。因此,它并不真正理解文档结构,也不是实现需要理解该结构的文档转换的好地方。
看来我最好的选择是向我的语言服务器添加一些 'custom' 协议,这样我就可以在客户端执行 'insert missing properties' 命令,但将计算编辑的困难部分委托给其他人快速修复回到服务器。
或者...还有更好的方法吗?
是的,有一种不需要任何自定义协议扩展的更好方法。大致步骤如下:
首先确保您的 vscode 扩展程序的 package.json
具有最新的语言服务器客户端。我的使用版本 3.2.x
。我还需要将 vscode 引擎版本更新为 1.6.x
。这是一个 example package.json
现在我们可以使用语言服务器协议的Version 3(在撰写本文时只是草稿,但已经可用)。这些是有趣的部分:
textDocument/codeAction
:在服务器端实现它以计算代表快速修复的命令列表。
workspace/executeCommand
:在服务器端执行此命令以执行命令。它可以利用 workspace/applyEdit
向客户端发送请求以对工作区中的文档执行更改。
client/registerCapability
:服务器可以用 ExecuteCommandRegistrationOptions
对象调用它。这会向客户端注册您的服务器端命令,以便它知道通过上一步中实现的 workspace/executeCommand
处理程序执行它们。
initialize
:除了使用 client/registerCapability
之外,您还可以通过返回一个 WorkspaceCapabilities
对象并对其 [=22] 进行适当的设置来注册服务器端命令=] 属性。此方法稍微不那么复杂(但只能在不需要动态命令 registering/unregistering 的情况下使用)。
另请参阅此 vscode issue ticket 关于实施快速修复的主题。
重要说明:语言服务器客户端实现的 3.2.0 版有一个 bug,它使用了错误的名称 client/registerFeature
而不是 client/registerCapability
所以你可能不得不解决这个问题,直到那个错误被修复。如果您使用 initialize
方法,则您不会受到此错误的影响。
我已经实现了一个提供一些 linting 的语言服务器。 linter 检查所需的属性并发出 'missing property' 错误。我想对这些错误进行相应的 'insert missing property' 快速修复。
我认为 LSP 协议的一般区域是:
有了这个,服务器可以 return 'insert missing property' 命令用于 'missing property' 诊断标记。
但是服务器本身是如何实现'insert missing property'命令的呢?
查看 lsp 规范,我找不到任何让服务器注册命令的东西。
我确实在此处找到了一些关于 vscode 用于在客户端注册命令的 API 的信息:https://code.visualstudio.com/docs/extensionAPI/vscode-api
所以我想我可以在客户端注册并实施 'insert missing properties',但是...
客户端只是一个 'dumb' 包装器,将大部分工作委托给服务器。因此,它并不真正理解文档结构,也不是实现需要理解该结构的文档转换的好地方。
看来我最好的选择是向我的语言服务器添加一些 'custom' 协议,这样我就可以在客户端执行 'insert missing properties' 命令,但将计算编辑的困难部分委托给其他人快速修复回到服务器。
或者...还有更好的方法吗?
是的,有一种不需要任何自定义协议扩展的更好方法。大致步骤如下:
首先确保您的 vscode 扩展程序的 package.json
具有最新的语言服务器客户端。我的使用版本 3.2.x
。我还需要将 vscode 引擎版本更新为 1.6.x
。这是一个 example package.json
现在我们可以使用语言服务器协议的Version 3(在撰写本文时只是草稿,但已经可用)。这些是有趣的部分:
textDocument/codeAction
:在服务器端实现它以计算代表快速修复的命令列表。workspace/executeCommand
:在服务器端执行此命令以执行命令。它可以利用workspace/applyEdit
向客户端发送请求以对工作区中的文档执行更改。client/registerCapability
:服务器可以用ExecuteCommandRegistrationOptions
对象调用它。这会向客户端注册您的服务器端命令,以便它知道通过上一步中实现的workspace/executeCommand
处理程序执行它们。initialize
:除了使用client/registerCapability
之外,您还可以通过返回一个WorkspaceCapabilities
对象并对其 [=22] 进行适当的设置来注册服务器端命令=] 属性。此方法稍微不那么复杂(但只能在不需要动态命令 registering/unregistering 的情况下使用)。
另请参阅此 vscode issue ticket 关于实施快速修复的主题。
重要说明:语言服务器客户端实现的 3.2.0 版有一个 bug,它使用了错误的名称 client/registerFeature
而不是 client/registerCapability
所以你可能不得不解决这个问题,直到那个错误被修复。如果您使用 initialize
方法,则您不会受到此错误的影响。