# MaguyvaのElixir対応: PhoenixとOTPアプリのコードグラフ

Canonical source: https://maguyva.ai/ja/languages/elixir

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、シンボル、グラフでElixirに対応しています。AIエージェントはPhoenixとOTPのコード全体で、モジュール、ビヘイビア、プロトコル、構造体をたどれます。

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

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

## 最適な用途

- コントローラー、LiveView、コンテキスト、Ectoスキーマが多くのモジュールをまたいで呼び合うPhoenixアプリケーション。
- GenServer、スーパーバイザー、タスクで構築されたOTPシステム。
- 多くの型に対してプロトコルが実装されているライブラリやアンブレラプロジェクト。

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

- コンテキスト関数の戻り値の形を変える前に、その呼び出し元をすべて見つける。
- コールバックを追加する前に、ビヘイビアやプロトコルを実装しているモジュールを一覧にする。
- PhoenixのコントローラーからEcto層までリクエストを追跡する。

## Elixirが浅いAIツールをつまずかせるところ

Elixirでは、ほとんどすべてがマクロ呼び出しです。`defmodule`、`def`、`use`、`alias`、`@impl` はどれも呼び出しとして解析され、`use GenServer` はファイルに一度も現れない振る舞いを取り込みます。呼び出しの構文しか見えないツールには、定義と依存関係の区別も、GenServerのコールバックとヘルパーの区別もつきません。

Maguyvaはそれらのマクロを関係性に対応付けるため、エージェントはどのモジュールがビヘイビアを実装し、誰がコンテキスト関数を呼び出しているかを確認できます。

## MaguyvaがElixirで抽出するもの

Maguyvaは `.ex` と `.exs` ファイルに対応しています。Elixirのマクロは次のように関係性に対応付けられます。

- `alias`、`import`、`require` はインポートを記録します。
- `use` はインポートを記録します。`GenServer`、`Supervisor`、`Agent`、`Task`、`Phoenix.Controller`、`Phoenix.LiveView`、`Ecto.Schema` のようなOTPやフレームワークのビヘイビアについては、そのモジュールがそのビヘイビアを実装していることも記録します。
- `@behaviour` 属性と `defimpl` ブロックは、ビヘイビアやプロトコルの実装を記録します。
- `@doc`、`@spec`、`@impl`、`@callback` のような予約済みのモジュール属性は、その後に続く関数へのアノテーションとして記録されます。`@timeout 5_000` のような値を持つ属性は記録されません。
- `%User{}` の構造体リテラルはインスタンス化として数えられ、`raise` はスローを、`rescue` と `catch` はキャッチを記録します。

`def`、`defp`、`defmodule`、`case`、`with` のような言語のマクロは呼び出しから除外されるため、コールグラフにはあなたの関数が表示されます。

## エージェントへのプロンプト例

- 「`Accounts.register_user` を呼び出しているのは誰で、どのコントローラーからか？」（`find_symbol`、次に `dependency_search` の incoming）
- 「`GenServer` を実装しているモジュールはどれか？」（`dependency_search`）
- 「チェックアウトのリクエストをコントローラーからデータベースまで追跡して。」（`get_task_context`）

## 既知の制限

- 名前付きの `def`、`defmodule`、`alias`、`import` の形式は文法上は呼び出しノードなので、`structural_search` で結果を返すのは `functions` プリセットだけで、それも無名の `fn` 関数に限られます。名前付きの関数やモジュールには `find_symbol` を使ってください。
- `IO.puts`、`String.*`、`Enum.take`、`Process.*` のような約55個の標準ライブラリの呼び出しは関係性から除外されます。それらには `text_pattern_search` を使ってください。
- Elixirにはクラスの継承がないため、継承の関係性は適用対象外とされています。

## 次のステップ

[クイックスタート](/ja/docs/quickstart)でリポジトリを接続し、[互換性ページ](/ja/docs/compatibility)で対応マトリクスを確認してください。ほかの関数型のコードベースについては、[Haskellガイド](/ja/languages/haskell)をご覧ください。

## エンジンの詳細

- Elixirの対応は `.ex` と `.exs` を含みます。`alias`、`import`、`require`、`use` はインポートを記録します。
- `use GenServer` などの登録済みのOTPとフレームワークのビヘイビア、`@behaviour`、`defimpl` は実装の関係性を記録します。
- `@spec` や `@impl` のような予約済みの属性は次の関数にアノテーションを付け、`%Struct{}` リテラルはインスタンス化として数えられます。

## 役立つMCPエントリーポイント

- `find_symbol`: 定義と呼び出し元が必要なときに、コンテキスト関数やモジュールで使ってください。構造的なプリセットは名前付きの `def` 形式を選択しません。
- `dependency_search`: ビヘイビアやプロトコルに対してincomingのトラバーサルを使い、それを実装しているモジュールを確認してください。
- `get_task_context`: 「チェックアウトのリクエストをコントローラーからデータベースまで追跡して」のようなプロンプトに使ってください。
