跳转到内容
cd /languages
  • 并发 BEAM
  • 编程语言
  • AST 和符号支持

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

Maguyva 以 AST、符号和图谱支持 Elixir,让 AI 智能体跨越 Phoenix 和 OTP 代码追踪模块、behaviour、协议和结构体。

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 没有类继承,因此继承关系被标记为不适用。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。其他函数式代码库请阅读 Haskell 指南。

最适合场景

  • > 控制器、LiveView、上下文和 Ecto schema 跨越大量模块相互调用的 Phoenix 应用。
  • > 由 GenServer、监督者和任务构建的 OTP 系统。
  • > 为大量类型实现了协议的库和 umbrella 项目。

智能体工作流

  • > 在修改上下文函数的返回结构之前,找到它的所有调用方。
  • > 在添加回调之前,列出实现了某个 behaviour 或协议的模块。
  • > 追踪一次请求从 Phoenix 控制器进入 Ecto 层的过程。

引擎细节

  • > 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

    用于“追踪一次结账请求从控制器到数据库的过程”这类提示词。