x/tools/gopls:使查询支持的设置变得更容易

hjzp0vay  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(58)

有时候,我们会添加一些在标准LSP规范中未指定的自定义功能。例如,对于漏洞检查和垃圾回收详情等功能,我们希望客户端能够应用启发式方法来确定可用的功能。例如,vscode-go扩展使用了gopls版本(来自gopls versiongo version -m命令,或者来自InitializeResult.serverInfo.version字段中编码的版本),或者在ServerCapabilities.executeCommandProvider.commands列表中存在某个命令,或者乐观地假设新功能并处理失败。当涉及到自定义命令时,这些方法是有效的。

现在我们正在讨论为go telemetry添加提示功能以及添加一个设置来控制它。VS Code在向gopls发送的第一条消息InitializeParams.initializationOptions中添加了大多数gopls设置。如果gopls无法识别该设置,这可能会导致问题,因为目前gopls对未识别的设置非常严格。

可以考虑以下几种选项:

  1. 放宽gopls对未知设置的行为。为了诊断和可见性,我们仍然可以让gopls添加未使用的设置。
  2. 要求客户端在收到提供关于gopls功能的提示的InitializeResult之前延迟发送此类配置。目前仅使用版本信息和命令列表,但我们还可以将initializeResult扩展到包含可动态设置的自定义gopls设置列表。
  3. 要求客户端通过侧通道(如gopls版本、gopls api-json等)来确定功能。这是当前可用的选项,我希望我们能做得更好。
0h4hbjxa

0h4hbjxa1#

看起来gopls api-json几乎实现了我们想要的功能,因为它可以用来回答关于设置存在性的问题,例如gopls api-json | jq '.Options.User[] | select(.Name = "verboseOutput")'。我们可以将其扩展以明确回答关于支持的设置的问题。例如:

gopls api-json -setting "verboseOutput"

这个调用将返回一个JSON描述该设置,如果设置不受支持,则具有非零退出值。WDYT?

5rgfhyps

5rgfhyps2#

@hyangah,这不再必要了,对吧?因为它已经通过自定义命令从VS Code中实现了?

ru9i0ody

ru9i0ody3#

将此问题重新利用以跟踪#62573(评论)中的建议。

avkwfej4

avkwfej44#

@hyangah 我不确定这是可操作的。gopls api-json 存在,虽然它可以变得更灵活,但在没有明确需求的情况下,我不愿意花时间去改进它。
将这个移到未计划中,直到有更明确的前进路径。

相关问题