# 画面設計書 9-DCD起動失敗通知

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるDCD起動失敗通知の画面設計書である。DCDサーバーの起動に失敗した場合にクライアントにエラーメッセージを表示する。

### 本画面の処理概要

**業務上の目的・背景**：DCD（D Completion Daemon）サーバーはD言語のコード補完機能を提供する中核プロセスである。DCDサーバーの起動に失敗した場合、コード補完、定義ジャンプ、参照検索などの多くのエディタ機能が利用できなくなる。本通知はユーザーにDCDの起動失敗を知らせ、問題の診断と解決を促すために存在する。エラーメッセージにはワークスペースパスとエラーログの内容が含まれ、問題の特定を支援する。

**画面へのアクセス方法**：No.3 ワークスペーススタートアップの `startDCDServer` 関数内で、DCDサーバーの起動処理（`dcd.startServer`）が例外をスローした場合に自動表示される。ユーザーが直接アクセスすることはできない。

**主要な操作・処理内容**：
1. `startDCDServer` 関数内でDCDの起動を試行する
2. `dcd.startServer(stdlibPath, false, true)` の呼び出しで例外が発生した場合
3. `rpc.window.showErrorMessage` でエラーメッセージをクライアントに表示
4. エラーメッセージにはワークスペースパス（`instance.cwd`）とDCDエラーログが含まれる

**画面遷移**：
- 遷移元：No.3 ワークスペーススタートアップ（startDCDServer関数内で例外発生時）
- 遷移先：No.40 DCDサーバー再起動（served/restartServer）（ユーザーが手動で再起動を試みる場合）

**権限による表示制御**：なし。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 61 | DCDサーバー再起動 (served/restartServer) | 遷移先機能 | DCD起動失敗後にユーザーがDCDサーバーの再起動を試みる可能性がある |
| 81 | 翻訳・多言語対応 | 補助機能 | エラーメッセージの翻訳にtranslate機能を使用する |

## 画面種別

LSP通知（`window/showMessage` によるエラーメッセージ表示）

## URL/ルーティング

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

## 入出力項目

### 入力（内部パラメータ）

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| instance.cwd | string | はい | DCDサーバーを起動しようとしたワークスペースのパス |
| instance.config("dcd", "errorlog") | string | はい | DCDのエラーログ内容 |
| e | Exception | はい | 起動時にスローされた例外 |

### 出力

| 項目名 | 種別 | 説明 |
|--------|------|------|
| エラーメッセージ | showErrorMessage | DCDの起動失敗を通知するエラーメッセージ |

## 表示項目

### エラーメッセージ

| 項目 | 内容 | 説明 |
|------|------|------|
| メッセージ種別 | error | エラーレベルのメッセージ |
| メッセージ本文 | "Could not initialize DCD for {ワークスペースパス}.{エラーログ}" | DCDの起動失敗理由を含むメッセージ |

## イベント仕様

### 1-DCD起動失敗検出

1. `startDCDServer` 関数で `wantsDCDServer(workspaceUri)` による事前チェック
2. `instance.get!DCDComponent` でDCDコンポーネントを取得
3. `proj.stdlibPath` で標準ライブラリパスを取得
4. `dcd.startServer(stdlibPath, false, true)` を実行
5. `dcd.refreshImports()` を実行
6. `backgroundIndex()` を実行

### 2-例外キャッチとエラー通知

1. 上記処理中に例外が発生した場合、catch ブロックに入る
2. `translate!"d.ext.dcdFail"(instance.cwd, instance.config.get("dcd", "errorlog", ""))` でメッセージを生成
3. `rpc.window.showErrorMessage(msg)` でクライアントにエラー表示
4. エラーログに例外情報を出力
5. インスタンス設定のトレースログを出力

### 3-事前チェックによるスキップ

以下の条件で `startDCDServer` が早期リターンする（エラー通知は表示されない）:
1. `shutdownRequested` が `true` の場合
2. `dcdUpdating` が `true` の場合
3. ワークスペースが不明な場合
4. `config.d.enableAutoComplete` が `false` の場合

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

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

