Przejdź do treści
cd /languages
  • Skrypty osadzone
  • Programowanie
  • Obsługa AST i symboli

Lua w Maguyva: grafy kodu dla gier, wtyczek i OpenResty

Maguyva obsługuje Lua przez AST, symbole i graf, dzięki czemu agenci AI śledzą moduły, metody z dwukropkiem, klasy oparte na metatablicach i łańcuchy require.

Gdzie Lua sprawia kłopot powierzchownym narzędziom AI

Lua nie ma słowa kluczowego dla klas. Obiekty są tablicami, metody to przechowywane w nich funkcje, a dziedziczenie to wywołanie setmetatable. Moduł to cokolwiek zwróci require. Struktura jest prawdziwa, ale żyje w konwencjach, których wyszukiwanie tekstowe nie rozumie.

Maguyva czyta te konwencje jako strukturę, więc agent może zapytać, kto wywołuje metodę albo które tablice rozszerzają bazę, i dostać bezpośrednią odpowiedź.

Co Maguyva wyodrębnia w Lua

Maguyva obejmuje pliki .lua. Wyodrębniane są deklaracje funkcji, definicje local function i wyrażenia funkcyjne, a metody z dwukropkiem, takie jak function Account:deposit(), są przypisywane do tablicy, która jest ich właścicielem, czyli Account. Łańcuchy metod są śledzone wywołanie po wywołaniu, a wywołania na self pozostają powiązane z otaczającym obiektem.

Konwencje Lua stają się relacjami:

  • require, dofile i loadfile zapisują importy.
  • Wywołanie setmetatable na poziomie modułu zapisuje dziedziczenie.
  • ClassName:new(), ClassName.new() i setmetatable({...}, ClassName) liczą się jako tworzenie instancji.
  • error() zapisuje rzucenie błędu, a pcall i xpcall jego przechwycenie.

Graf zapisuje też odczyty i zapisy oraz przepływ sterowania.

Przykładowe prompty dla agentów

  • „Kto wywołuje Inventory:addItem i z których skryptów?” (find_symbol, potem dependency_search incoming)
  • „Które moduły ładują util.http przez require?” (dependency_search)
  • „Prześledź, co się dzieje, gdy gracz otrzymuje obrażenia.” (get_task_context)

Znane ograniczenia

  • Około 150 nazw jest odfiltrowywanych z relacji: biblioteka standardowa Lua (string, table, math, io, os, coroutine, debug i utf8) oraz API Neovima vim.* i API OpenResty ngx.*. Wywołania tych API nie są krawędziami grafu, więc do ich wyszukania użyj text_pattern_search.
  • Ponieważ moduły i klasy powstają ze zwykłych wywołań i tablic, presety classes i imports w structural_search niczego nie wybierają dla Lua. Zamiast nich użyj find_symbol lub text_pattern_search.
  • Lua nie ma interfejsów ani adnotacji typów, więc relacje implementacji interfejsów i odwołań do typów są oznaczone jako nie mające zastosowania.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. W przypadku silników osadzających Lua w kodzie natywnym przeczytaj też przewodnik po C.

Najlepsze dopasowanie

  • > Kod gier i skrypty silnika, w których moduły, klasy oparte na tablicach i obsługa zdarzeń wywołują się nawzajem.
  • > Wtyczki Neovima i konfiguracja edytora rozłożone na wiele modułów ładowanych przez require.
  • > OpenResty i inne osadzone środowiska Lua, w których obsługa żądań sąsiaduje ze współdzielonymi modułami pomocniczymi.

Workflow agentów

  • > Znaleźć wszystkie miejsca wywołujące funkcję modułu przed zmianą jej argumentów.
  • > Prześledzić, które moduły ładują przez require współdzielony moduł pomocniczy, zanim zostanie przeniesiony.
  • > Zmapować tablice dziedziczące po klasie bazowej przez `setmetatable`.

Szczegóły silnika

  • > Obsługa Lua obejmuje `.lua`. Metody z dwukropkiem, takie jak `function Account:deposit()`, są przypisywane do tablicy, która jest ich właścicielem.
  • > `require`, `dofile` i `loadfile` zapisują importy, `setmetatable` na poziomie modułu zapisuje dziedziczenie, a `ClassName:new()` liczy się jako tworzenie instancji.
  • > `error()` zapisuje rzucenie błędu, a `pcall` jego przechwycenie, natomiast około 150 nazw z biblioteki standardowej, `vim.*` i `ngx.*` jest odfiltrowywanych.

Przydatne punkty wejścia MCP

  • find_symbol

    Użyj go dla funkcji modułu lub metody z dwukropkiem, gdy potrzebujesz definicji i wywołujących.

  • dependency_search

    Użyj przejścia incoming na współdzielonym module, aby przed przeniesieniem zobaczyć, które pliki ładują go przez require.

  • text_pattern_search

    Użyj go do wywołań `vim.*`, `ngx.*` lub biblioteki standardowej, które są odfiltrowywane z grafu.