Перейти к содержимому
cd /languages
  • Встраиваемые скрипты
  • Программирование
  • Поддержка AST и символов

Lua в Maguyva: графы кода для игр, плагинов и OpenResty

Maguyva поддерживает Lua с AST, символами и графом, чтобы ИИ-агенты могли прослеживать модули, методы с двоеточием, классы на метатаблицах и цепочки require в коде на Lua.

Где Lua сбивает с толку поверхностные ИИ-инструменты

В 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 по входящим связям)
  • «Какие модули загружают util.http через require?» (dependency_search)
  • «Проследи, что происходит, когда игрок получает урон.» (get_task_context)

Известные ограничения

  • Около 150 имён отфильтрованы из связей: стандартная библиотека Lua (string, table, math, io, os, coroutine, debug и utf8), а также API vim.* из Neovim и ngx.* из OpenResty. Вызовы этих API не являются рёбрами графа; чтобы найти их, используйте text_pattern_search.
  • Поскольку модули и классы строятся из обычных вызовов и таблиц, пресеты classes и imports в structural_search для Lua ничего не выбирают. Используйте вместо них find_symbol или text_pattern_search.
  • В Lua нет интерфейсов и аннотаций типов, поэтому связи реализации интерфейсов и ссылок на типы помечены как неприменимые.

Следующие шаги

Подключите репозиторий по быстрому старту, затем изучите матрицу поддержки на странице совместимости. Для движков, которые встраивают Lua в нативный код, прочитайте и руководство по C.

Лучше всего подходит

  • > Игровой код и скрипты движков, где модули, классы на таблицах и обработчики событий вызывают друг друга.
  • > Плагины Neovim и конфигурации редактора, разбитые на множество модулей, загружаемых через require.
  • > 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

    Используйте обход входящих связей, чтобы увидеть, какие файлы загружают общий модуль через require, прежде чем его переносить.

  • text_pattern_search

    Используйте для вызовов `vim.*`, `ngx.*` или стандартной библиотеки, отфильтрованных из графа.