Spring til indhold
cd /languages
  • Samtidig BEAM
  • Programmering
  • AST- og symbolunderstøttelse

Elixir i Maguyva: kodegrafer til Phoenix- og OTP-apps

Maguyva understøtter Elixir med AST, symboler og graf, så AI-agenter kan følge moduler, behaviours, protokoller og structs i Phoenix- og OTP-kode.

Hvor Elixir får overfladiske AI-værktøjer til at snuble

Næsten alt i Elixir er et makrokald. defmodule, def, use, alias og @impl parses alle som kald, og use GenServer henter adfærd ind, som aldrig står i filen. Et værktøj, der kun ser kaldsyntaksen, kan ikke skelne en definition fra en afhængighed eller en GenServer-callback fra en hjælpefunktion.

Maguyva gør disse makroer til relationer, så en agent kan se, hvilke moduler der implementerer en behaviour, og hvem der kalder en kontekstfunktion.

Hvad Maguyva udtrækker i Elixir

Maguyva dækker .ex- og .exs-filer. Makroerne i Elixir bliver til relationer sådan her:

  • alias, import og require registrerer imports.
  • use registrerer en import. For OTP- og framework-behaviours som GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView og Ecto.Schema registreres det også, at modulet implementerer den behaviour.
  • @behaviour-attributter og defimpl-blokke registrerer implementeringen af en behaviour eller en protokol.
  • Reserverede modulattributter som @doc, @spec, @impl og @callback registreres som annotationer på den funktion, der følger. Værdiattributter som @timeout 5_000 gør ikke.
  • %User{}-structliteraler tæller som instansiering, raise registrerer et throw, og rescue og catch registrerer en catch.

Sprogmakroer som def, defp, defmodule, case og with filtreres fra kaldene, så kaldgrafen viser dine funktioner.

Eksempler på prompts til agenter

  • “Hvem kalder Accounts.register_user, og fra hvilke controllere?” (find_symbol, derefter dependency_search incoming)
  • “Hvilke moduler implementerer GenServer?” (dependency_search)
  • “Spor en betalingsforespørgsel fra controlleren til databasen.” (get_task_context)

Kendte begrænsninger

  • Navngivne def-, defmodule-, alias- og import-former er kaldnoder i grammatikken, så i structural_search returnerer kun presettet functions resultater, og kun for anonyme fn-funktioner. Brug find_symbol til navngivne funktioner og moduler.
  • Omkring 55 kald fra standardbiblioteket, som IO.puts, String.*, Enum.take og Process.*, filtreres fra relationerne. Brug text_pattern_search til dem.
  • Elixir har ikke klassenedarvning, så nedarvningsrelationer er markeret som ikke relevante.

Næste skridt

Tilslut et repository med hurtigstarten, og se derefter understøttelsesmatricen på kompatibilitetssiden. For andre funktionelle kodebaser kan du læse guiden til Haskell.

Bedst egnet til

  • > Phoenix-applikationer, hvor controllere, LiveViews, kontekster og Ecto-skemaer kalder hinanden på tværs af mange moduler.
  • > OTP-systemer bygget af GenServers, supervisors og tasks.
  • > Biblioteker og umbrella-projekter med protokoller, der er implementeret for mange typer.

Agent-arbejdsgange

  • > Finde alle kaldere af en kontekstfunktion, før formen på dens returværdi ændres.
  • > Liste hvilke moduler der implementerer en behaviour eller en protokol, før en callback tilføjes.
  • > Spore en forespørgsel fra en Phoenix-controller ind i Ecto-laget.

Motordetaljer

  • > Elixir-understøttelsen dækker `.ex` og `.exs`. `alias`, `import`, `require` og `use` registrerer imports.
  • > `use GenServer` og andre angivne OTP- og framework-behaviours, `@behaviour` og `defimpl` registrerer implementeringsrelationer.
  • > Reserverede attributter som `@spec` og `@impl` annoterer den næste funktion, og `%Struct{}`-literaler tæller som instansiering.

Nyttige MCP-indgange

  • find_symbol

    Brug det til en kontekstfunktion eller et modul, når du har brug for definitionen og kalderne; strukturelle presets vælger ikke navngivne `def`-former.

  • dependency_search

    Brug incoming-traversering på en behaviour eller en protokol for at se, hvilke moduler der implementerer den.

  • get_task_context

    Brug det til prompts som "spor en betalingsforespørgsel fra controlleren til databasen".