可扩展语言的 Visual Studio Code 提供程序

我正在尝试学习如何实现一些帮助提供者:自动完成、签名帮助和悬停。

我正在为一个框架做这些,据我所知,它不能在它的主应用程序以外执行,所以我想到的一种方法是通过解析它的文档(获取对象类型、方法和文档)来实现它。

例如,悬停提供者;一旦光标悬停在单词上,我可以在文档中搜索它并显示结果:

class HSHoverProvider implements vscode.HoverProvider {
    public provideSignatureHelp(
        document: vscode.TextDocument,
        position: vscode.Position,
        token: vscode.CancellationToken
    ): vscode.SignatureHelp {
        // 获取当前光标下的当前单词/行并在文档中找到匹配项
        ...
        return new vscode.Hover(data);
    }
}

...

context.subscriptions.push(
    vscode.languages.registerHoverProvider("lua", new HSHoverProvider())
);

当操作直接在初始声明上时,这可以正常工作。我可以直接解析该行并使用正则表达式找到所需内容。

- 在 "application" 上悬停,我使用正则表达式检查上下文。
local app = hs.application('Code')

然而,当涉及到"参考"时,我遇到了困难。使用正则表达式方法从文档中搜索"app"的声明,会出现许多边缘情况,主要是由于声明范围的缘故:

例如:

-- 声明目标
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

    -- 通过正则表达式很难理解哪个声明是正确的
    print(app:title())
end

这让我认为,正则表达式不是适当的解决方案。我也认为实现vscode.DefinitionProvider会给我一些见解,但实际上没有。

我试图查看其他已经实现了相同功能的扩展(主要是 sumneko 的 Lua 语言服务器),但我无法理解他们是如何实现这一点的(除了他们正在使用语言服务器方法)。

我应该怎么做?我需要一棵 AST 树来从那里检查吗?使用语言服务器会是更好的选择吗?我缺乏一个更强大的文档解析器还是我需要一个更深入的了解?

任何见解都将不胜感激。预先感谢。

原文链接 https://stackoverflow.com/questions/70227826

点赞
stackoverflow用户1137174
stackoverflow用户1137174

在这种情况下,通常的方法是创建一个符号表。你开始解析你想要提供工具支持的代码。从解析树(或语法树,取决于所使用的解析器工具)中生成符号表,其中包含你需要的信息,包括块和符号的嵌套、符号类型(例如对象名称或对象引用)以及符号有效的范围。

2021-12-05 10:18:04