Naar inhoud springen
cd /languages
  • Concurrente BEAM
  • Programmeren
  • AST- en symboolondersteuning

Elixir in Maguyva: codegrafen voor Phoenix- en OTP-apps

Maguyva ondersteunt Elixir met AST, symbolen en graaf, zodat AI-agents modules, behaviours, protocollen en structs volgen in Phoenix- en OTP-code.

Waar Elixir oppervlakkige AI-tools laat struikelen

Bijna alles in Elixir is een macro-aanroep. defmodule, def, use, alias en @impl worden allemaal als aanroepen geparsed, en use GenServer haalt gedrag binnen dat nooit in het bestand staat. Een tool die alleen aanroepsyntaxis ziet, kan een definitie niet van een afhankelijkheid onderscheiden, en een GenServer-callback niet van een helper.

Maguyva zet die macro’s om in relaties, zodat een agent ziet welke modules een behaviour implementeren en wie een contextfunctie aanroept.

Wat Maguyva in Elixir extraheert

Maguyva dekt .ex- en .exs-bestanden. De macro’s van Elixir worden zo relaties:

  • alias, import en require leggen imports vast.
  • use legt een import vast. Voor OTP- en framework-behaviours zoals GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView en Ecto.Schema wordt ook vastgelegd dat de module die behaviour implementeert.
  • @behaviour-attributen en defimpl-blokken leggen de implementatie van een behaviour of protocol vast.
  • Gereserveerde module-attributen zoals @doc, @spec, @impl en @callback worden vastgelegd als annotaties van de functie die volgt. Waarde-attributen zoals @timeout 5_000 niet.
  • %User{}-structliterals tellen als instantiatie, raise legt een throw vast, en rescue en catch leggen een catch vast.

Taalmacro’s zoals def, defp, defmodule, case en with worden uit de aanroepen gefilterd, zodat de aanroepgraaf jouw functies toont.

Voorbeeldprompts voor agents

  • “Wie roept Accounts.register_user aan, en vanuit welke controllers?” (find_symbol, daarna dependency_search incoming)
  • “Welke modules implementeren GenServer?” (dependency_search)
  • “Volg een checkout-request van de controller tot aan de database.” (get_task_context)

Bekende beperkingen

  • Benoemde def-, defmodule-, alias- en import-vormen zijn aanroepknopen in de grammatica, dus in structural_search geeft alleen de preset functions resultaten, en dan alleen voor anonieme fn-functies. Gebruik find_symbol voor benoemde functies en modules.
  • Ongeveer 55 aanroepen uit de standaardbibliotheek, zoals IO.puts, String.*, Enum.take en Process.*, worden uit de relaties gefilterd. Gebruik daarvoor text_pattern_search.
  • Elixir kent geen klasse-overerving, dus overervingsrelaties zijn als niet van toepassing gemarkeerd.

Volgende stappen

Koppel een repository via de snelstart en bekijk daarna de ondersteuningsmatrix op de compatibiliteitspagina. Lees voor andere functionele codebases de Haskell-gids.

Beste toepassing

  • > Phoenix-applicaties waarin controllers, LiveViews, contexts en Ecto-schema's elkaar over veel modules heen aanroepen.
  • > OTP-systemen opgebouwd uit GenServers, supervisors en tasks.
  • > Bibliotheken en umbrella-projecten met protocollen die voor veel types zijn geïmplementeerd.

Agentworkflows

  • > Alle aanroepers van een contextfunctie vinden voordat de vorm van de returnwaarde verandert.
  • > Opsommen welke modules een behaviour of protocol implementeren voordat er een callback bij komt.
  • > Een request volgen van een Phoenix-controller tot in de Ecto-laag.

Enginedetails

  • > Elixir-ondersteuning omvat `.ex` en `.exs`. `alias`, `import`, `require` en `use` leggen imports vast.
  • > `use GenServer` en andere vermelde OTP- en framework-behaviours, `@behaviour` en `defimpl` leggen implementatierelaties vast.
  • > Gereserveerde attributen zoals `@spec` en `@impl` annoteren de volgende functie, en `%Struct{}`-literals tellen als instantiatie.

Nuttige MCP-instappunten

  • find_symbol

    Gebruik het voor een contextfunctie of module wanneer je de definitie en aanroepers nodig hebt; structurele presets selecteren geen benoemde `def`-vormen.

  • dependency_search

    Gebruik incoming-traversal op een behaviour of protocol om te zien welke modules het implementeren.

  • get_task_context

    Gebruik het voor prompts als "volg een checkout-request van de controller tot aan de database."