# 機能設計書 45-アーキテクチャ切り替え (served/switchArchType)

## 概要

本ドキュメントは、serve-d LSPサーバーが提供するカスタムLSPメソッド `served/switchArchType` の機能設計を記述する。このメソッドは、DUBのビルドアーキテクチャを指定されたタイプに切り替える。

### 本機能の処理概要

**業務上の目的・背景**：D言語の開発において、異なるターゲットアーキテクチャ（x86, x86_64, arm等）でビルドすることがある。アーキテクチャを切り替えると、プラットフォーム固有のインポートパスやバージョン識別子が変わるため、serve-dの内部状態を更新してコード補完や静的解析が正しく機能するようにする必要がある。

**機能の利用シーン**：エディタのステータスバーやコマンドパレットからターゲットアーキテクチャを変更する際に呼び出される。No.44（アーキテクチャ一覧取得）で取得した一覧から選択されたアーキテクチャ名を送信する。

**主要な処理内容**：
1. アクティブなワークスペースインスタンスとDubComponentの有効性確認
2. 指定されたアーキテクチャタイプをDubComponentに設定
3. プラットフォーム情報の再計算とインポートパスの更新

**関連システム・外部連携**：workspace-dサブパッケージのDubComponentを介してDUBのプラットフォーム設定を変更する。コンパイラのdeterminePlatformを呼び出してプラットフォーム情報を再計算する。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 46 | アーキテクチャ切り替え（served/switchArchType） | 主画面 | DUBのビルドアーキテクチャを切り替える |

## 機能種別

設定変更（UPDATE）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| value | SwitchArchTypeParams (string) | Yes | 切り替え先のアーキテクチャタイプ。空文字列はコンパイラデフォルトを意味する | コンパイラがサポートするアーキテクチャであること |

### 入力データソース

LSPクライアントからの `served/switchArchType` リクエスト。SwitchArchTypeParams型はSingleValueParams!stringミキシンにより、文字列直値またはオブジェクト形式の両方を受け付ける。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (戻り値) | bool | アーキテクチャ切り替えが成功した場合true、失敗した場合false |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. アクティブインスタンスの確認
   └─ activeInstanceがnullの場合、falseを返却して終了
2. DubComponentの有効性確認
   └─ activeInstance.has!DubComponentがfalseの場合、falseを返却して終了
3. アーキテクチャタイプの切り替え
   └─ DubComponent.setArchType(value)を呼び出し
      ├─ _compiler.determinePlatform()でプラットフォーム情報を再計算
      ├─ 例外発生時はfalseを返却
      ├─ _archTypeに新しいタイプを保存
      └─ updateImportPaths(false)でインポートパスを再計算
4. 結果の返却
   └─ bool値をクライアントに返却
```

### フローチャート

```mermaid
flowchart TD
    A[served/switchArchType リクエスト受信] --> B{activeInstance が有効か?}
    B -->|No| C[false を返却]
    B -->|Yes| D{DubComponent が有効か?}
    D -->|No| C
    D -->|Yes| E[DubComponent.setArchType 呼び出し]
    E --> F[determinePlatform でプラットフォーム再計算]
    F --> G{例外発生?}
    G -->|Yes| C
    G -->|No| H[_archType を更新]
    H --> I[updateImportPaths で再計算]
    I --> J[結果を返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-45-01 | アクティブインスタンス必須 | アクティブなワークスペースインスタンスが存在しない場合はfalseを返す | 常時 |
| BR-45-02 | DubComponent必須 | DubComponentがロードされていない場合はfalseを返す | 常時 |
| BR-45-03 | プラットフォーム再計算 | アーキテクチャ変更時にコンパイラのdeterminePlatformを使用してプラットフォーム情報を再計算する | setArchType呼び出し時 |
| BR-45-04 | 不正アーキテクチャの処理 | determinePlatformで例外が発生した場合（サポートされていないアーキテクチャ等）はfalseを返す | setArchType呼び出し時 |
| BR-45-05 | インポートパス自動更新 | アーキテクチャ切り替え後、updateImportPaths(false)が自動的に呼び出される | 切り替え成功時 |

### 計算ロジック

特別な計算ロジックはない。

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 暗黙的エラー | activeInstanceがnull | falseを返却 |
| - | 暗黙的エラー | DubComponentが未ロード | falseを返却 |
| - | 実行時例外 | determinePlatformがサポートされていないアーキテクチャで例外を投げる | 例外をキャッチしてfalseを返却 |

### リトライ仕様

リトライ処理はない。

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

トランザクション制御はない。設定変更は即時反映される。

## パフォーマンス要件

プラットフォーム再計算とインポートパス更新が含まれるため、プロジェクト規模に応じた遅延が発生する可能性がある。

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

特になし。

## 備考

- 空文字列を指定するとコンパイラデフォルトのアーキテクチャが使用される。
- setArchTypeではconfigurationsのようなホワイトリスト検証は行われず、determinePlatformの例外で不正な値を検出する。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | SwitchArchTypeParams構造体（508-511行目）- SingleValueParams!stringミキシン |

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

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

**主要処理フロー**:
1. **76行目**: `@protocolMethod("served/switchArchType")` でLSPメソッドとして登録
2. **77行目**: 引数として `SwitchArchTypeParams value` を受け取る
3. **79-80行目**: activeInstanceとDubComponentの存在確認
4. **81行目**: `DubComponent.setArchType(value)` を呼び出し

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dub.d | `workspace-d/source/workspaced/com/dub.d` | setArchType関数（618-631行目） |

**主要処理フロー**:
- **622行目**: `_compiler.determinePlatform(_settings, _compilerBinaryName, type)` でプラットフォーム再計算
- **624-626行目**: 例外発生時はfalseを返却
- **629行目**: `_archType = type` で内部状態を更新
- **630行目**: `updateImportPaths(false)` でインポートパスを再計算

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

```
served/switchArchType (LSPリクエスト)
    │
    └─ switchArchType(SwitchArchTypeParams) [source/served/commands/dub.d:77-82]
           │
           ├─ activeInstance チェック
           ├─ has!DubComponent チェック
           │
           └─ DubComponent.setArchType(string) [workspace-d/source/workspaced/com/dub.d:618-631]
                  │
                  ├─ _compiler.determinePlatform() (プラットフォーム再計算)
                  ├─ _archType = type (内部状態更新)
                  └─ updateImportPaths(false) (インポートパス再計算)
```

### データフロー図

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

SwitchArchTypeParams ───> switchArchType() ───> bool (成否)
  (アーキテクチャ名)            │
                          DubComponent
                          .setArchType()
                               │
                          determinePlatform()
                               │
                          updateImportPaths()
```

### 関連ファイル一覧

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