本文へスキップ
cd /languages
  • Appleプラットフォーム
  • プログラミング
  • AST・シンボル対応

MaguyvaのSwift対応: iOSとmacOSのコードグラフ

MaguyvaはAST、シンボル、グラフでSwiftに対応しています。AIエージェントはiOSとmacOSのコードのプロトコル、エクステンション、イニシャライザー、オブザーバーをたどれます。

Swiftにファイル検索以上のものが必要な理由

Swiftは1つの型を多くの場所に広げます。構造体はあるファイルで宣言され、ほかの3つのファイルのエクステンションから振る舞いを得て、パッケージで定義されたプロトコルに準拠します。状態の変更は計算プロパティや willSet / didSet オブザーバーに隠れています。ファイルを1つずつ読むエージェントは、その大半を見落とします。

Maguyvaは構造をインデックスするため、エージェントは型のメンバー、準拠、呼び出し元をまとめて見ることができます。

MaguyvaがSwiftで抽出するもの

Maguyvaは .swift に対応しています。呼び出し可能なシンボルには、関数、init と deinit、サブスクリプト、計算プロパティのゲッターとセッター、willSet / didSet オブザーバーが含まれるため、状態を変えるコードはプロパティの本体に埋もれず、シンボルとして検索できます。

構造体、列挙型、プロトコル、エクステンションの中で宣言されたメンバーは、所有する型で修飾され(例: CartStore.add)、エクステンションで追加されたメンバーは拡張される型に帰属します。定義名からはジェネリックパラメーター、プロトコル準拠のリスト、? / ! の接尾辞が取り除かれるため、検索はそのままの名前で行えます。呼び出しは self. とクラス修飾を保持し、トレイリングクロージャーも呼び出しの引数の数に数えられます。

グラフには、呼び出し、プロトコル準拠、継承、オーバーライド、インスタンス化、属性、型参照、読み取りと書き込み、throw のエッジが記録されます。

エージェントへのプロンプト例

  • 「PaymentProvider に準拠する型はどれで、それぞれどこで生成されているか?」(dependency_search)
  • 「CartStore.add を呼び出しているのは誰で、どのビューからか?」(find_symbol、次に dependency_search の incoming)
  • 「プッシュ通知が受信箱の画面に届くまでの流れを説明して。」(get_task_context)

既知の制限

  • 対応付けられているのは .swift のソースだけです。StoryboardとXIBのファイルは拡張子リストに含まれていないため、Interface Builderでの接続はグラフの対象外です。
  • print、debugPrint、NSLog、アサーションなどの標準ライブラリやFoundationの呼び出しは関係性から除外されるため、グラフのエッジになりません。それらには text_pattern_search を使ってください。

次のステップ

クイックスタートでリポジトリを接続し、互換性ページで対応マトリクスを確認してください。同じ製品をAndroidでも提供している場合は、Kotlinガイドをご覧ください。

最適な用途

  • > 大きなアプリターゲットと共有Swiftパッケージを持つiOSおよびmacOSのチーム。
  • > プロトコルとエクステンションを中心に作られ、1つの型の振る舞いが多くのファイルに散らばるコードベース。
  • > 共有のモデル、サービス、プロトコルを変更する前に影響分析が必要なエージェントのワークフロー。

エージェントワークフロー

  • > プロトコルの要件を変更する前に、そのプロトコルに準拠する型をすべて見つける。
  • > ViewModel、コーディネーター、パッケージをまたいで、サービスメソッドの呼び出し元を追跡する。
  • > ある状態に触れるイニシャライザー、計算プロパティ、`didSet` オブザーバーを特定する。

エンジンの詳細

  • > 呼び出し可能なシンボルには、関数、`init`、`deinit`、サブスクリプト、計算プロパティのゲッターとセッター、`willSet` / `didSet` オブザーバーが含まれます。
  • > 構造体、列挙型、プロトコル、エクステンションのメンバーは、`CartStore.add` のように所有する型で修飾されます。
  • > 定義名からはジェネリックパラメーター、プロトコル準拠のリスト、`?` / `!` の接尾辞が取り除かれ、呼び出しは `self.` とクラス修飾を保持します。

役立つMCPエントリーポイント

  • find_symbol

    定義と参照が必要なときに、型、プロトコル、メソッドの名前で使ってください。

  • dependency_search

    プロトコルに対して使えば準拠する型が、メソッドに対してincomingで使えば呼び出し元が見つかります。

  • get_task_context

    「プッシュ通知が受信箱の画面に届くまでの流れを説明して」のようなプロンプトに使ってください。