# 機能設計書 44-アーキテクチャ一覧取得 (served/listArchTypes)

## 概要

本ドキュメントは、serve-d LSPサーバーが提供するカスタムLSPメソッド `served/listArchTypes` の機能設計を記述する。このメソッドは、現在のコンパイラで利用可能なアーキテクチャタイプ（x86, x86_64等）の一覧を返却する。

### 本機能の処理概要

**業務上の目的・背景**：D言語はクロスコンパイルをサポートしており、DMD・GDC・LDCの各コンパイラで利用可能なアーキテクチャが異なる。開発者がターゲットアーキテクチャを選択する際に、現在のコンパイラで利用可能なアーキテクチャの一覧を知る必要がある。本機能はその一覧取得を提供し、UIでのアーキテクチャ選択をサポートする。

**機能の利用シーン**：エディタのステータスバーやコマンドパレットからターゲットアーキテクチャを選択する際に呼び出される。`withMeaning`パラメータをtrueにすると、値だけでなくUI表示用のラベルも含めた詳細情報が返却される。

**主要な処理内容**：
1. アクティブなワークスペースインスタンスとDubComponentの有効性確認
2. コンパイラ種別に応じた拡張アーキテクチャタイプ一覧の取得
3. withMeaningパラメータに応じて、文字列配列またはArchType構造体配列として返却

**関連システム・外部連携**：workspace-dサブパッケージのDubComponentを介して、コンパイラ固有のアーキテクチャ情報を取得する。コンパイラ（DMD、GDC、LDC）によって返却されるアーキテクチャが異なる。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 45 | アーキテクチャ一覧取得（served/listArchTypes） | 主画面 | 利用可能なアーキテクチャタイプの一覧を返却する |

## 機能種別

データ取得（READ）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| withMeaning | bool | No（デフォルト: false） | trueの場合、ArchType構造体（value + label）で返却。falseの場合、value文字列のみで返却 | - |

### 入力データソース

LSPクライアントからの `served/listArchTypes` リクエスト。ListArchTypesParams型のパラメータ。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (戻り値) | Variant!(string, ArchType)[] \| null | アーキテクチャタイプの配列。withMeaning=falseの場合はstring値、trueの場合はArchType(value, label)で返却 |

ArchType構造体の構成：

| フィールド | 型 | 説明 |
|-----------|-----|------|
| value | string | DUBに渡すアーキテクチャ値（例: "x86_64", "x86", ""） |
| label | string | UI表示用ラベル（例: "(compiler default)", "WebAssembly"）。nullの場合はvalueを表示 |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. アクティブインスタンスの確認
   └─ activeInstanceがnullの場合、nullを返却して終了
2. DubComponentの有効性確認
   └─ activeInstance.has!DubComponentがfalseの場合、nullを返却して終了
3. 拡張アーキテクチャタイプ一覧の取得
   └─ DubComponent.extendedArchTypesプロパティを呼び出す
      （コンパイラ種別に応じた一覧を返却）
4. withMeaningパラメータに応じた変換
   ├─ withMeaning=true: ArchType(value, label)の配列を生成
   └─ withMeaning=false: valueのみの文字列配列を生成
