# 画面設計書 56-ビルドタスク取得（served/buildTasks）

## 概要

本ドキュメントは、serve-d LSPサーバーが提供するカスタムリクエスト `served/buildTasks` の設計を記述する。このリクエストは、全DUBインスタンスに対するRun、Test、Build、Rebuildのビルドタスク一覧を返却する。

### 本画面の処理概要

このカスタムリクエストは、ワークスペース内の全DUBプロジェクトに対して、利用可能なビルドタスク（Run/Test/Build/Rebuild）の定義情報を生成し、エディタのタスクランナーに提供する処理である。

**業務上の目的・背景**：D言語の開発において、DUBビルドシステムを使用したビルド・テスト・実行は頻繁に行われる操作である。エディタのタスクランナー機能（例：VS Codeの「Run Task」）と統合することで、コマンドラインに切り替えることなくエディタ内から直接ビルド操作を実行できるようにする。各DUBプロジェクトに対して現在の設定（コンパイラ、アーキテクチャ、ビルドタイプ、コンフィグレーション）を反映したタスク定義を動的に生成する。

**画面へのアクセス方法**：LSPクライアントが `served/buildTasks` メソッドをJSON-RPCリクエストとして送信する。エディタのタスクプロバイダ機能から自動的に呼び出される。

**主要な操作・処理内容**：
1. クライアントからJSON-RPCリクエスト `served/buildTasks` を受信する
2. backendの全インスタンスを走査する
3. 各インスタンスでDubComponentが存在し、かつ有効なビルド設定を持つ場合に4種類のタスクを生成する
4. Run、Test、Build、Rebuildの各タスク定義（実行コマンド、引数、作業ディレクトリ等）を返却する

**画面遷移**：DUB管理フローのビルド・テストサブフローとして動作する。タスク一覧取得後、ユーザーがタスクを選択して実行する。

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 56 | ビルドタスク提供 (served/buildTasks) | 主機能 | 全DUBインスタンスのビルドタスク（Run・Test・Build・Rebuild）を返却する |

## 画面種別

カスタムLSPリクエスト（データ取得・一覧）

## URL/ルーティング

LSPカスタムメソッド: `served/buildTasks`

## 入出力項目

### 入力（リクエスト）

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| (なし) | - | - | パラメータなしのリクエスト |

### 出力（レスポンス）

| 項目名 | 型 | 説明 |
|--------|-----|------|
| result | Task[] | ビルドタスク定義の配列 |

### Task構造体

| フィールド | 型 | 説明 |
|-----------|-----|------|
| definition | JsonValue | タスク定義（type, run, test, force, compiler, archType, buildType, configuration, cwd） |
| scope_ | string | タスクのスコープ（ワークスペースフォルダURI） |
| exec | string[] | 実行コマンドと引数の配列 |
| name | string | タスク名（例: "Run serve-d", "Test serve-d"） |
| isBackground | bool | バックグラウンドタスクかどうか |
| source | string | タスクソース（"dub"） |
| group | Group | タスクグループ（build/test/rebuild） |
| problemMatchers | string[] | 問題マッチャー |

## 表示項目

エディタのタスクランナーに表示される情報：

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| タスク名 | 文字列 | "Run {プロジェクト名}", "Test {プロジェクト名}", "Build {プロジェクト名}", "Rebuild {プロジェクト名}" |
| タスクソース | 文字列 | "dub" |
| タスクグループ | カテゴリ | build / test / rebuild |

## イベント仕様

### 1-リクエスト受信

クライアントから `served/buildTasks` リクエストを受信すると、以下の処理が実行される：

1. 空のTask配列を初期化する
2. `backend.instances` の全インスタンスを走査する
3. 各インスタンスについて：
   - DubComponentの存在を確認する（存在しなければスキップ）
   - `dub.isValidBuildConfiguration` で有効なビルド設定か確認する（無効ならスキップ）
   - ワークスペース情報を取得する
   - `useBuildTaskDollarCurrent` フラグに応じて、現在値または "$current" マジック値を使用する
   - 作業ディレクトリパスを `${workspaceFolder}` 変数で構築する
4. 以下の4つのタスクを生成する：
   - **Run**: `dub run --compiler=... -a=... -b=... -c=...`（group: build）
   - **Test**: `dub test --compiler=... -a=... -b=... -c=...`（group: test）
   - **Build**: `dub build --compiler=... -a=... -b=... -c=...`（group: build）
   - **Rebuild**: `dub build --force --compiler=... -a=... -b=... -c=...`（group: rebuild）
