Przejdź do treści
cd /languages
  • Natywny kod na dużą skalę
  • Programowanie
  • Obsługa AST i symboli

C++ w Maguyva: grafy klas i wywołań dla dużych baz kodu

Maguyva obsługuje C++ przez AST, symbole i graf, dzięki czemu agenci AI śledzą klasy, przestrzenie nazw, wirtualne nadpisania i wywołujących w dużych bazach kodu C++.

Dlaczego C++ potrzebuje struktury, a nie wyszukiwania tekstu

W C++ nazwy nie są unikalne. send może być wolną funkcją, składową trzech klas i nadpisaniem w czwartej. Przestrzenie nazw, szablony i definicje poza klasą, takie jak Socket::send w pliku .cpp, rozpraszają jeden typ po wielu plikach. Wyszukiwanie tekstowe zwraca każde dopasowanie, ale nie mówi agentowi, do którego trafia wywołanie.

Maguyva indeksuje klasy, składowe i wywołania razem z ich właścicielami, aby agent mógł podążać za prawdziwą strukturą przed edycją.

Co Maguyva wyodrębnia w C++

Maguyva obejmuje typowe rozszerzenia źródeł i nagłówków C++, w tym .cpp, .cc, .cxx, .hpp, .hh i .hxx. Wyodrębniane są klasy, struktury i funkcje, a definicja poza klasą, taka jak void Socket::send(), jest przypisywana do klasy i przestrzeni nazw właściciela. Składowe wirtualne są zapisywane, a parametry szablonów są częścią sygnatur.

Typowanie odbiorców śledzi parametry, deklaracje lokalne, pola, pętle for oparte na zakresie oraz auto, i patrzy przez unique_ptr, shared_ptr i optional, więc wywołanie takie jak conn->send() można rozwiązać do właściwej klasy. Klauzule klas bazowych zasilają dziedziczenie, a wyrażenia new liczą się jako tworzenie instancji.

Obowiązuje to samo maskowanie makr eksportu i adnotacji co w C. Około 273 nazw biblioteki standardowej (std::cout, std::endl, printf i podobne) jest filtrowanych z relacji. Graf zapisuje wywołania, include’y, dziedziczenie, nadpisania, tworzenie instancji, odwołania do typów, odczyty i zapisy oraz krawędzie throw.

Przykładowe prompty dla agentów

  • „Które klasy nadpisują Renderer::draw i kto je wywołuje?” (dependency_search)
  • „Pokaż mi OrderBook::match i wszystkich wywołujących.” (find_symbol)
  • „Wyjaśnij, jak komunikat z danymi rynkowymi trafia do silnika strategii.” (get_task_context)

Znane ograniczenia

  • .h występuje na listach rozszerzeń C, C++ i Objective-C, więc w drzewach łączących C i C++ nagłówki są współdzielone między tymi profilami.
  • Treści makr obiektowych nie są parsowane, a wywołania odfiltrowanych nazw biblioteki standardowej nie są krawędziami grafu. Do makr i użyć std:: stosuj text_pattern_search.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. Jeśli część drzewa to czyste C, przeczytaj też przewodnik po C.

Najlepsze dopasowanie

  • > Silniki gier, systemy transakcyjne, przeglądarki i inne duże bazy kodu C++, w których zmiana jednego nagłówka przebudowuje pół drzewa.
  • > Hierarchie klas z metodami wirtualnymi, w których wykonywana metoda jest zdefiniowana w innym miejscu niż wywołanie.
  • > Refaktoryzacje wspierane przez agentów, które przed zmianą sygnatury potrzebują wywołujących i nadpisań.

Workflow agentów

  • > Znaleźć wszystkie nadpisania metody wirtualnej przed zmianą klasy bazowej.
  • > Wypisać w całej bazie kodu wywołujących funkcję lub metodę klasy z przestrzenią nazw, na przykład `net::Socket::send`.
  • > Prześledzić, gdzie klasa jest tworzona przez `new` i których składowych dotyka potem.

Szczegóły silnika

  • > Definicje poza klasą, takie jak `void Socket::send()`, są przypisywane do klasy i przestrzeni nazw właściciela, a składowe wirtualne są zapisywane.
  • > Typowanie odbiorców śledzi parametry, zmienne lokalne, pola, `for` oparte na zakresie i `auto`, i patrzy przez `unique_ptr`, `shared_ptr` i `optional`.
  • > Klauzule klas bazowych zasilają dziedziczenie, wyrażenia `new` liczą się jako tworzenie instancji, a około 273 nazw biblioteki standardowej jest filtrowanych z relacji.

Przydatne punkty wejścia MCP

  • find_symbol

    Używaj go z nazwą kwalifikowaną, taką jak `OrderBook::match`, gdy potrzebujesz definicji i wywołujących.

  • dependency_search

    Przed zmianą sygnatury użyj go na klasie bazowej lub metodzie wirtualnej, aby znaleźć nadpisania i wywołujących.

  • get_task_context

    Używaj go do promptów typu „wyjaśnij, jak komunikat z danymi rynkowymi trafia do silnika strategii”.