# MaguyvaのLua対応: ゲーム、プラグイン、OpenRestyのコードグラフ

Canonical source: https://maguyva.ai/ja/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はAST、シンボル、グラフでLuaに対応しています。AIエージェントはLuaのコードで、モジュール、コロンメソッド、メタテーブルによるクラス、requireの連鎖をたどれます。

## 対応状況スナップショット

- 対応レベル: AST・シンボル対応
- プログラミング
- 拡張子: .lua
- 構文を考慮した検索と構造コンテキストのための実際のAST解析。
- 名前付きシンボルはセマンティック検索と相互参照に利用されます。関係抽出が有効な場合は、グラフナビゲーションも利用できます。
- この言語は、グラフを考慮した検索にシンボルと関係情報を提供します。対応するエッジの種類は、その言語固有の構文要素によって異なります。
- AST解析とシンボル抽出の両方に対応しています。

## 最適な用途

- モジュール、テーブルベースのクラス、イベントハンドラーが互いに呼び合う、ゲームのコードやエンジンのスクリプト。
- 多くのrequireされたモジュールに分かれたNeovimのプラグインとエディタの設定。
- リクエストハンドラーが共有のヘルパーモジュールと並んで置かれる、OpenRestyなどの組み込みLua。

## エージェントワークフロー

- モジュール関数の引数を変更する前に、その呼び出し元をすべて見つける。
- 共有ヘルパーを移動する前に、それをrequireしているモジュールを追跡する。
- `setmetatable` を通して基底クラスを継承しているテーブルをマッピングする。

## 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）
- 「`util.http` をrequireしているモジュールはどれか？」（`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にはインターフェースも型注釈もないため、インターフェース実装と型参照の関係性は適用対象外とされています。

## 次のステップ

[クイックスタート](/ja/docs/quickstart)でリポジトリを接続し、[互換性ページ](/ja/docs/compatibility)で対応マトリクスを確認してください。ネイティブコードにLuaを組み込むエンジンについては、[Cガイド](/ja/languages/c)もご覧ください。

## エンジンの詳細

- 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.*`、標準ライブラリへの呼び出しに使ってください。
