Перейти до вмісту
cd /languages
  • Нативний код у масштабі
  • Програмування
  • Підтримка AST і символів

C++ у Maguyva: графи класів і викликів для великих кодових баз

Maguyva підтримує C++ з AST, символами та графом, щоб ШІ-агенти відстежували класи, простори імен, віртуальні перевизначення й тих, хто викликає, у великих кодових базах.

Чому C++ потрібна структура, а не текстовий пошук

У C++ назви не унікальні. send може бути вільною функцією, членом трьох класів і перевизначенням у четвертому. Простори імен, шаблони й визначення поза класом, як-от Socket::send у файлі .cpp, розподіляють один тип по багатьох файлах. Текстовий пошук повертає всі збіги, але не каже агентові, до якого з них доходить виклик.

Maguyva індексує класи, члени й виклики разом з їхніми власниками, щоб агент ішов реальною структурою, перш ніж вносити правки.

Що Maguyva витягує з C++

Maguyva охоплює поширені розширення вихідних і заголовкових файлів C++, зокрема .cpp, .cc, .cxx, .hpp, .hh і .hxx. Витягуються класи, структури й функції, а визначення поза класом, як-от void Socket::send(), належить до класу-власника та простору імен. Віртуальні члени фіксуються, а параметри шаблонів входять до сигнатур.

Типізація отримувачів відстежує параметри, локальні оголошення, поля, цикли for по діапазону та auto, а також зазирає всередину unique_ptr, shared_ptr і optional, тож виклик на кшталт conn->send() можна розв’язати в потрібний клас. Списки базових класів живлять успадкування, а вирази new вважаються створенням екземплярів.

Діє те саме маскування макросів експорту й анотацій, що й у C. Близько 273 назв стандартної бібліотеки (std::cout, std::endl, printf тощо) відфільтровуються зі зв’язків. Граф фіксує виклики, include, успадкування, перевизначення, створення екземплярів, посилання на типи, читання й записи, а також ребра throw.

Приклади промптів для агентів

  • «Які класи перевизначають Renderer::draw і хто його викликає?» (dependency_search)
  • «Покажи OrderBook::match і всіх, хто його викликає.» (find_symbol)
  • «Поясни, як повідомлення з ринковими даними доходить до рушія стратегій.» (get_task_context)

Відомі обмеження

  • .h входить до списків розширень C, C++ і Objective-C, тому в деревах, де змішано C і C++, заголовки спільні для цих профілів.
  • Тіла об’єктних макросів не розбираються, а виклики відфільтрованих назв стандартної бібліотеки не стають ребрами графа. Для макросів і використання std:: застосовуйте text_pattern_search.

Наступні кроки

Під’єднайте репозиторій за швидким стартом, потім перегляньте матрицю підтримки на сторінці сумісності. Якщо частину дерева написано на чистому C, прочитайте також посібник із C.

Найкраще підходить

  • > Ігрові рушії, торгові системи, браузери та інші великі кодові бази на C++, де правка одного заголовка перезбирає пів дерева.
  • > Ієрархії класів із віртуальними методами, де метод, що виконується, визначено не там, де його викликають.
  • > Рефакторинг за участі агентів, якому перед зміною сигнатури потрібні ті, хто викликає, і перевизначення.

Робочі процеси агента

  • > Знайти всі перевизначення віртуального методу, перш ніж змінювати базовий клас.
  • > Перелічити по всій кодовій базі тих, хто викликає функцію чи метод класу з простору імен, наприклад `net::Socket::send`.
  • > Простежити, де клас створюється через `new` і яких членів він торкається далі.

Деталі рушія

  • > Визначення поза класом, як-от `void Socket::send()`, належать до класу-власника та простору імен, а віртуальні члени фіксуються.
  • > Типізація отримувачів відстежує параметри, локальні змінні, поля, `for` по діапазону та `auto` і зазирає всередину `unique_ptr`, `shared_ptr` і `optional`.
  • > Списки базових класів живлять успадкування, вирази `new` вважаються створенням екземплярів, а близько 273 назв стандартної бібліотеки відфільтровуються зі зв'язків.

Корисні точки входу MCP

  • find_symbol

    Використовуйте з кваліфікованою назвою на кшталт `OrderBook::match`, коли потрібні визначення й ті, хто викликає.

  • dependency_search

    Перед зміною сигнатури використовуйте для базового класу чи віртуального методу, щоб знайти перевизначення й тих, хто викликає.

  • get_task_context

    Використовуйте для промптів на кшталт «поясни, як повідомлення з ринковими даними доходить до рушія стратегій».