Перейти до вмісту
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

    Використовуйте для промптів на кшталт «простеж платіжний запит від контролера до бази даних».