Naar inhoud springen
cd /languages
  • Native op grote schaal
  • Programmeren
  • AST- en symboolondersteuning

C++ in Maguyva: klassen- en aanroepgrafen voor grote codebases

Maguyva ondersteunt C++ met AST, symbolen en graaf, zodat AI-agents klassen, namespaces, virtuele overrides en aanroepers volgen in grote C++-codebases.

Waarom C++ structuur nodig heeft in plaats van tekstzoeken

In C++ zijn namen niet uniek. send kan een losse functie zijn, een member van drie klassen en een override in een vierde. Namespaces, templates en definities buiten de klasse, zoals Socket::send in een .cpp-bestand, verdelen één type over veel bestanden. Tekstzoeken levert elke match op, maar vertelt een agent niet welke een aanroep bereikt.

Maguyva indexeert klassen, members en aanroepen samen met hun eigenaars, zodat een agent de echte structuur kan volgen voordat hij iets wijzigt.

Wat Maguyva in C++ extraheert

Maguyva dekt de gangbare C++-extensies voor bron- en headerbestanden, waaronder .cpp, .cc, .cxx, .hpp, .hh en .hxx. Klassen, structs en functies worden geëxtraheerd, en een definitie buiten de klasse zoals void Socket::send() wordt toegeschreven aan haar eigenaarklasse en namespace. Virtuele members worden vastgelegd, en templateparameters maken deel uit van signaturen.

Receivertypering volgt parameters, lokale declaraties, velden, range-based for-lussen en auto, en kijkt door unique_ptr, shared_ptr en optional heen, zodat een aanroep zoals conn->send() naar de juiste klasse kan worden opgelost. Basisklasseclausules voeden de overerving, en new-expressies tellen als instantiëring.

Dezelfde maskering van export- en annotatiemacro’s als bij C is van toepassing. Ongeveer 273 namen uit de standaardbibliotheek (std::cout, std::endl, printf en vergelijkbare) worden uit de relaties gefilterd. De graaf legt aanroepen vast, includes, overerving, overrides, instantiëring, typeverwijzingen, lees- en schrijfacties, en throw-randen.

Voorbeeldprompts voor agents

  • “Welke klassen overschrijven Renderer::draw, en wie roept het aan?” (dependency_search)
  • “Laat me OrderBook::match en elke aanroeper zien.” (find_symbol)
  • “Leg uit hoe een marktdatabericht de strategie-engine bereikt.” (get_task_context)

Bekende beperkingen

  • .h staat in de extensielijsten van C, C++ en Objective-C, dus in bomen met zowel C als C++ worden headers door die profielen gedeeld.
  • Bodies van objectachtige macro’s worden niet geparseerd, en aanroepen van gefilterde namen uit de standaardbibliotheek zijn geen randen in de graaf. Gebruik text_pattern_search voor macro’s en gebruik van std::.

Volgende stappen

Koppel een repository via de snelstart en bekijk daarna de ondersteuningsmatrix op de compatibiliteitspagina. Is een deel van de boom puur C, lees dan ook de C-gids.

Beste toepassing

  • > Game-engines, handelssystemen, browsers en andere grote C++-codebases waarin één headerwijziging de halve boom opnieuw bouwt.
  • > Klassenhiërarchieën met virtuele methoden, waarbij de methode die draait ergens anders is gedefinieerd dan waar ze wordt aangeroepen.
  • > Door agents ondersteunde refactoring die aanroepers en overrides nodig heeft vóór een signatuurwijziging.

Agentworkflows

  • > Elke override van een virtuele methode vinden voordat de basisklasse verandert.
  • > In de hele codebase de aanroepers opsommen van een functie of klassemethode met namespace, zoals `net::Socket::send`.
  • > Nagaan waar een klasse met `new` wordt aangemaakt en welke members ze daarna raakt.

Enginedetails

  • > Definities buiten de klasse zoals `void Socket::send()` worden toegeschreven aan hun eigenaarklasse en namespace, en virtuele members worden vastgelegd.
  • > Receivertypering volgt parameters, lokale variabelen, velden, range-based `for` en `auto`, en kijkt door `unique_ptr`, `shared_ptr` en `optional` heen.
  • > Basisklasseclausules voeden de overerving, `new`-expressies tellen als instantiëring, en ongeveer 273 namen uit de standaardbibliotheek worden uit de relaties gefilterd.

Nuttige MCP-instappunten

  • find_symbol

    Gebruik het voor een gekwalificeerde naam zoals `OrderBook::match` wanneer je de definitie en aanroepers nodig hebt.

  • dependency_search

    Gebruik het vóór een signatuurwijziging op een basisklasse of virtuele methode om overrides en aanroepers te vinden.

  • get_task_context

    Gebruik het voor prompts zoals "leg uit hoe een marktdatabericht de strategie-engine bereikt".