Sucha's Blog ~ Archive for January, 2022

22年1月27日 周四 14:42

MoocHelper

MoonCake 终于有了支持 LSP 的 VSCode 插件 MoocHelper,修改自 LuaHelper, 一个基于 go 的 Lua LSP 方案。

话说 12 月底到 1 月中旬大部分的时间都在补充完善这个插件,基本功能两周之内的业余时间就搞定了。不得不说 go 确实比较简单,另外 LuaHelper 的代码结构也可圈可点,很好懂。

基本功能完成后,就开始了边用边改的流程,就这样又过了两周多,感觉配置好后,在 Mac 上的基本使用没啥问题了。

对比一下原版的功能,基本的代码补全,跳转,提示都是有的,只是缺少 debug 能力,因为 moocscript 是先翻译成 Lua 再交给 Lua 解释器的。另外,配置方面,修改了 luahelper.json 的读取路径,修改到了 .vscode/ 目录下。增加了配置项 ProjectLuaPath 以及 ProjectLuaCPath,对应工程使用的 LUA_PATH 和 LUA_CPATH 携带的路径列表。

增加了这两个配置后,浏览代码期间的环境变量跟运行时候就几乎是一样的了。

说到 Lua LSP 的方案选择,之前考虑过 sumneko/lua-language-server,虽然我是 C/C++ 以及 Lua 都了解,但初步评估后,发现门槛有点高,不知道如何入手修改,以及 debug,想哭😭。

相比之下,基于 Go 的 LuaHelper,就太好 debug 了。只要按照 README 描述,在插件配置里面将选项 connect lsp server way 修改为 socket(默认是 cmd),而在另外一边的 luahelper-lsp 目录,按下 F5 就开启了调试模式,断点什么都特别方便。就算像我这样 go 基础非常浅的,也很快弄懂了如何 debug,几遍下来,程序的结构就很清楚了。

相比之下,lua-server 是 Lua + C++ 的方案,估计调试没那么容易,当然 go 的效率较高又是另外一个点了。

除此之外,我还看了一下相关的代码,知道其最终输出是 AST,后续的语法分析,提示、跳转什么都是依赖这个 AST 工作的,大概读懂这个 AST 结构后,我就比较放心了。moocscript 虽然语法不一样,但其最终会编译到 Lua,会沿用一样的 AST 结构,不会遗漏语言表达的任何细节。

一开始我想用 lua-server 的,但几遍下来,看不懂 parser 部分,没能抓住最后输出 AST 的逻辑,少了这个核心关键点,就只能放弃了。

也是基于上面输出同样 Lua AST 的原因,除了 debug 功能外,其他的功能,moocscript 和 lua 几乎是一样的,只是有一些限制。

这些限制是因为 Lua 和 MoonCake 在 token 阶段,共享了 token 这些关键字,moocscript 的关键字比 Lua 多了不少,这些关键字在 MoocHelper 里面的 Lua 文件也会被提示不能使用而报错,虽然 lua 解释器是能正常运行这些脚本的,这也算缺点之一吧。

对了,因为 AST 共通,所以 MoocHelper 也能解析 Lua 代码,工程里面不同文件,混用 moocscript 和 lua 都是没有问题的。