跳转到内容
cd /languages
  • 嵌入式脚本
  • 编程语言
  • AST 和符号支持

Maguyva 的 Lua 支持:面向游戏、插件与 OpenResty 的代码图谱

Maguyva 以 AST、符号和图谱支持 Lua,让 AI 智能体在 Lua 代码中追踪模块、冒号方法、元表类和 require 链。

Lua 让浅层 AI 工具栽跟头的地方

Lua 没有声明类的关键字。对象就是表,方法是存放在表里的函数,继承则是一次 setmetatable 调用。模块就是 require 返回的任何东西。结构确实存在,但它藏在文本搜索无法理解的约定里。

Maguyva 把这些约定读成结构,所以智能体询问谁调用了某个方法、哪些表扩展了某个基类时,能得到直接的答案。

Maguyva 在 Lua 中提取什么

Maguyva 支持 .lua 文件。函数声明、local function 定义和函数表达式都会被提取,function Account:deposit() 这样的冒号方法会归属到其所属的表 Account。方法链会逐个调用地跟踪,对 self 的调用始终绑定到外层对象。

Lua 的约定会这样映射为关系:

  • require、dofile 和 loadfile 记录导入。
  • 模块级的 setmetatable 调用记录继承。
  • ClassName:new()、ClassName.new() 和 setmetatable({...}, ClassName) 计为实例化。
  • error() 记录抛出,pcall 和 xpcall 记录捕获。

图谱还会记录读写和控制流。

智能体提示词示例

  • “谁调用了 Inventory:addItem,来自哪些脚本?”(先用 find_symbol,再用 dependency_search 的 incoming 方向)
  • “哪些模块 require 了 util.http?”(dependency_search)
  • “追踪玩家受到伤害时会发生什么。”(get_task_context)

已知限制

  • 约 150 个名称会从关系中过滤掉:Lua 标准库(string、table、math、io、os、coroutine、debug 和 utf8),以及 Neovim 的 vim.* 和 OpenResty 的 ngx.* API。对这些 API 的调用不是图谱的边,查找它们请使用 text_pattern_search。
  • 由于模块和类是用普通调用和表搭建的,structural_search 中的 classes 和 imports 预设对 Lua 什么也选不到。请改用 find_symbol 或 text_pattern_search。
  • Lua 没有接口,也没有类型注解,因此接口实现和类型引用关系被标记为不适用。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。对于把 Lua 嵌入原生代码的引擎,也请阅读 C 指南。

最适合场景

  • > 模块、基于表的类和事件处理器相互调用的游戏代码与引擎脚本。
  • > 拆分在大量被 require 的模块中的 Neovim 插件和编辑器配置。
  • > 请求处理器与共享辅助模块并排存放的 OpenResty 及其他嵌入式 Lua。

智能体工作流

  • > 在修改模块函数的参数之前,找到它的所有调用方。
  • > 在移动共享辅助模块之前,追踪哪些模块 require 了它。
  • > 梳理哪些表通过 `setmetatable` 继承了某个基类。

引擎细节

  • > Lua 支持覆盖 `.lua`。`function Account:deposit()` 这样的冒号方法会归属到其所属的表。
  • > `require`、`dofile` 和 `loadfile` 记录导入,模块级的 `setmetatable` 记录继承,`ClassName:new()` 计为实例化。
  • > `error()` 记录抛出,`pcall` 记录捕获,约 150 个标准库、`vim.*` 和 `ngx.*` 名称会被过滤掉。

常用 MCP 入口工具

  • find_symbol

    需要模块函数或冒号方法的定义和调用方时使用它。

  • dependency_search

    移动共享模块之前,使用 incoming 方向遍历,查看哪些文件 require 了它。

  • text_pattern_search

    用于查找对 `vim.*`、`ngx.*` 或标准库的调用,这些调用已从图谱中过滤掉。