【发布时间】:2022-01-10 14:52:00
【问题描述】:
我正在尝试学习如何实现一些帮助提供者:自动完成、签名帮助和悬停。
我正在为一个框架做这件事,据我所知,它不能在其主应用程序之外执行,所以我想解决这个问题的一种方法(获取对象类型、方法和文档)是解析它的文档。
例如 Hover 提供程序;一旦光标悬停在单词上,我可以在文档中搜索并显示结果:
class HSHoverProvider implements vscode.HoverProvider {
public provideSignatureHelp(
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
): vscode.SignatureHelp {
// get current word/line under the cursor and find a match inside the docs
...
return new vscode.Hover(data);
}
}
...
context.subscriptions.push(
vscode.languages.registerHoverProvider("lua", new HSHoverProvider())
);
当操作直接在初始声明上时,这可以正常工作。我可以直接解析该行并使用正则表达式找到我需要的内容。
-- hovering over `application`, I check the context with a regex.
local app = hs.application('Code')
但是,当谈到“参考”时,我很难过。使用正则表达式方法在文档中搜索 app 的声明会导致许多极端情况,主要是因为声明范围:
例子:
-- declaration target
local app = hs.application('Code')
local function foo()
local app = hs.pasteboard()
end
local function bar()
if 'foo' then
local app = hs.alert()
end
do local app = hs.window.focusedWindow() end
-- a regex will have a hard time to understand which declaration is correct
print(app:title())
end
这让我认为正则表达式不是合适的解决方案。我还认为实现 vscode.DefinitionProvider 会给我一些见解,但它没有。
我试图查看其他已经做同样事情的扩展(主要是 sumneko 的 Lua 语言服务器),但我无法理解他们是如何做到的(除了他们是使用语言服务器方法)。
我将如何去做这样的事情?我需要 AST 树并从那里检查吗?使用语言服务器会是更好的选择吗?我错过了更大的图景还是我只需要一个更强大的文档解析器?
感谢任何见解。提前致谢
【问题讨论】:
-
正则表达式(例如 VSCode 的默认语法高亮引擎之类的示例)对于您的其他功能可以依赖的语言构造级别以及可以达到的准确度级别有很大的限制。这就是为什么伟大的语言扩展最终会转向幕后的语言服务器的原因。在你的情况下,我认为你不能避免这条路。
标签: visual-studio-code lua vscode-extensions