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

Canonical source: https://maguyva.ai/ru/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 поддерживает Elixir с AST, символами и графом, чтобы ИИ-агенты могли прослеживать модули, behaviour, протоколы и структуры в коде на Phoenix и OTP.

## Сводка поддержки

- Уровень: Поддержка AST и символов
- Программирование
- Расширения: .ex, .exs
- Настоящий AST-разбор для синтаксически осведомлённого поиска и структурного контекста.
- Именованные символы обеспечивают семантический поиск и перекрёстные ссылки. Навигация по графу доступна, когда включено извлечение связей.
- Этот язык добавляет символы и связи в поиск с учётом графа; поддерживаемые типы рёбер зависят от присущих ему конструкций.
- Доступны и AST-разбор, и извлечение символов.

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

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

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

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

## Где 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 нет наследования классов, поэтому связи наследования помечены как неприменимые.

## Следующие шаги

Подключите репозиторий по [быстрому старту](/ru/docs/quickstart), затем изучите матрицу поддержки на [странице совместимости](/ru/docs/compatibility). Для других функциональных кодовых баз прочитайте [руководство по Haskell](/ru/languages/haskell).

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

- Поддержка 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`: Используйте для промптов вроде «проследи платёжный запрос от контроллера до базы данных».