5. 結果の返却
```

### フローチャート

```mermaid
flowchart TD
    A[served/listArchTypes リクエスト受信] --> B{activeInstance が有効か?}
    B -->|No| C[null を返却]
    B -->|Yes| D{DubComponent が有効か?}
    D -->|No| C
    D -->|Yes| E[DubComponent.extendedArchTypes を取得]
    E --> F{withMeaning = true?}
    F -->|Yes| G[ArchType配列として返却]
    F -->|No| H[string配列として返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-44-01 | アクティブインスタンス必須 | アクティブなワークスペースインスタンスが存在しない場合はnullを返す | 常時 |
| BR-44-02 | DubComponent必須 | DubComponentがロードされていない場合はnullを返す | 常時 |
| BR-44-03 | コンパイラ固有一覧 | DMD: x86_64, x86 (+Windows: x86_omf, x86_mscoff)。GDC: x86_64, x86, arm, arm_thumb。LDC: x86_64, x86, aarch64, powerpc64, wasm32 | コンパイラ種別による |
| BR-44-04 | コンパイラデフォルト | 全コンパイラで空文字列("")が「(compiler default)」として含まれる | extendedArchTypes使用時 |

### 計算ロジック

コンパイラ名に応じてアーキテクチャ一覧をハードコードで構築する（DubComponent.extendedArchTypes, 563-608行目）。

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

リトライ処理はない。

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

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

## パフォーマンス要件

コンパイラ情報に基づく静的な一覧生成であり、即時応答が期待される。

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

特になし。

## 備考

- Variant!(string, ArchType)[] はD言語の直和型配列で、各要素がstringまたはArchTypeのいずれかを保持する。
- LDCではWebAssembly（wasm32-unknown-unknown-wasm）もアーキテクチャとしてサポートされている。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | ListArchTypesParams構造体（315-319行目）- withMeaningフィールド |
| 1-2 | protoext.d | `source/served/lsp/protoext.d` | ArchTypeInfo構造体（323-329行目）- value/labelフィールド |
| 1-3 | protoext.d | `source/served/lsp/protoext.d` | ArchType構造体（333-339行目）- serdeFallbackStructアノテーション付き |

**読解のコツ**: D言語の `Variant!(string, ArchType)` は直和型（タグ付きユニオン）で、各要素がstringかArchTypeのどちらかを保持する。`@serdeFallbackStruct` はデシリアライズ時にフォールバック動作を提供するアノテーション。

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

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

**主要処理フロー**:
1. **49行目**: `@protocolMethod("served/listArchTypes")` でLSPメソッドとして登録
2. **50行目**: 戻り値型 `Variant!(string, ArchType)[]` を宣言
3. **54-55行目**: activeInstanceとDubComponentの存在確認
4. **57行目**: `extendedArchTypes` を取得
5. **59-72行目**: `withMeaning` フラグに応じて ArchType または string 形式でappenderに追加

#### Step 3: DubComponent.extendedArchTypesの実装を理解する

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

**主要処理フロー**:
- **566行目**: `_compiler.name` でコンパイラ名を取得
- **568-579行目**: DMDの場合: "", x86_64, x86（Windowsではx86_omf, x86_mscoffも追加）
- **581-590行目**: GDCの場合: "", x86_64, x86, arm, arm_thumb
- **592-605行目**: LDCの場合: "", x86_64, x86, aarch64, powerpc64, wasm32-unknown-unknown-wasm

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

```
served/listArchTypes (LSPリクエスト)
    │
    └─ listArchTypes(ListArchTypesParams) [source/served/commands/dub.d:50-74]
           │
           ├─ activeInstance チェック
           ├─ has!DubComponent チェック
           │
           ├─ DubComponent.extendedArchTypes [workspace-d/source/workspaced/com/dub.d:563-608]
           │      │
           │      └─ _compiler.name に基づくアーキテクチャ一覧構築
           │
           └─ withMeaning に応じた変換
                  ├─ true: ArchType(value, label) で返却
                  └─ false: value (string) のみで返却
```

### データフロー図

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

ListArchTypesParams ───> listArchTypes() ───> Variant!(string, ArchType)[]
  (withMeaning: bool)         │                    または null
                         DubComponent
                         .extendedArchTypes
                              │
                         コンパイラ名判定
                         (dmd/gdc/ldc)
                              │
                         withMeaning による
                         フォーマット変換
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | LSPメソッドのエントリーポイント（listArchTypes関数） |
| dub.d | `workspace-d/source/workspaced/com/dub.d` | ソース | DubComponent.extendedArchTypesの実装 |
| protoext.d | `source/served/lsp/protoext.d` | ソース | ListArchTypesParams, ArchTypeInfo, ArchType型定義 |
| types.d | `source/served/types.d` | ソース | activeInstance等のグローバル状態管理 |
| extension.d | `source/served/extension.d` | ソース | コマンドモジュールのpublic import |
