本文へスキップ
cd /languages
  • 大規模ネイティブ
  • プログラミング
  • AST・シンボル対応

MaguyvaのC++対応: 大規模コードのクラスとコールグラフ

MaguyvaはAST、シンボル、グラフでC++に対応しています。AIエージェントは大規模なC++コードベースで、クラス、名前空間、仮想関数のオーバーライド、呼び出し元をたどれます。

C++にテキスト検索ではなく構造が必要な理由

C++では、名前は一意ではありません。send は、フリー関数であり、3つのクラスのメンバーであり、4つ目のクラスではオーバーライドであるかもしれません。名前空間、テンプレート、そして .cpp ファイルにある Socket::send のような行外定義が、1つの型を多くのファイルに分割します。テキスト検索はすべての一致を返しますが、呼び出しがそのどれに届くのかはエージェントに教えてくれません。

Maguyvaはクラス、メンバー、呼び出しを所有者と結び付けてインデックスするため、エージェントは編集の前に本当の構造をたどれます。

MaguyvaがC++で抽出するもの

Maguyvaは、.cpp、.cc、.cxx、.hpp、.hh、.hxx を含む、一般的なC++のソースとヘッダーの拡張子に対応しています。クラス、構造体、関数が抽出され、void Socket::send() のような行外定義は、その所有者であるクラスと名前空間に帰属します。仮想メンバーも記録され、テンプレートパラメーターはシグネチャの一部になります。

レシーバーの型付けは、パラメーター、ローカル宣言、フィールド、範囲ベースの for ループ、auto をたどり、unique_ptr、shared_ptr、optional の中まで見通すため、conn->send() のような呼び出しを正しいクラスに解決できます。基底クラスの句は継承に反映され、new 式はインスタンス化として扱われます。

Cと同じエクスポート用・アノテーション用マクロのマスク処理が適用されます。約273個の標準ライブラリの名前(std::cout、std::endl、printf など)は関係性から除外されます。グラフには、呼び出し、インクルード、継承、オーバーライド、インスタンス化、型参照、読み取りと書き込み、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ガイドもご覧ください。

最適な用途

  • > ゲームエンジン、トレーディングシステム、ブラウザなど、1つのヘッダー変更でツリーの半分が再ビルドされる大規模な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

    「マーケットデータのメッセージがストラテジーエンジンに届くまでの流れを説明して」のようなプロンプトに使ってください。