可扩展语言的 Visual Studio Code 提供程序
2021-12-4 17:16:43
收藏:0
阅读:201
评论:1
我正在尝试学习如何实现一些帮助提供者:自动完成、签名帮助和悬停。
我正在为一个框架做这些,据我所知,它不能在它的主应用程序以外执行,所以我想到的一种方法是通过解析它的文档(获取对象类型、方法和文档)来实现它。
例如,悬停提供者;一旦光标悬停在单词上,我可以在文档中搜索它并显示结果:
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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在这种情况下,通常的方法是创建一个符号表。你开始解析你想要提供工具支持的代码。从解析树(或语法树,取决于所使用的解析器工具)中生成符号表,其中包含你需要的信息,包括块和符号的嵌套、符号类型(例如对象名称或对象引用)以及符号有效的范围。