# 画面設計書 11-コンポーネント読み込み失敗通知

## 概要

workspace-dバックエンドのコンポーネント（DCD以外）がワークスペースインスタンスへのバインドに失敗した際、クライアントにエラーメッセージを表示する通知画面の設計書である。

### 本画面の処理概要

本画面は、serve-dのバックエンドにおいて各種コンポーネント（DScanner, dfmt, DlangUI等）のワークスペースインスタンスへのバインドが失敗した場合に、エディタ上にエラーメッセージを表示する処理を担当する。

**業務上の目的・背景**：serve-dはD言語のLSPサーバーとして複数のコンポーネントを利用しているが、特定のコンポーネントが正しく読み込めない場合、補完・リント・フォーマット等の機能が利用不可となる。開発者にこの障害を迅速に通知し、原因の特定と対処を促すことが本画面の目的である。

**画面へのアクセス方法**：本通知は自動的にトリガーされる。serve-dのサーバー初期化時（shared static this）にbackend.onBindFailコールバックが登録されており、コンポーネントのバインド失敗が検出されると自動的にrpc.window.showErrorMessageが呼び出される。ユーザーが明示的にアクセスする画面ではない。

**主要な操作・処理内容**：
1. バックエンドがコンポーネントのバインドを試行し、失敗を検出する
2. onBindFailコールバックが呼び出される
3. DCD以外のコンポーネントの場合、ワークスペースインスタンスが存在すれば、rpc.window.showErrorMessageでエラーメッセージを送信する
4. DCDコンポーネントの場合は別途エラーログに記録するのみで、エラーメッセージは表示しない

**画面遷移**：本通知は他の画面から遷移して表示されるものではなく、バックエンドの初期化・コンポーネントバインド時に自動表示される。遷移先もなく、エラーメッセージをユーザーが確認するのみである。

**権限による表示制御**：権限による表示制御は存在しない。全てのユーザーに対して同一のエラーメッセージが表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 83 | クラッシュハンドラ | 補助機能 | コンポーネント読み込み失敗はバックエンドのonBindFailハンドラで処理される |

## 画面種別

通知（エラーメッセージ通知）

## URL/ルーティング

LSPプロトコル: `window/showMessage` メソッド（サーバーからクライアントへの通知）

本通知はバックエンドのonBindFailコールバックから直接送信されるため、特定のLSPリクエスト/レスポンスのルーティングは存在しない。

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| instance | WorkspaceD.Instance | 入力 | バインドに失敗したワークスペースインスタンス（nullの場合あり） |
| factory | ComponentFactory | 入力 | バインドに失敗したコンポーネントファクトリ |
| err | Exception | 入力 | 発生した例外 |
| messageType | MessageType | 出力 | エラーメッセージタイプ（error） |
| message | string | 出力 | エラーメッセージ文字列 |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| エラーメッセージ | テキスト | "Failed to load component {コンポーネント名} for workspace {ワークスペースパス}\n\nError: {エラーメッセージ}" |

## イベント仕様

### 1-コンポーネントバインド失敗検出

バックエンドの初期化時に登録されたonBindFailコールバックが発火する。以下の条件分岐で処理が行われる：

1. **instanceがnull且つエラーメッセージに"requires to be instanced"が含まれる場合**：何も行わない（正常動作として無視）
2. **DCDコンポーネントの場合**：エラーログに記録し、dcdUpdatingフラグがfalseの場合はインスタンスのerrorlogに追記する。showErrorMessageは呼び出さない
3. **それ以外のコンポーネントの場合**：トレースログに情報を記録し、instanceが存在すればrpc.window.showErrorMessageでエラーメッセージをクライアントに送信する

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

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

本画面はデータベース操作を伴わない。

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 条件 |
|-------------|------|---------------|------|
| MSG-11-01 | エラー | "Failed to load component {factory.info.name} for workspace {instance.cwd}\n\nError: {err.msg}" | DCD以外のコンポーネントがバインドに失敗し、instanceが存在する場合 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| instanceがnullの場合 | エラーメッセージは表示しない（showErrorMessage呼び出しをスキップ） |
| DCDコンポーネントの場合 | エラーメッセージ表示ではなく、内部ログへの記録のみ行う |
| "requires to be instanced"エラーの場合 | 無視して早期リターン |

## 備考

- 本通知はserve-dプロセス起動時のstatic初期化ブロック（shared static this）内でbackend.onBindFailに登録されたデリゲートにより処理される
- DCDコンポーネントの失敗は専用のハンドリング（DCD起動失敗通知: No.9）で処理されるため、ここでは除外されている
- dcdUpdatingフラグがtrueの場合（DCD更新中）、DCDのerrorlogへの追記もスキップされる

---

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

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

### 推奨読解順序

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

バインド失敗時に渡されるデータ構造を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | WorkspaceD.Instance, ComponentFactory等の基本型定義を確認 |

**読解のコツ**: served.typesはworkspaced.apiからの型を再エクスポートしている。WorkspaceD.InstanceはワークスペースのD言語プロジェクト管理オブジェクトである。

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

処理の起点となるonBindFailコールバックの登録箇所を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | shared static thisブロック（1353-1380行目）でbackend.onBindFailコールバックが登録されている |

**主要処理フロー**:
1. **1355行目**: `backend = new LazyWorkspaceD()` でバックエンドを初期化
2. **1358行目**: `backend.onBindFail = ...` でバインド失敗時のコールバックを登録
3. **1359行目**: instanceがnull且つ"requires to be instanced"チェック
4. **1362-1368行目**: DCDコンポーネント固有のエラーハンドリング
5. **1373-1378行目**: その他コンポーネントのエラーメッセージ送信

#### Step 3: エラーメッセージ送信を理解する

rpc.window.showErrorMessageの呼び出しを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | 1375-1377行目のshowErrorMessage呼び出し。コンポーネント名、ワークスペースパス、エラーメッセージの文字列結合 |

**主要処理フロー**:
- **1375行目**: `rpc.window.showErrorMessage(...)` エラーメッセージ文字列を構築して送信

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

```
shared static this() [extension.d:1353]
    |
    +-- backend = new LazyWorkspaceD() [extension.d:1355]
    |
    +-- backend.onBindFail = delegate [extension.d:1358]
            |
            +-- [DCDの場合] error(...) [extension.d:1364]
            |       +-- instance.config.set("dcd", "errorlog", ...) [extension.d:1366]
            |
            +-- [その他の場合] tracef(...) [extension.d:1371]
                    +-- rpc.window.showErrorMessage(...) [extension.d:1375]
```

### データフロー図

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

ComponentFactory     +--> onBindFailコールバック       +--> window/showMessage
(バインド失敗)            |                                  (エラーメッセージ)
                          +-- DCD判定
WorkspaceD.Instance       +-- null判定                  +--> エラーログ
(ワークスペース)          +-- メッセージ構築                  (DCDの場合)

Exception            +--> err.msg抽出
(発生例外)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | onBindFailコールバック登録・エラーメッセージ送信のメイン実装（1353-1380行目） |
| types.d | `source/served/types.d` | ソース | rpc, backend等のグローバル変数定義 |
| lazy_workspaced.d | `source/served/backend/lazy_workspaced.d` | ソース | LazyWorkspaceDクラス定義（onBindFailプロパティ保持） |
