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

Canonical source: https://maguyva.ai/ru/languages/lua

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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

## Сводка поддержки

- Уровень: Поддержка AST и символов
- Программирование
- Расширения: .lua
- Настоящий AST-разбор для синтаксически осведомлённого поиска и структурного контекста.
- Именованные символы обеспечивают семантический поиск и перекрёстные ссылки. Навигация по графу доступна, когда включено извлечение связей.
- Этот язык добавляет символы и связи в поиск с учётом графа; поддерживаемые типы рёбер зависят от присущих ему конструкций.
- Доступны и AST-разбор, и извлечение символов.

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

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

## Сценарии работы агента

- Найти все вызовы функции модуля, прежде чем менять её аргументы.
- Проследить, какие модули загружают общий служебный модуль через require, прежде чем его переносить.
- Составить карту таблиц, наследующих от базового класса через `setmetatable`.

## Где 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 нет интерфейсов и аннотаций типов, поэтому связи реализации интерфейсов и ссылок на типы помечены как неприменимые.

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

Подключите репозиторий по [быстрому старту](/ru/docs/quickstart), затем изучите матрицу поддержки на [странице совместимости](/ru/docs/compatibility). Для движков, которые встраивают Lua в нативный код, прочитайте и [руководство по C](/ru/languages/c).

## Детали движка

- Поддержка 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.*` или стандартной библиотеки, отфильтрованных из графа.
