SwiftSyntaxとIndexStoreを組み合わせてSwiftコードベースの理解を深めるツールを開発しよう by ockey

iOSDC Japan 2025
レギュラートーク(20分)

SwiftSyntaxとIndexStoreを組み合わせてSwiftコードベースの理解を深めるツールを開発しよう

_ockey_ ockey _ockey_
4

Xcodeでコードを読む際、依存関係を理解するために定義ジャンプやシンボル検索を利用した経験はありませんか?
それらの機能はコードジャンプであり、依存関係を1階層しか調べられません。例えば型やメンバの構造を上下に、そこから選択した要素の依存関係を左右にそれぞれ階層構造で可視化するツールを自作できると、より調べやすくなります。
そのようなツールを開発する際にまず思いつくのが、SwiftSyntaxです。

SwiftSyntaxでは、抽象構文木を走査することでSwiftソースコードの構造を抽出できます。
しかし、SwiftSyntaxを使って依存関係を自力で抽出することは困難です。あるプロパティについて依存関係を抽出したい場合、抽象構文木の各ノードの名前に注目したらいいでしょうか。この時、複数の名前空間があると対応が困難です。

そのような場合に、IndexStoreという強力な仕組みを使うことができます。IndexStoreから各シンボルの位置や一意な識別子、その役割を抽出できます。さらに、シンボルが他のどのシンボルを参照しているかを抽出できます。
一方で、IndexStoreから得られるシンボルの情報だけでは、その型やメンバの構造は分かりません。

そこで、SwiftSyntaxとIndexStoreを組み合わせることで、「この型はこんなメンバを持っていて、それは何に影響を与えていて、何に依存しているのか」という情報を抽出することができます。

本トークでは、以下をお話しします。

  • SwiftSyntaxを使ってソースコードの構造を維持しながら宣言を抽出する方法
  • IndexStoreの概要
  • シンボルの一意な識別子を使って、ネストした宣言に効率良くアクセスする方法
  • SwiftSyntaxとIndexStoreを組み合わせたツールの実装例
  • Xcodeとの比較