本画面ではデータベースへのアクセスは発生しない。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | なし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|------------|------|--------------|----------|
| d.ext.dcdFail | error | "Could not initialize DCD for {0}.{1}" | DCD起動時に例外発生 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| DCD startServer例外 | showErrorMessage表示 + エラーログ出力 + インスタンス設定トレース |
| DCD refreshImports例外 | 同上 |
| DCDComponent取得失敗 | 同上 |

## 備考

- DCDのエラーログは `instance.config.get("dcd", "errorlog", "")` から取得される
- `errorlog` はDCDコンポーネントのバインド失敗時に `onBindFail` ハンドラで蓄積される（extension.d 1366行目）
- `startServer` の第2引数 `false` はバックグラウンドではない、第3引数 `true` はキャッシュ使用を示す
- DCD起動失敗後もserve-d自体は動作を継続し、DCD依存でない機能は引き続き利用可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | `Workspace` 構造体の `stdlibPath()` メソッド（296行目） |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | `startDCDServer` 関数（999行目〜1026行目）が主処理 |
| 2-2 | extension.d | `source/served/extension.d` | `wantsDCDServer` 関数（972行目〜997行目）が事前チェック |

**主要処理フロー**:
1. **1001行目**: `wantsDCDServer(workspaceUri)` で起動可否判定
2. **1003行目**: Workspaceオブジェクト取得
3. **1009行目**: `instance.get!DCDComponent` でDCDコンポーネント取得
4. **1010行目**: `proj.stdlibPath` で標準ライブラリパス取得
5. **1012行目**: `dcd.startServer(stdlibPath, false, true)` でDCDサーバー起動
6. **1014行目**: `dcd.refreshImports()` でインポートパス更新
7. **1015行目**: `backgroundIndex()` でバックグラウンドインデックス開始
8. **1017-1024行目**: catch ブロック - エラーメッセージ表示 + ログ出力

#### Step 3: エラーログ蓄積を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | `onBindFail` ハンドラ（1358行目〜1379行目）でDCDのエラーログを蓄積 |

#### Step 4: 翻訳メッセージを確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | en.txt | `views/en.txt` | 93行目: "d.ext.dcdFail: Could not initialize DCD for {0}.{1}" |

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

```
[DCDサーバー起動フロー]
    │
    └─ startDCDServer(instance, workspaceUri)  [999行目]
           │
           ├─ wantsDCDServer(workspaceUri)  [972行目]
           │      ├─ shutdownRequested チェック
           │      ├─ dcdUpdating チェック
           │      ├─ workspace存在チェック
           │      └─ enableAutoComplete チェック
           │
           ├─ [正常系]
           │      ├─ dcd.startServer(stdlibPath, false, true)  [1012行目]
           │      ├─ dcd.refreshImports()  [1014行目]
           │      └─ backgroundIndex()  [1015行目]
           │
           └─ [例外発生時]
                  ├─ translate!"d.ext.dcdFail"(cwd, errorlog)  [1019行目]
                  ├─ rpc.window.showErrorMessage(msg)  [1019行目]
                  ├─ error(e)  [1021行目]
                  └─ trace("Instance Config: ", ...)  [1022行目]
```

### データフロー図

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

WorkspaceD.Instance ──▶ startDCDServer()                showErrorMessage
  .cwd                      │                            （DCD起動失敗エラー）
  .config                   ├─ wantsDCDServer()
  .get!DCDComponent         ├─ dcd.startServer()
Workspace.stdlibPath        └─ [例外] → エラー通知
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | startDCDServer関数、wantsDCDServer関数、onBindFailハンドラ |
| types.d | `source/served/types.d` | ソース | Workspace構造体（stdlibPathメソッド） |
| translate.d | `source/served/utils/translate.d` | ソース | エラーメッセージの翻訳機能 |
| en.txt | `views/en.txt` | リソース | エラーメッセージ翻訳テキスト |
