# 画面設計書 51-コンパイラ取得（served/getCompiler）

## 概要

本ドキュメントは、serve-d LSPサーバーが提供するカスタムリクエスト `served/getCompiler` の設計を記述する。このリクエストは、現在アクティブなDUBプロジェクトで設定されているコンパイラ名を返却する。

### 本画面の処理概要

このカスタムリクエストは、エディタ（LSPクライアント）からの要求に応じて、現在のDUBビルド設定で使用されているコンパイラの名前を文字列として返却する処理である。

**業務上の目的・背景**：D言語の開発では、dmd、ldc2、gdc等の複数のコンパイラが利用可能である。開発者が現在どのコンパイラでビルドが行われるかを把握するために、このリクエストが必要となる。エディタのステータスバーやコマンドパレットでの表示に使用される。

**画面へのアクセス方法**：LSPクライアント（エディタ）が `served/getCompiler` メソッドをJSON-RPCリクエストとして送信することでアクセスする。通常はエディタのUI操作（ステータスバーのクリック、コマンドパレットからの選択等）を契機として呼び出される。

**主要な操作・処理内容**：
1. クライアントからJSON-RPCリクエスト `served/getCompiler` を受信する
2. アクティブなワークスペースインスタンスの存在を確認する
3. DubComponentの存在を確認する
4. DubComponentからcompilerプロパティを取得して返却する

**画面遷移**：DUB設定管理フローの一部として、コマンドパレットからのDUB設定確認操作で呼び出される。`served/switchCompiler` で切り替え後の確認にも使用される可能性がある。

**権限による表示制御**：特になし。LSPプロトコル上の認証・認可機構は存在しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 50 | コンパイラ取得 (served/getCompiler) | 主機能 | 現在のDUBコンパイラ名を返却する |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

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

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

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

| 項目名 | 型 | 説明 |
|--------|-----|------|
| result | string \| null | 現在のコンパイラ名（例: "dmd", "ldc2", "gdc"）。DubComponentが存在しない場合はnull |

## 表示項目

LSPリクエスト応答のため、直接的な画面表示項目はない。エディタ側でステータスバーやコマンドパレット等に表示される。

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| コンパイラ名 | 文字列 | 現在設定されているDコンパイラの名前 |

## イベント仕様

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

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

1. `activeInstance` がnullでないか確認する
2. `activeInstance` に `DubComponent` が存在するか確認する
3. 条件を満たさない場合は `null` を返却する
4. 条件を満たす場合は `DubComponent.compiler` プロパティの値を文字列として返却する

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

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

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

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

データベースへの更新は発生しない。DubComponentのインメモリ状態からの読み取りのみ。

## メッセージ仕様

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

## 例外処理

| 条件 | 動作 | 返却値 |
|------|------|--------|
| activeInstanceがnull | 正常返却 | null |
| DubComponentが存在しない | 正常返却 | null |

## 備考

- 設定ファイル（Configuration.D.dubCompiler）でデフォルトコンパイラを指定可能
- `served/switchCompiler` と対になるゲッター操作
- DUBプロジェクトが読み込まれていない場合はnullが返却される

---

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

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

### 推奨読解順序

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

まず、リクエスト/レスポンスに関わるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | SwitchCompilerParams等の関連構造体定義を確認（本リクエストはパラメータなし） |
| 1-2 | types.d | `source/served/types.d` | activeInstance、backend、DubComponent等のグローバル変数・型を確認 |

**読解のコツ**: D言語の `@protocolMethod` UDAはLSPメソッドのディスパッチに使用される。関数名ではなくUDAの文字列がLSPメソッド名となる。

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

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

**主要処理フロー**:
1. **116行目**: `@protocolMethod("served/getCompiler")` UDAでLSPメソッドとして登録
2. **117行目**: `string getCompiler()` - パラメータなし、string返却の関数シグネチャ
3. **119行目**: `if (!activeInstance || !activeInstance.has!DubComponent)` - ガード条件チェック
4. **120行目**: 条件を満たさない場合 `return null`
5. **121行目**: `return activeInstance.get!DubComponent.compiler` - DubComponentからcompilerプロパティを取得して返却

#### Step 3: 共通基盤を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | activeInstanceの管理方法、LSPメソッドのディスパッチ基盤を確認 |
| 3-2 | types.d | `source/served/types.d` | activeInstanceプロパティの定義（463-474行目） |

**主要処理フロー**:
- **463行目**: `WorkspaceD.Instance _activeInstance` - グローバル変数としてアクティブインスタンスを保持
- **471行目**: `WorkspaceD.Instance activeInstance() @property` - ゲッタープロパティ

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

```
LSPクライアント (エディタ)
    |
    |  served/getCompiler (JSON-RPC request)
    v
getCompiler() [source/served/commands/dub.d:117]
    |
    +-- activeInstance [source/served/types.d:471]
    |       |
    |       +-- has!DubComponent
    |
    +-- activeInstance.get!DubComponent.compiler
            |
            +-- DubComponent (workspace-d API)
```

### データフロー図

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

JSON-RPC Request  --->  getCompiler()              --->  string (コンパイラ名)
(パラメータなし)           |                                 |
                         +-- activeInstance確認              +-- "dmd" / "ldc2" / "gdc" 等
                         +-- DubComponent取得                +-- null (未初期化時)
                         +-- compiler プロパティ読取
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | getCompiler関数の実装（116-122行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | SwitchCompilerParams等の関連型定義 |
| types.d | `source/served/types.d` | ソース | activeInstance、Configuration等のグローバル定義 |
| extension.d | `source/served/extension.d` | ソース | LSPメソッドディスパッチ基盤、dub.dのpublic import |
