# Maguyva 的 Elixir 支援：面向 Phoenix 與 OTP 應用的程式碼圖譜

Canonical source: https://maguyva.ai/zh-hant/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 程式碼追蹤模組、behaviour、協定和結構體。

## 支援概況

- 等級: AST 與符號支援
- 程式語言
- 副檔名: .ex, .exs
- 真正的 AST 剖析，支援語法感知搜尋與結構化情境。
- 具名符號支援語意查詢與交叉參照。啟用關係擷取後，即可使用圖譜導覽。
- 這個語言會為圖譜感知搜尋提供符號與關係；支援的邊類型會隨其原生構造而異。
- 同時支援 AST 剖析與符號擷取。

## 最適合的情境

- 控制器、LiveView、上下文和 Ecto schema 跨越大量模組相互呼叫的 Phoenix 應用。
- 由 GenServer、監督者和任務建構的 OTP 系統。
- 為大量型別實作了協定的函式庫和 umbrella 專案。

## 代理工作流程

- 在修改上下文函式的回傳結構之前，找到它的所有呼叫端。
- 在新增回呼之前，列出實作了某個 behaviour 或協定的模組。
- 追蹤一次請求從 Phoenix 控制器進入 Ecto 層的過程。

## Elixir 讓淺層 AI 工具栽跟頭的地方

在 Elixir 裡，幾乎一切都是巨集呼叫。`defmodule`、`def`、`use`、`alias` 和 `@impl` 都會被解析為呼叫，而 `use GenServer` 引入的行為從未出現在檔案裡。只看得到呼叫語法的工具，分不清定義和依賴，也分不清 GenServer 回呼和輔助函式。

Maguyva 把這些巨集對應為關係，讓代理能看到哪些模組實作了某個 behaviour，以及誰在呼叫某個上下文函式。

## Maguyva 在 Elixir 中擷取什麼

Maguyva 支援 `.ex` 和 `.exs` 檔案。Elixir 的巨集會這樣對應為關係：

- `alias`、`import` 和 `require` 記錄匯入。
- `use` 記錄匯入。對於 `GenServer`、`Supervisor`、`Agent`、`Task`、`Phoenix.Controller`、`Phoenix.LiveView` 和 `Ecto.Schema` 等 OTP 與框架 behaviour，它還會記錄該模組實作了這個 behaviour。
- `@behaviour` 屬性和 `defimpl` 塊會記錄對 behaviour 或協定的實作。
- `@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`。
- 約 55 個標準函式庫呼叫（如 `IO.puts`、`String.*`、`Enum.take` 和 `Process.*`）會從關係中過濾掉。查詢它們請使用 `text_pattern_search`。
- Elixir 沒有類別繼承，因此繼承關係被標記為不適用。

## 下一步

透過[快速入門](/zh-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)檢視支援矩陣。其他函式式程式碼庫請閱讀 [Haskell 指南](/zh-hant/languages/haskell)。

## 引擎細節

- Elixir 支援涵蓋 `.ex` 和 `.exs`。`alias`、`import`、`require` 和 `use` 記錄匯入。
- `use GenServer` 及其他已列出的 OTP 與框架 behaviour、`@behaviour` 和 `defimpl` 會記錄實作關係。
- `@spec`、`@impl` 等保留屬性會註解其後的函式，`%Struct{}` 字面值計為實例化。

## 實用的 MCP 進入點

- `find_symbol`: 需要上下文函式或模組的定義和呼叫端時使用它；結構化預設集不會選中具名的 `def` 形式。
- `dependency_search`: 對某個 behaviour 或協定使用 incoming 方向走訪，檢視哪些模組實作了它。
- `get_task_context`: 用於「追蹤一次結帳請求從控制器到資料庫的過程」這類提示。
