Kri*_*ris 5 visual-studio-code vscode-extensions language-server-protocol
我已经实现了一个提供一些 linting 的语言服务器。linter 检查所需属性并发出“缺少属性”错误。我想为这些错误提供相应的“插入缺失的属性”快速修复。
我认为 LSP 协议的一般领域是:
这样,服务器可以为“缺失属性”诊断标记返回“插入缺失属性”命令。
但是服务器如何实现“插入缺失的属性”命令本身呢?
查看 lsp 规范,我找不到任何可以让服务器注册命令的内容。
我确实在这里找到了一些关于 vscode apis 的信息,用于在客户端注册命令:https ://code.visualstudio.com/docs/extensionAPI/vscode-api
所以我想我可以在客户端注册并实现“插入缺失的属性”,但是......
客户端只是一个“愚蠢”的包装器,将大部分工作委托给服务器。因此,它并不真正理解文档结构,也不是实现需要理解该结构的文档转换的好地方。
似乎我最好的选择是向我的语言服务器添加一些“自定义”协议,以便我可以在客户端实现“插入缺失的属性”命令,但将计算 quickfix 编辑的困难部分委托给服务器.
或者,还有更好的方法?
是的,有一种更好的方法,不需要任何自定义协议扩展。大致步骤是这样的:
首先确保您的 vscode 扩展package.json
具有最新的语言服务器客户端。我的使用版本3.2.x
. 我还需要将 vscode 引擎版本更新为1.6.x
. 这是一个示例 package.json
现在我们可以使用语言服务器协议的版本 3(在撰写本文时只是草案,但已经可用)。这些是有趣的部分:
textDocument/codeAction
:在服务器端实现此功能以计算代表快速修复的命令列表。
workspace/executeCommand
:在服务器端实现这个来执行命令。它可以用来workspace/applyEdit
向客户端发送请求以对工作区中的文件进行更改。
client/registerCapability
:服务器可以用 ExecuteCommandRegistrationOptions
对象调用它。这会向客户端注册您的服务器端命令,以便客户端知道通过workspace/executeCommand
上一步中实现的处理程序来执行它们。
initialize
:除了使用之外,您还可以通过返回具有适当属性设置的对象client/registerCapability
来注册服务器端命令。此方法稍微简单一些(但只有在不需要动态注册/取消注册命令时才能使用)。WorkspaceCapabilities
executeCommandProvider
另请参阅此vscode 问题票证,了解有关实施快速修复的主题。
重要提示:语言服务器客户端实现的 3.2.0 版本有一个错误,它使用了错误的名称client/registerFeature
,因此client/registerCapability
您可能必须解决该问题,直到修复该错误。如果您使用该initialize
方法,那么您就不会受到此错误的影响。
归档时间: |
|
查看次数: |
1877 次 |
最近记录: |