# 機能設計書 47-ビルドタイプ一覧取得 (served/listBuildTypes)

## 概要

本ドキュメントは、serve-d LSPサーバーが提供するカスタムLSPメソッド `served/listBuildTypes` の機能設計を記述する。このメソッドは、利用可能なDUBビルドタイプの一覧を返却する。

### 本機能の処理概要

**業務上の目的・背景**：DUBプロジェクトでは複数のビルドタイプ（debug, release, unittest等）を使い分けることができる。DUBには定義済みのビルドタイプ（12種類）があり、さらにプロジェクト固有のカスタムビルドタイプも定義可能である。開発者がビルドタイプを選択する際に、利用可能なビルドタイプの一覧を取得する必要がある。

**機能の利用シーン**：エディタのステータスバーやコマンドパレットからDUBビルドタイプを選択する際に呼び出される。クライアント拡張機能がビルドタイプ選択UIを表示する前に一覧を取得する。

**主要な処理内容**：
1. アクティブなワークスペースインスタンスとDubComponentの有効性確認
2. DUBの定義済みビルドタイプとプロジェクト固有のカスタムビルドタイプの統合一覧を取得
3. 文字列配列として返却

**関連システム・外部連携**：workspace-dサブパッケージのDubComponentを介してDUBのビルドタイプ情報を取得する。

**権限による制御**：特に権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 48 | ビルドタイプ一覧取得（served/listBuildTypes） | 主画面 | 利用可能なDUBビルドタイプの一覧を返却する |

## 機能種別

データ取得（READ）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | パラメータなし | - |

### 入力データソース

LSPクライアントからの `served/listBuildTypes` リクエスト。パラメータは不要。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (戻り値) | string[] \| null | ビルドタイプ名の配列。アクティブインスタンスまたはDubComponentが存在しない場合はnull |

定義済みビルドタイプ一覧（12種類）：

| ビルドタイプ | 説明 |
|-------------|------|
| plain | 最小構成 |
| debug | デバッグビルド |
| release | リリースビルド |
| release-debug | リリース+デバッグ情報付き |
| release-nobounds | リリース+境界チェック無効 |
| unittest | ユニットテスト |
| docs | ドキュメント生成 |
| ddox | ddoxドキュメント生成 |
| profile | プロファイルビルド |
| profile-gc | GCプロファイルビルド |
| cov | コードカバレッジ |
| unittest-cov | ユニットテスト+カバレッジ |

これらに加え、プロジェクトのdub.json/dub.sdl内のbuildTypesセクションで定義されたカスタムビルドタイプも含まれる。

### 出力先

LSPクライアントへのJSON-RPCレスポンスとして返却。

## 処理フロー

### 処理シーケンス

```
1. アクティブインスタンスの確認
   └─ activeInstanceがnullの場合、nullを返却して終了
2. DubComponentの有効性確認
   └─ activeInstance.has!DubComponentがfalseの場合、nullを返却して終了
3. ビルドタイプ一覧の取得
   └─ activeInstance.get!DubComponent.buildTypesプロパティを呼び出す
      ├─ 定義済み12種類のビルドタイプを初期リストとして作成
      └─ ルートパッケージのrecipe.buildTypesからカスタムタイプを追加
4. 結果の返却
   └─ string[]（ビルドタイプ名の配列）をクライアントに返却
```

### フローチャート

```mermaid
flowchart TD
    A[served/listBuildTypes リクエスト受信] --> B{activeInstance が有効か?}
    B -->|No| C[null を返却]
    B -->|Yes| D{DubComponent が有効か?}
    D -->|No| C
    D -->|Yes| E[DubComponent.buildTypes を取得]
    E --> F[定義済み12種 + カスタムビルドタイプ]
    F --> G[string[] を返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-47-01 | アクティブインスタンス必須 | アクティブなワークスペースインスタンスが存在しない場合はnullを返す | 常時 |
| BR-47-02 | DubComponent必須 | DubComponentがロードされていない場合はnullを返す | 常時 |
| BR-47-03 | 定義済みビルドタイプ | 12種類の定義済みビルドタイプが常に含まれる | 常時 |
| BR-47-04 | カスタムビルドタイプ | プロジェクトレシピのbuildTypesで定義されたカスタムタイプも一覧に含まれる | カスタムタイプが定義されている場合 |

### 計算ロジック

定義済みビルドタイプ配列 + ルートパッケージのrecipe.buildTypesの名前を連結する。

## データベース操作仕様

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 暗黙的エラー | activeInstanceがnull | nullを返却 |
| - | 暗黙的エラー | DubComponentが未ロード | nullを返却 |

### リトライ仕様

リトライ処理はない。

## トランザクション仕様

トランザクション制御はない（読み取り専用操作）。

## パフォーマンス要件

定義済みリスト + プロジェクト設定からの読み取りであり、即時応答が期待される。

## セキュリティ考慮事項

特になし。

## 備考

- buildTypesプロパティは毎回呼び出し時にリストを構築する（キャッシュなし）。
- DUBの定義済みビルドタイプはDUB自体のソースコードで定義されているものと同じ一覧である。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | dub.d | `source/served/commands/dub.d` | listBuildTypes関数（92-98行目）がエントリーポイント |

**主要処理フロー**:
1. **92行目**: `@protocolMethod("served/listBuildTypes")` でLSPメソッドとして登録
2. **95-96行目**: activeInstanceとDubComponentの存在確認（ガード節）
3. **97行目**: `activeInstance.get!DubComponent.buildTypes` でビルドタイプ一覧を取得

#### Step 2: DubComponent.buildTypesの実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dub.d | `workspace-d/source/workspaced/com/dub.d` | buildTypesプロパティ（504-513行目） |

**主要処理フロー**:
- **506-509行目**: 定義済み12種類のビルドタイプをリテラル配列として構築
- **510-511行目**: `_dub.project.rootPackage.recipe.buildTypes` からカスタムビルドタイプの名前を取得してリストに追加

**読解のコツ**: `foreach (type, info; ...recipe.buildTypes)` はD言語の連想配列イテレーションで、`type`がキー（ビルドタイプ名）、`info`が値（ビルド設定情報）。

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

```
served/listBuildTypes (LSPリクエスト)
    │
    └─ listBuildTypes() [source/served/commands/dub.d:93-98]
           │
           ├─ activeInstance チェック
           ├─ has!DubComponent チェック
           │
           └─ DubComponent.buildTypes [workspace-d/source/workspaced/com/dub.d:504-513]
                  │
                  ├─ 定義済みビルドタイプ配列（12種類）
                  └─ _dub.project.rootPackage.recipe.buildTypes（カスタムタイプ）
```

### データフロー図

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

LSPリクエスト ───> listBuildTypes() ───> string[] (ビルドタイプ一覧)
(パラメータなし)        │                      または null
                   DubComponent
                   .buildTypes
                        │
                   ┌────┴────┐
                   │         │
              定義済み    カスタム
              12種類    ビルドタイプ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | LSPメソッドのエントリーポイント（listBuildTypes関数） |
| dub.d | `workspace-d/source/workspaced/com/dub.d` | ソース | DubComponent.buildTypesプロパティの実装 |
| types.d | `source/served/types.d` | ソース | activeInstance等のグローバル状態管理 |
| extension.d | `source/served/extension.d` | ソース | コマンドモジュールのpublic import |
