Passer au contenu
cd /languages
  • Scripting embarqué
  • Programmation
  • Prise en charge de l’AST et des symboles

Lua dans Maguyva : des graphes de code pour jeux, plugins et OpenResty

Maguyva prend en charge Lua avec AST, symboles et graphe, pour que les agents IA suivent modules, méthodes à deux-points, classes par métatable et chaînes de require.

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

Lua n’a pas de mot-clé pour les classes. Les objets sont des tables, les méthodes sont des fonctions stockées dedans, et l’héritage est un appel à setmetatable. Un module est tout ce que renvoie require. La structure est réelle, mais elle vit dans des conventions qu’une recherche textuelle ne comprend pas.

Maguyva lit ces conventions comme de la structure : l’agent peut demander qui appelle une méthode ou quelles tables étendent une base, et obtenir une réponse directe.

Ce que Maguyva extrait en Lua

Maguyva couvre les fichiers .lua. Les déclarations de fonction, les définitions local function et les expressions de fonction sont extraites, et les méthodes à deux-points comme function Account:deposit() sont rattachées à leur table propriétaire, Account. Les chaînes de méthodes sont suivies appel par appel, et les appels sur self restent liés à l’objet englobant.

Les conventions de Lua deviennent des relations :

  • require, dofile et loadfile enregistrent des imports.
  • Un appel à setmetatable au niveau du module enregistre un héritage.
  • ClassName:new(), ClassName.new() et setmetatable({...}, ClassName) comptent comme instanciation.
  • error() enregistre un throw, et pcall et xpcall enregistrent un catch.

Le graphe enregistre aussi les lectures et écritures et le flux de contrôle.

Exemples de prompts pour agents

  • « Qui appelle Inventory:addItem, et depuis quels scripts ? » (find_symbol, puis dependency_search en incoming)
  • « Quels modules chargent util.http avec require ? » (dependency_search)
  • « Retrace ce qui se passe quand le joueur subit des dégâts. » (get_task_context)

Limites connues

  • Environ 150 noms sont filtrés des relations : la bibliothèque standard de Lua (string, table, math, io, os, coroutine, debug et utf8) ainsi que les API vim.* de Neovim et ngx.* d’OpenResty. Les appels à ces API ne sont pas des arêtes du graphe : utilisez text_pattern_search pour les retrouver.
  • Comme modules et classes sont construits avec des appels et des tables ordinaires, les presets classes et imports de structural_search ne sélectionnent rien pour Lua. Utilisez plutôt find_symbol ou text_pattern_search.
  • Lua n’a ni interfaces ni annotations de type : les relations d’implémentation d’interface et de référence de type 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 les moteurs qui embarquent Lua dans du code natif, lisez aussi le guide C.

Idéal pour

  • > Le code de jeu et les scripts de moteur où modules, classes à base de tables et gestionnaires d'événements s'appellent les uns les autres.
  • > Les plugins Neovim et la configuration d'éditeur répartis sur de nombreux modules chargés par require.
  • > OpenResty et les autres usages de Lua embarqué, où les gestionnaires de requêtes côtoient des modules utilitaires partagés.

Workflows d'agent

  • > Trouver tous les appelants d'une fonction de module avant de modifier ses arguments.
  • > Retracer quels modules chargent un helper partagé avec require avant de le déplacer.
  • > Cartographier les tables qui héritent d'une classe de base via `setmetatable`.

Détails du moteur

  • > La prise en charge de Lua couvre `.lua`. Les méthodes à deux-points comme `function Account:deposit()` sont rattachées à leur table propriétaire.
  • > `require`, `dofile` et `loadfile` enregistrent des imports, `setmetatable` au niveau du module enregistre un héritage, et `ClassName:new()` compte comme instanciation.
  • > `error()` enregistre un throw et `pcall` un catch, tandis qu'environ 150 noms de la bibliothèque standard, de `vim.*` et de `ngx.*` sont filtrés.

Points d'entrée MCP utiles

  • find_symbol

    Utilisez-le pour une fonction de module ou une méthode à deux-points quand vous avez besoin de la définition et des appelants.

  • dependency_search

    Utilisez la traversée incoming sur un module partagé pour voir quels fichiers le chargent avec require avant de le déplacer.

  • text_pattern_search

    Utilisez-le pour les appels à `vim.*`, `ngx.*` ou à la bibliothèque standard, qui sont filtrés du graphe.