Przejdź do treści
cd /languages
  • Współbieżna BEAM
  • Programowanie
  • Obsługa AST i symboli

Elixir w Maguyva: grafy kodu dla aplikacji Phoenix i OTP

Maguyva obsługuje Elixira przez AST, symbole i graf, dzięki czemu agenci AI śledzą moduły, behaviours, protokoły i struktury w kodzie Phoenix i OTP.

Gdzie Elixir sprawia kłopot powierzchownym narzędziom AI

Prawie wszystko w Elixirze jest wywołaniem makra. defmodule, def, use, alias i @impl są parsowane jako wywołania, a use GenServer wnosi zachowanie, które nigdy nie pojawia się w pliku. Narzędzie, które widzi tylko składnię wywołań, nie odróżni definicji od zależności ani callbacku GenServera od funkcji pomocniczej.

Maguyva zamienia te makra w relacje, więc agent widzi, które moduły implementują behaviour i kto wywołuje funkcję kontekstu.

Co Maguyva wyodrębnia w Elixirze

Maguyva obejmuje pliki .ex i .exs. Makra Elixira stają się relacjami:

  • alias, import i require zapisują importy.
  • use zapisuje import. W przypadku behaviours OTP i frameworków, takich jak GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView i Ecto.Schema, zapisuje także, że moduł implementuje ten behaviour.
  • Atrybuty @behaviour i bloki defimpl zapisują implementację behaviour lub protokołu.
  • Zarezerwowane atrybuty modułu, takie jak @doc, @spec, @impl i @callback, są zapisywane jako adnotacje następującej po nich funkcji. Atrybuty przechowujące wartości, takie jak @timeout 5_000, nie są.
  • Literały struktur %User{} liczą się jako tworzenie instancji, raise zapisuje rzucenie wyjątku, a rescue i catch zapisują jego przechwycenie.

Makra języka, takie jak def, defp, defmodule, case i with, są odfiltrowywane z wywołań, więc graf wywołań pokazuje twoje funkcje.

Przykładowe prompty dla agentów

  • „Kto wywołuje Accounts.register_user i z których kontrolerów?” (find_symbol, potem dependency_search incoming)
  • „Które moduły implementują GenServer?” (dependency_search)
  • „Prześledź żądanie zakupu od kontrolera do bazy danych.” (get_task_context)

Znane ograniczenia

  • Nazwane formy def, defmodule, alias i import są w gramatyce węzłami wywołań, więc w structural_search wyniki zwraca tylko preset functions, i to wyłącznie dla anonimowych funkcji fn. Dla nazwanych funkcji i modułów użyj find_symbol.
  • Około 55 wywołań biblioteki standardowej, takich jak IO.puts, String.*, Enum.take i Process.*, jest odfiltrowywanych z relacji. Do ich wyszukania użyj text_pattern_search.
  • Elixir nie ma dziedziczenia klas, więc relacje dziedziczenia są oznaczone jako nie mające zastosowania.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. W przypadku innych funkcyjnych baz kodu przeczytaj przewodnik po Haskellu.

Najlepsze dopasowanie

  • > Aplikacje Phoenix, w których kontrolery, LiveView, konteksty i schematy Ecto wywołują się nawzajem w wielu modułach.
  • > Systemy OTP zbudowane z GenServerów, supervisorów i zadań.
  • > Biblioteki i projekty umbrella z protokołami zaimplementowanymi dla wielu typów.

Workflow agentów

  • > Znaleźć wszystkie miejsca wywołujące funkcję kontekstu przed zmianą kształtu zwracanej wartości.
  • > Wypisać moduły implementujące behaviour lub protokół przed dodaniem callbacku.
  • > Prześledzić żądanie od kontrolera Phoenix do warstwy Ecto.

Szczegóły silnika

  • > Obsługa Elixira obejmuje `.ex` i `.exs`. `alias`, `import`, `require` i `use` zapisują importy.
  • > `use GenServer` i inne wymienione behaviours OTP i frameworków, `@behaviour` oraz `defimpl` zapisują relacje implementacji.
  • > Zarezerwowane atrybuty, takie jak `@spec` i `@impl`, adnotują następną funkcję, a literały `%Struct{}` liczą się jako tworzenie instancji.

Przydatne punkty wejścia MCP

  • find_symbol

    Użyj go dla funkcji kontekstu lub modułu, gdy potrzebujesz definicji i wywołujących; presety strukturalne nie wybierają nazwanych form `def`.

  • dependency_search

    Użyj przejścia incoming na behaviour lub protokole, aby zobaczyć, które moduły go implementują.

  • get_task_context

    Użyj go do promptów takich jak „Prześledź żądanie zakupu od kontrolera do bazy danych”.