# Maguyva 的 Elixir 支持：面向 Phoenix 与 OTP 应用的代码图谱

Canonical source: https://maguyva.ai/zh-hans/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-hans/docs/quickstart)连接仓库，然后在[兼容性页面](/zh-hans/docs/compatibility)查看支持矩阵。其他函数式代码库请阅读 [Haskell 指南](/zh-hans/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`: 用于“追踪一次结账请求从控制器到数据库的过程”这类提示词。
