【问题标题】:How to implement quickfix via a language server如何通过语言服务器实现 quickfix
【发布时间】:2017-09-05 19:36:16
【问题描述】:

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

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

textDocument/codeAction

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

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

查看 lsp 规范,我找不到任何可以让服务器注册命令的内容。

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

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

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

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

或者...有更好的方法吗?

【问题讨论】:

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


    【解决方案1】:

    是的,有一种更好的方法,它不需要任何自定义协议扩展。大致步骤如下:

    首先确保您的 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 对象及其executeCommandProvider 属性的适当设置来注册服务器端命令。这种方法稍微简单一些(但只能在不需要动态注册/注销命令的情况下使用)。

    另见vscode issue ticket 关于实施快速修复的主题。

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

    【讨论】:

    • 你有这样的实现的简单例子吗?我真的在这里挣扎:)
    • 不幸的是它一点也不简单,所以我没有一个简单的例子。我自己也在苦苦挣扎:-(
    • 我成功了 :) 我从github.com/YuanboXue-Amber/endevor-scl-support/blob/master/… 得到了很好的启发再也没有打电话了^^
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多