Перейти к содержимому
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

    Используйте для промптов вроде «объясни, как сообщение с рыночными данными доходит до движка стратегий».