😺
Tree-sitterを使ってコードベースから関数定義を抽出する
はじめに
大量のファイルがあるコードベースの中から関数やクラスの定義を抽出できるとそれをLLMのコンテキストに埋め込んでコード生成や読解、ドキュメント生成などに利用できます。
この記事では、Tree-sitterを使用してPHPコードから関数定義を抽出する方法を紹介します。
Tree-sitterとは
Tree-sitterは高速な構文解析ライブラリで、多くのプログラミング言語に対応しています。Zedなどの多くのモダンエディタでも採用されている技術です。
実装例
Tree-sitterは各言語から呼び出せるバインディングが用意されています。
以下のNode.jsスクリプトは、指定されたディレクトリ内のPHPファイルから関数とクラスの定義を抽出します:
使い方
- 必要なパッケージのインストール:
npm install tree-sitter tree-sitter-php
- スクリプトを実行:
node index.cjs /path/to/php/dir/
出力例
スクリプトは以下のような形式で関数定義を出力します:
src/Example.php
|----
│class Example {
│public function doSomething() {
|----
'laravel/slack-notification-channel'に対して実行した例
❯ node index.cjs ./vendor/laravel/slack-notification-channel/src/ | head -n 10
Channels/SlackWebhookChannel.php
|----
│class SlackWebhookChannel
|----
│ public function __construct(HttpClient $http)
|----
│ public function send($notifiable, Notification $notification)
|----
│ protected function buildJsonPayload(SlackMessage $message)
|----
# ...
(※とはいえOSSライブラリは通常ドキュメントが整備されているので、このような取り組みはインハウスなコードのドキュメント抽出に有効です)
ポイント
- PHP以外の言語で同じことをしたい場合には該当するNPMモジュールを使います(例:tree-sitter-typescript)→ https://www.npmjs.com/search?q=tree-sitter
- クエリのS式はClineのリポジトリに使いやすい定義があります→ https://github.com/cline/cline/blob/main/src/services/tree-sitter/queries/php.ts
Discussion