5. 空引数（`=` で終わる引数）を `fixEmptyArgs` で除去する
6. 全タスクの配列を返却する

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ビルドタスク取得 | (なし) | SELECT相当 | DubComponentのインメモリ状態からの読み取りのみ |

### テーブル別更新項目詳細

データベースへの更新は発生しない。

## メッセージ仕様

| メッセージID | 種別 | 条件 | メッセージ内容 |
|-------------|------|------|---------------|
| (なし) | - | - | 本リクエストではユーザー向けメッセージは発生しない |

## 例外処理

| 条件 | 動作 | 返却値 |
|------|------|--------|
| DubComponentが存在しないインスタンス | スキップ | そのインスタンスのタスクは生成しない |
| 有効なビルド設定でないインスタンス | スキップ | そのインスタンスのタスクは生成しない |
| 全インスタンスがスキップされた場合 | 正常返却 | 空配列 |

## 備考

- `fixEmptyArgs` 関数により、値が空のコマンドライン引数（例: `-c=`）が自動的に除去される
- `useBuildTaskDollarCurrent` グローバルフラグがtrueの場合、タスク定義のcompiler等フィールドに "$current" が設定される（クライアント側で現在値を解決する方式）
- 複数のDUBプロジェクト（ワークスペース内のサブプロジェクト含む）がある場合、各プロジェクトに対して4つずつタスクが生成される
- exec配列にはConfiguration.D.dubPathで設定されたDUBパスが使用される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | Task構造体（125-153行目）とGroup列挙型（128-134行目）の定義を確認 |

**読解のコツ**: Task.Group列挙型は `@serdeEnumProxy!string` で文字列としてシリアライズされる。`clean`, `build`, `rebuild`, `test` の4値がある。

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

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

**主要処理フロー**:
1. **389行目**: `useBuildTaskDollarCurrent` グローバルフラグの宣言
2. **390行目**: `@protocolMethod("served/buildTasks")` UDAでLSPメソッドとして登録
3. **394行目**: `foreach (instance; backend.instances)` - 全インスタンス走査
4. **396-397行目**: DubComponent存在チェック
5. **402-404行目**: 有効なビルド設定チェック（isValidBuildConfiguration）
6. **420行目**: 作業ディレクトリの構築（${workspaceFolder}変数使用）
7. **421-441行目**: Runタスク生成
8. **442-462行目**: Testタスク生成
9. **463-483行目**: Buildタスク生成
10. **484-506行目**: Rebuildタスク生成

#### Step 3: ヘルパー関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dub.d | `source/served/commands/dub.d` | fixEmptyArgs関数（384-387行目）- 空引数の除去ロジック |

**主要処理フロー**:
- **386行目**: `args.remove!(a => a.endsWith('='))` - `=` で終わる引数を除去

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

```
LSPクライアント (エディタ タスクプロバイダ)
    |
    |  served/buildTasks (JSON-RPC request)
    v
provideBuildTasks() [source/served/commands/dub.d:391]
    |
    +-- backend.instances [全インスタンス走査]
            |
            +-- instance.has!DubComponent
            +-- instance.get!DubComponent
            |       |
            |       +-- dub.isValidBuildConfiguration
            |       +-- dub.recipePath
            |       +-- dub.compiler
            |       +-- dub.archType
            |       +-- dub.buildType
            |       +-- dub.configuration
            |       +-- dub.name
            |
            +-- workspace(instance.cwd.uriFromFile)
            |       +-- config.d.dubPath
            |
            +-- fixEmptyArgs() [source/served/commands/dub.d:384]
            |
            +-- [Run Task生成]
            +-- [Test Task生成]
            +-- [Build Task生成]
            +-- [Rebuild Task生成]
```

### データフロー図

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

JSON-RPC Request  -->  provideBuildTasks()             -->  Task[]
(パラメータなし)         |                                    |
                        +-- 各DUBインスタンス走査              +-- Run Task定義 x N
                        |   (有効なビルド設定のみ)             +-- Test Task定義 x N
                        +-- 現在の設定読取                     +-- Build Task定義 x N
                        |   (compiler, arch, build, config)  +-- Rebuild Task定義 x N
                        +-- タスク定義生成
                        +-- 空引数除去 (fixEmptyArgs)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | provideBuildTasks関数の実装（390-509行目）、fixEmptyArgs（384-387行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | Task構造体定義（125-153行目） |
| types.d | `source/served/types.d` | ソース | backend、workspace、Configuration等のグローバル定義 |
| extension.d | `source/served/extension.d` | ソース | LSPメソッドディスパッチ基盤 |
