Call Hierarchy Copy
VS Codeの呼び出し階層を、ツリーの手動展開なしでテキスト出力する拡張です。Javaの開発向けに、テストコードを除外する設定を標準で有効にしています。
インストール
VS Codeの拡張機能ビュー(Ctrl+Shift+X)で Call Hierarchy Copy を検索し、公開者が fftcysstkm の拡張をインストールしてください。
コマンドラインでもインストールできます。
code --install-extension fftcysstkm.call-hierarchy-copy
Javaで使う場合は Language Support for Java(TM) by Red Hat(redhat.java)も有効にし、プロジェクトの読み込みが完了するまで待ちます。
VSIXからインストールする場合
- VS Codeの拡張機能ビューを開きます(
Ctrl+Shift+X)。
- 右上の
… → VSIX からのインストール… を選びます。
- このフォルダの
call-hierarchy-copy-0.2.0.vsix を選びます(旧バージョンからも同じ手順で更新できます)。
- Java用に Language Support for Java(TM) by Red Hat(
redhat.java)を有効にし、プロジェクトの読み込みが完了するまで待ちます。
GitHubからクローンした場合は、下記の「開発・検証」の手順で npm install と npm run package を実行するとVSIXを作成できます。VSIXや依存パッケージはGitの管理対象に含めていません。
VSIXはコマンドラインでもインストールできます。
code --install-extension .\call-hierarchy-copy-0.2.0.vsix
以前のローカル版(ID: local-tools.call-hierarchy-copy)をインストールしている場合は、Marketplace版への移行時にローカル版を無効化またはアンインストールしてください。設定名は共通なので、そのまま引き継げます。
VS Code 1.85以上に対応。Java以外でも、呼び出し階層を提供する言語拡張があれば利用できます。
使い方
ソースコード内の対象メソッドの名前にカーソルを置いて右クリックし、呼び出し階層をテキスト出力から操作を選びます。組み込みの「呼び出し階層」ビューを開いたり、クリックして展開したりする必要はありません。
| メニュー |
出力する内容 |
| 呼び出し元をテキストにコピー |
対象を呼ぶメソッド → さらにその呼び出し元 |
| 呼び出し先をテキストにコピー |
対象が呼ぶメソッド → さらにその呼び出し先 |
| 呼び出し元をテキストで開く |
呼び出し元の結果を新しいテキストエディターに表示 |
| 呼び出し先をテキストで開く |
呼び出し先の結果を新しいテキストエディターに表示 |
Ctrl+Shift+P で Call Hierarchy Copy と入力しても実行できます。テキストで開いた結果は Ctrl+S で .txt として保存できます。進行状況の通知からキャンセルすると、クリップボードへの書き込みや結果の表示を行わず終了します。
出力イメージ(名前や詳細の表記は言語拡張により異なります):
呼び出し階層: 呼び出し元(このメソッドを呼ぶ側)
テスト除外: ON(パス・ファイル名で判定)
出力: 3件 / 除外: 1項目
#1 work() — demo.Service (src/main/java/demo/Service.java:4)
└─ #2 run() — demo.EntryPoint (src/main/java/demo/EntryPoint.java:8)
└─ #3 main(String[]) — demo.EntryPoint (src/main/java/demo/EntryPoint.java:4)
Excel向けのタブ形式
設定画面の Call Hierarchy Copy: Output Format を tabs に変更するか、settings.json に以下を追加してください。
{
"callHierarchyCopy.outputFormat": "tabs"
}
階層の深さごとにタブを1つ入れます。└─、├─、│、#番号 は付けません。Excelのセルを選んで貼り付けると、起点はA列、子はB列、孫はC列のように配置されます。コピーとテキストプレビューの両方に適用されます。
work()
run()
main(String[])
例は階層部分のみです。先頭の集計・注意書きは出力に残ります。メソッド名だけにしたい場合は includeDetails と includeLocation も false にしてください。タブ形式でも [循環参照]、[展開済み]、上限・エラーの注記は残りますが、参照先の項目番号は付けません。
元の罫線付き表示に戻すには outputFormat を tree にします(初期値)。
テスト除外と設定
設定画面で @ext:fftcysstkm.call-hierarchy-copy を検索してください。設定はプロジェクトの .vscode/settings.json にも保存できます。
{
"callHierarchyCopy.outputFormat": "tree",
"callHierarchyCopy.excludeTests": true,
"callHierarchyCopy.maxDepth": 0,
"callHierarchyCopy.maxNodes": 2000,
"callHierarchyCopy.deduplicate": true,
"callHierarchyCopy.includeDetails": true,
"callHierarchyCopy.includeLocation": true,
"callHierarchyCopy.requestTimeoutSeconds": 30,
"callHierarchyCopy.excludePatterns": ["**/generated/**"]
}
| 設定 |
初期値 |
意味 |
outputFormat |
"tree" |
tree: 罫線・番号付き、tabs: 階層ごとのタブのみ |
excludeTests |
true |
テストの項目とその先の枝を除外 |
testFilePatterns |
下記 |
テストとみなすglobパターン |
excludePatterns |
[] |
テスト設定とは独立した追加除外パターン |
maxDepth |
0 |
起点を0とする最大深度。0は深さ制限なし |
maxNodes |
2000 |
起点・参照を含む最大出力件数(最大50,000) |
deduplicate |
true |
同じ項目は初出で展開し、以降は参照表示 |
includeDetails |
true |
クラスなど、言語拡張が返す詳細情報 |
includeLocation |
true |
定義のファイルパスと1始まりの行番号 |
requestTimeoutSeconds |
30 |
問い合わせ1回の待機上限(秒) |
標準の testFilePatterns は以下です。変更すると配列全体を置き換えるため、追加したい場合は標準分も含めて指定してください。パス区切りは / 推奨で、大文字小文字は区別しません。
{
"callHierarchyCopy.testFilePatterns": [
"**/src/test/**",
"**/src/testFixtures/**",
"**/src/integrationTest/**",
"**/src/androidTest/**",
"**/test/**",
"**/tests/**",
"**/*Test.java",
"**/*Tests.java",
"**/*TestCase.java",
"**/Test*.java",
"**/*IT.java"
]
}
- 判定はパスとファイル名に基づきます。JUnitの
@Test やビルドツールの独自テストソース設定を直接解析しません。独自の配置にはパターンを追加してください。
- 明示的に選んだ起点は、除外条件に一致していても出力します。
- 除外件数は、取得した枝で見つかった一意の項目数です。除外した項目の配下は探索しないため、その内側は数えません。
- 複数フォルダのワークスペースでは、フィルターには各フォルダからの相対パスを、表示にはフォルダ名付きのパスを使います。設定は起点のファイルに適用されるものを使います。
大きな階層・取得範囲
- 循環は
[循環参照 → #番号] で停止します。同じ項目の再登場は [展開済み → #番号] と表示します(タブ形式では番号への参照を省略)。枝ごとに展開したい場合は deduplicate を false にしてください。
- 深さ・件数の上限に達した場合や言語拡張がエラーを返した場合は、未完了と省略箇所を出力します。深さの境界では子を問い合わせないため、葉かどうかにかかわらず「子の取得を省略」と表示します。
- タイムアウト時には、それ以上の問い合わせを停止し、取得できた範囲を未完了として出力します。エラー詳細は「表示 → 出力 → Call Hierarchy Copy」で確認できます。
- キャンセル・タイムアウトはこの拡張側の待機を終了します。公開コマンドAPIには実行中の言語サーバー要求を中止する手段がないため、その要求自体は言語拡張側で継続する場合があります。
- 結果はJava言語拡張の静的解析に依存します。リフレクション、DI、動的呼び出しなど、言語拡張が返さない関係を補完しません。言語拡張が空配列を返した場合も「呼び出しなし」と区別できません。
- 組み込みの呼び出し階層ビューの現在の選択・表示方向は読み取りません。ソースエディターのカーソル位置と、選んだコマンドを使います。
- この拡張自身はソースコードを外部へ送信しません。
取得できない場合は、Javaプロジェクトの読み込み完了と、Java拡張のStandardモードを確認してください。メソッド名にカーソルを合わせ、まずVS Code標準の「呼び出し階層の表示」が動作するか確認すると切り分けできます。
開発・検証
Node.js 22以上とnpmを使う例:
npm install
npm run compile
npm test
npm run test:integration
npm run package
pnpm-lock.yaml も同梱しています。固定された依存関係を使う場合は pnpm install --frozen-lockfile と pnpm run ... を使用できます。
F5で拡張開発ホストが起動します。そのウィンドウで samples/java-demo フォルダを開き、Service.java の work にカーソルを置いて出力してください。ServiceTest.testWork が標準で除外され、excludeTests: false で含まれることを確認できます。
test:integration はインストール済みVS Codeを、プロジェクト内の隔離したプロファイルで起動します。必要なら VSCODE_EXECUTABLE にVS Codeの実行ファイル(Windowsなら Code.exe)を指定してください。実際のVS Code公開APIにテスト用プロバイダーを接続し、方向、再帰取得、フィルター、設定反映、プレビューコマンドを検証します。ユーザーのクリップボードにはアクセスしません。これはJava言語サーバー自体の検証とは別です。
Java言語サーバーを含めた検証は、環境変数 JAVA_EXTENSION_PATH にインストール済み redhat.java 拡張のフォルダを指定して npm run test:java を実行します。サンプルを専用フォルダへコピーし、通常コード/テストコードの呼び出し元、再帰取得、呼び出し先、除外設定の切り替えを確認します。
npm run package は型検査・バンドルの後にVSIXを作成します。vsce package を直接使う場合は、先に npm run compile を実行してください。このコマンドではMarketplaceへの公開処理は行いません。公開時はPublisher fftcysstkm の管理画面から生成したVSIXをアップロードします。
利用API