如何通过语言服务器实现的quickfix

问题描述 投票:1回答:1

我已经实现了一个语言服务器提供了一些掉毛。该棉短绒检查所需的性能和问题“失踪属性”的错误。我想有相应的“插入缺失的财产”快速修复这些错误。

我想,意味着这个LSP协议的一般地区是:

textDocument/codeAction

这样,服务器可以做一个“丢失的财产”的诊断标记返回一个“插入缺失属性”命令。

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

通过LSP规格来看,我找不到任何可以让服务器注册的命令。

我没有找到有关vscode API的一些信息对这里的客户端注册的命令:https://code.visualstudio.com/docs/extensionAPI/vscode-api

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

客户端仅仅是一个“愚蠢的”包装委托工作最多到服务器。因此它并不真正了解文档的结构,而不是实现需要了解该结构的文档转换一个非常好的地方。

看来我的最佳选择是一些“自定义”协议添加到我的语言的服务器,这样我可以执行“插入缺失的属性”客户端上的命令,但委托计算的编辑为的quickfix回服务器的最困难的部分。

或者,还有更好的方法?

visual-studio-code vscode-extensions language-server-protocol
1个回答
0
投票

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

首先确保你的vscode扩展的package.json有跟上时代的语言 - 服务器 - 客户端。矿用版本3.2.x。我还需要更新vscode引擎版本1.6.x。这里有一个example package.json

现在我们可以使用的语言 - 服务器协议的Version 3(仅在写这篇文章的时间草稿,但已经可以使用)。这些都是有趣的作品:

  • textDocument/codeAction:实现这个在服务器端的计算代表了快速修复命令的列表。
  • workspace/executeCommand:在服务器端实现这个执行的命令。它可以利用workspace/applyEdit的发送到客户端的请求进行的更改在工作区中的文件。
  • client/registerCapability:服务器可以用ExecuteCommandRegistrationOptions对象调用它。这将注册与客户端服务器端的命令(S),所以它知道通过在上一步中实施的workspace/executeCommand处理程序来执行它们。
  • initialize:或者使用client/registerCapability也可以通过用其WorkspaceCapabilities属性的适当的设置返回executeCommandProvider对象注册服务器端的命令。这种方法略显不足复杂(但如果你不需要动态注册/命令注销才能使用)。

另见本vscode issue ticket有关实现快速修复的话题。

重要提示:语言服务器客户端实现的3.2.0版本有bug,它使用了错误的名称client/registerFeature代替client/registerCapability所以你可能要解决的是,直到错误是固定的。如果您使用initialize方法,那么你不会受到这个bug。

© www.soinside.com 2019 - 2024. All rights reserved.