Passer au contenu
cd /languages
  • BEAM concurrente
  • Programmation
  • Prise en charge de l’AST et des symboles

Elixir dans Maguyva : des graphes de code pour les apps Phoenix et OTP

Maguyva prend en charge Elixir avec AST, symboles et graphe, pour que les agents IA suivent modules, behaviours, protocoles et structs dans le code Phoenix et OTP.

Là où Elixir fait trébucher les outils d’IA superficiels

Presque tout en Elixir est un appel de macro. defmodule, def, use, alias et @impl sont tous analysés comme des appels, et use GenServer apporte un comportement qui n’apparaît jamais dans le fichier. Un outil qui ne voit que la syntaxe d’appel ne distingue ni une définition d’une dépendance, ni un callback GenServer d’un helper.

Maguyva transforme ces macros en relations : l’agent voit quels modules implémentent un behaviour et qui appelle une fonction de contexte.

Ce que Maguyva extrait en Elixir

Maguyva couvre les fichiers .ex et .exs. Les macros d’Elixir deviennent des relations :

  • alias, import et require enregistrent des imports.
  • use enregistre un import. Pour les behaviours OTP et de framework comme GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView et Ecto.Schema, il enregistre aussi que le module implémente ce behaviour.
  • Les attributs @behaviour et les blocs defimpl enregistrent l’implémentation d’un behaviour ou d’un protocole.
  • Les attributs de module réservés comme @doc, @spec, @impl et @callback sont enregistrés comme annotations de la fonction qui suit. Les attributs de valeur comme @timeout 5_000 ne le sont pas.
  • Les littéraux de struct %User{} comptent comme instanciation, raise enregistre un throw, et rescue et catch enregistrent un catch.

Les macros du langage comme def, defp, defmodule, case et with sont filtrées des appels, pour que le graphe d’appels montre vos fonctions.

Exemples de prompts pour agents

  • « Qui appelle Accounts.register_user, et depuis quels contrôleurs ? » (find_symbol, puis dependency_search en incoming)
  • « Quels modules implémentent GenServer ? » (dependency_search)
  • « Retrace une requête de paiement du contrôleur jusqu’à la base de données. » (get_task_context)

Limites connues

  • Les formes nommées def, defmodule, alias et import sont des nœuds d’appel dans la grammaire : dans structural_search, seul le preset functions renvoie des résultats, et uniquement pour les fonctions fn anonymes. Utilisez find_symbol pour les fonctions et modules nommés.
  • Environ 55 appels de la bibliothèque standard, comme IO.puts, String.*, Enum.take et Process.*, sont filtrés des relations. Utilisez text_pattern_search pour les retrouver.
  • Elixir n’a pas d’héritage de classes : les relations d’héritage sont donc marquées comme non applicables.

Étapes suivantes

Connectez un dépôt avec le démarrage rapide, puis consultez la matrice de prise en charge sur la page de compatibilité. Pour d’autres bases de code fonctionnelles, lisez le guide Haskell.

Idéal pour

  • > Les applications Phoenix où contrôleurs, LiveViews, contextes et schémas Ecto s'appellent à travers de nombreux modules.
  • > Les systèmes OTP construits à partir de GenServers, de superviseurs et de tâches.
  • > Les bibliothèques et projets umbrella dont les protocoles sont implémentés pour de nombreux types.

Workflows d'agent

  • > Trouver tous les appelants d'une fonction de contexte avant de changer la forme de son retour.
  • > Lister les modules qui implémentent un behaviour ou un protocole avant d'ajouter un callback.
  • > Retracer une requête depuis un contrôleur Phoenix jusqu'à la couche Ecto.

Détails du moteur

  • > La prise en charge d'Elixir couvre `.ex` et `.exs`. `alias`, `import`, `require` et `use` enregistrent des imports.
  • > `use GenServer` et les autres behaviours OTP et de framework listés, `@behaviour` et `defimpl` enregistrent des relations d'implémentation.
  • > Les attributs réservés comme `@spec` et `@impl` annotent la fonction suivante, et les littéraux `%Struct{}` comptent comme instanciation.

Points d'entrée MCP utiles

  • find_symbol

    Utilisez-le pour une fonction de contexte ou un module quand vous avez besoin de la définition et des appelants ; les presets structurels ne sélectionnent pas les formes `def` nommées.

  • dependency_search

    Utilisez la traversée incoming sur un behaviour ou un protocole pour voir quels modules l'implémentent.

  • get_task_context

    Utilisez-le pour des prompts comme « retrace une requête de paiement du contrôleur jusqu'à la base de données ».