Перейти к содержимому
cd /languages
  • Конкурентная BEAM
  • Программирование
  • Поддержка AST и символов

Elixir в Maguyva: графы кода для приложений на Phoenix и OTP

Maguyva поддерживает Elixir с AST, символами и графом, чтобы ИИ-агенты могли прослеживать модули, behaviour, протоколы и структуры в коде на Phoenix и OTP.

Где Elixir сбивает с толку поверхностные ИИ-инструменты

Почти всё в Elixir является вызовом макроса. defmodule, def, use, alias и @impl разбираются как вызовы, а use GenServer привносит поведение, которого в файле никогда не видно. Инструмент, который видит только синтаксис вызовов, не может отличить определение от зависимости или колбэк GenServer от вспомогательной функции.

Maguyva превращает эти макросы в связи, и агент видит, какие модули реализуют behaviour и кто вызывает функцию контекста.

Что Maguyva извлекает из Elixir

Maguyva охватывает файлы .ex и .exs. Макросы Elixir становятся связями так:

  • alias, import и require фиксируют импорты.
  • use фиксирует импорт. Для behaviour OTP и фреймворков, таких как GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView и Ecto.Schema, он также фиксирует, что модуль реализует этот 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 по входящим связям)
  • «Какие модули реализуют 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.

Лучше всего подходит

  • > Приложения на Phoenix, где контроллеры, LiveView, контексты и схемы Ecto вызывают друг друга во многих модулях.
  • > Системы OTP, построенные из GenServer, супервизоров и задач.
  • > Библиотеки и umbrella-проекты, где протоколы реализованы для многих типов.

Сценарии работы агента

  • > Найти все вызовы функции контекста, прежде чем менять форму её возвращаемого значения.
  • > Перечислить модули, реализующие behaviour или протокол, прежде чем добавлять колбэк.
  • > Проследить запрос от контроллера Phoenix до слоя Ecto.

Детали движка

  • > Поддержка Elixir охватывает файлы `.ex` и `.exs`. `alias`, `import`, `require` и `use` фиксируют импорты.
  • > `use GenServer` и другие перечисленные behaviour OTP и фреймворков, `@behaviour` и `defimpl` фиксируют связи реализации.
  • > Зарезервированные атрибуты вроде `@spec` и `@impl` аннотируют следующую функцию; литералы `%Struct{}` считаются созданием экземпляра.

Полезные точки входа MCP

  • find_symbol

    Используйте для функции контекста или модуля, когда нужны определение и вызовы; структурные пресеты не выбирают именованные формы `def`.

  • dependency_search

    Используйте обход входящих связей, чтобы увидеть, какие модули реализуют behaviour или протокол.

  • get_task_context

    Используйте для промптов вроде «проследи платёжный запрос от контроллера до базы данных».