Hoppa till innehåll
cd /languages
  • Samtidig BEAM
  • Programmering
  • Stöd för AST och symboler

Elixir i Maguyva: kodgrafer för Phoenix- och OTP-appar

Maguyva stöder Elixir med AST, symboler och graf, så att AI-agenter kan följa moduler, behaviours, protokoll och structs i Phoenix- och OTP-kod.

Där Elixir får ytliga AI-verktyg att snubbla

Nästan allt i Elixir är ett makroanrop. defmodule, def, use, alias och @impl tolkas alla som anrop, och use GenServer tar in beteende som aldrig syns i filen. Ett verktyg som bara ser anropssyntaxen kan inte skilja en definition från ett beroende, eller en GenServer-callback från en hjälpfunktion.

Maguyva gör om de makrona till relationer, så att en agent ser vilka moduler som implementerar en behaviour och vem som anropar en kontextfunktion.

Vad Maguyva extraherar i Elixir

Maguyva täcker .ex- och .exs-filer. Elixirs makron blir relationer så här:

  • alias, import och require registrerar importer.
  • use registrerar en import. För OTP- och ramverks-behaviours som GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView och Ecto.Schema registreras också att modulen implementerar den behaviouren.
  • @behaviour-attribut och defimpl-block registrerar implementationen av en behaviour eller ett protokoll.
  • Reserverade modulattribut som @doc, @spec, @impl och @callback registreras som annoteringar på funktionen som följer. Värdeattribut som @timeout 5_000 gör det inte.
  • %User{}-structliteraler räknas som instansiering, raise registrerar ett throw, och rescue och catch registrerar en catch.

Språkmakron som def, defp, defmodule, case och with filtreras bort från anropen, så att anropsgrafen visar dina funktioner.

Exempel på prompter för agenter

  • “Vem anropar Accounts.register_user, och från vilka controllers?” (find_symbol, sedan dependency_search incoming)
  • “Vilka moduler implementerar GenServer?” (dependency_search)
  • “Spåra en betalningsförfrågan från controllern till databasen.” (get_task_context)

Kända begränsningar

  • Namngivna def-, defmodule-, alias- och import-former är anropsnoder i grammatiken, så i structural_search returnerar bara presetet functions resultat, och bara för anonyma fn-funktioner. Använd find_symbol för namngivna funktioner och moduler.
  • Omkring 55 anrop från standardbiblioteket, som IO.puts, String.*, Enum.take och Process.*, filtreras bort från relationerna. Använd text_pattern_search för dem.
  • Elixir har inget klassarv, så arvsrelationer är markerade som ej tillämpliga.

Nästa steg

Anslut ett repo med snabbstarten och kontrollera sedan stödmatrisen på kompatibilitetssidan. För andra funktionella kodbaser, läs guiden för Haskell.

Bäst lämpad för

  • > Phoenix-applikationer där controllers, LiveViews, kontexter och Ecto-scheman anropar varandra över många moduler.
  • > OTP-system byggda av GenServers, supervisors och tasks.
  • > Bibliotek och umbrella-projekt med protokoll som implementeras för många typer.

Agentarbetsflöden

  • > Hitta alla anropare av en kontextfunktion innan formen på dess returvärde ändras.
  • > Lista vilka moduler som implementerar en behaviour eller ett protokoll innan en callback läggs till.
  • > Spåra en förfrågan från en Phoenix-controller in i Ecto-lagret.

Motordetaljer

  • > Elixir-stödet omfattar `.ex` och `.exs`. `alias`, `import`, `require` och `use` registrerar importer.
  • > `use GenServer` och andra listade OTP- och ramverks-behaviours, `@behaviour` och `defimpl` registrerar implementationsrelationer.
  • > Reserverade attribut som `@spec` och `@impl` annoterar nästa funktion, och `%Struct{}`-literaler räknas som instansiering.

Användbara MCP-ingångar

  • find_symbol

    Använd det för en kontextfunktion eller modul när du behöver definitionen och anroparna; strukturella preset väljer inte namngivna `def`-former.

  • dependency_search

    Använd incoming-traversering på en behaviour eller ett protokoll för att se vilka moduler som implementerar det.

  • get_task_context

    Använd det för prompter som "spåra en betalningsförfrågan från controllern till databasen".