# 画面設計書 12-DUBツリー初期化通知

## 概要

dubプロジェクトが初めて正常に読み込まれた際に、クライアントに `coded/initDubTree` 通知を送信し、エディタ側でDUB依存関係ツリーの初期表示をトリガーする通知画面の設計書である。

### 本画面の処理概要

本画面は、serve-dのワークスペース初期化処理においてdubプロジェクトが正常にロードされた場合に、50msのディレイ後にクライアントへ `coded/initDubTree` 通知を送信する処理を担当する。これにより、エディタ側のDUB依存関係ツリービューが初期化される。

**業務上の目的・背景**：DUBプロジェクトの依存関係ツリーはエディタのサイドバー等に表示され、開発者がプロジェクトの構造と依存関係を視覚的に把握できるようにする。初めてDUBプロジェクトが読み込まれた時点で初期化通知を送ることで、エディタが適切なタイミングでツリー表示を構築できるようにしている。

**画面へのアクセス方法**：本通知は自動的にトリガーされる。delayedProjectActivation関数内でdubプロジェクトの初期化が成功した場合にdidLoadDubProject関数が呼び出され、初回のみ通知が送信される。

**主要な操作・処理内容**：
1. delayedProjectActivation内でDUBコンポーネントの初期化が成功する
2. didLoadDubProject関数が呼び出される
3. 静的変数loadedDubがfalseの場合のみ（初回のみ）、50msのタイマーを設定
4. タイマー発火後に `coded/initDubTree` 通知をクライアントに送信

**画面遷移**：本通知の前段階として、ワークスペーススタートアップ（No.3）でdubプロジェクトの初期化が行われる。本通知の後、クライアントは `served/listDependencies`（No.55）を呼び出して依存関係一覧を取得する。

**権限による表示制御**：権限による表示制御は存在しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 55 | 依存関係一覧取得 (served/listDependencies) | 遷移先機能 | DUBツリー初期化後にクライアントがcoded/initDubTree通知を受け取り依存関係一覧を取得する |

## 画面種別

通知（カスタム通知）

## URL/ルーティング

LSPカスタム通知: `coded/initDubTree`（サーバーからクライアントへの通知、パラメータなし）

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| （なし） | void | 出力 | パラメータなしの通知メソッド |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| DUB依存関係ツリー | ツリービュー | クライアント側でcoded/initDubTreeを受信後に構築されるDUB依存関係ツリー |

## イベント仕様

### 1-DUBプロジェクト初回読み込み完了

delayedProjectActivation内でDUBコンポーネントの初期化が成功すると、didLoadDubProject関数が呼ばれる。

1. loadedDub静的変数がfalseの場合（初回のみ）、trueに設定
2. 50msのsetTimeoutを使用して、`rpc.notifyMethod("coded/initDubTree")` を呼び出す
3. 2回目以降のdubプロジェクト読み込みでは通知は送信されない

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | なし | なし | データベースアクセスなし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 条件 |
|-------------|------|---------------|------|
| なし | 通知 | coded/initDubTree（パラメータなし） | 初回のDUBプロジェクト読み込み成功時 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| DUB初期化失敗 | didLoadDubProjectは呼ばれず、通知は送信されない |
| 2回目以降のDUBプロジェクト読み込み | loadedDubフラグにより通知送信がスキップされる |

## 備考

- coded/initDubTreeはserve-d独自のカスタムLSP通知であり、標準LSPプロトコルには含まれない
- 50msのディレイは、DUBプロジェクトの初期化が完全に完了するのを待つためと考えられる
- クライアント側（code-d拡張機能）がこの通知を受信してDUB依存関係ツリービューを構築する

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本通知にはパラメータがないため、特別なデータ構造は存在しない。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | rpcオブジェクトの定義（54行目）を確認 |

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | didLoadDubProject関数（923-931行目）が通知送信のエントリーポイント |

**主要処理フロー**:
1. **925行目**: `static bool loadedDub = false;` 静的変数で初回判定
2. **926行目**: `if (!loadedDub)` 初回のみ処理
3. **928行目**: `loadedDub = true;` フラグ更新
4. **929行目**: `setTimeout({ rpc.notifyMethod("coded/initDubTree"); }, 50);` 50msディレイ後に通知送信

#### Step 3: 呼び出し元を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | delayedProjectActivation関数（727-912行目）の901行目でdidLoadDubProjectが呼び出される |

**主要処理フロー**:
- **900行目**: DUBが正常にロードされた場合の分岐
- **901行目**: `didLoadDubProject()` 呼び出し

### プログラム呼び出し階層図

```
delayedProjectActivation() [extension.d:727]
    |
    +-- DubComponent初期化成功
    |       |
    |       +-- didLoadDubProject() [extension.d:923]
    |               |
    |               +-- [初回のみ] setTimeout(50ms)
    |                       |
    |                       +-- rpc.notifyMethod("coded/initDubTree")
    |
    +-- DubComponent初期化失敗
            +-- fsworkspaceにフォールバック（didLoadDubProjectは呼ばれない）
```

### データフロー図

```
[入力]                      [処理]                           [出力]

DubComponent            +-- delayedProjectActivation    +-- coded/initDubTree通知
（初期化成功）                |                                （クライアントへ）
                             +-- didLoadDubProject
                             +-- loadedDubフラグ判定
                             +-- 50ms setTimeout
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | didLoadDubProject関数（923-931行目）およびdelayedProjectActivation（727-912行目） |
| types.d | `source/served/types.d` | ソース | rpcグローバル変数の定義 |
