# 画面設計書 38-インターフェース実装（served/implementMethods）

## 概要

本ドキュメントは、serve-d LSPサーバーが提供する `served/implementMethods` カスタムリクエストハンドラの画面設計書である。クラスやインターフェースの抽象メソッドを自動実装するテキスト編集を返却する機能を定義する。

### 本画面の処理概要

本機能は、D言語のクラスがインターフェースや抽象クラスを継承している場合に、未実装の抽象メソッドのスタブコードを自動生成し、エディタに挿入するためのテキスト編集情報を返却する。

**業務上の目的・背景**：D言語のインターフェースや抽象クラスを実装する際、多数の抽象メソッドを手動で記述するのは煩雑でエラーが発生しやすい。本機能はDCDExtComponentを使用してクラス定義を解析し、継承元の抽象メソッドを自動的にスタブとして生成することで、開発者の負担を大幅に軽減する。スニペット形式での生成やdfmtによるフォーマットにも対応する。

**画面へのアクセス方法**：(1) コードアクション経由（"Implement base classes/interfaces"）、(2) `served/implementMethods` カスタムリクエストの直接呼び出し、(3) コードアクション解決時（`codeAction/resolve`）の遅延実行。

**主要な操作・処理内容**：
1. クライアントから `served/implementMethods` リクエストを受信する
2. 対象ドキュメントとフォーマット設定を取得する
3. DCDExtComponentの `implementAll` メソッドで未実装メソッドの一覧を取得する
4. `getInterfaceDetails` で既存クラスの構造情報を取得する
5. 挿入位置を決定する（3パターン：クラス先頭/末尾/既存メソッド末尾）
6. 各メソッドのコードをフォーマットし、インデント・改行を調整する
7. テキスト編集配列を返却する

**画面遷移**：コードアクション画面（No.19）から遷移してくる。本機能から他への直接遷移はない。

**権限による表示制御**：特別な権限制御はない。DCDExtComponentの利用可能性が条件。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | コードアクション (textDocument/codeAction) | 主機能 | クラス/インターフェースの抽象メソッドを自動実装するテキスト編集をコードアクション経由で返す |

## 画面種別

LSPカスタムリクエスト・レスポンス

## URL/ルーティング

LSPメソッド: `served/implementMethods`

## 入出力項目

### 入力（リクエストパラメータ）

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| textDocument.uri | DocumentUri | Yes | 対象ドキュメントのURI |
| location | int | Yes | カーソル位置のオフセット |
| snippets | bool | No | スニペット形式で生成するか（デフォルト: implementInterfaceSnippets） |

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

| 項目名 | 型 | 説明 |
|--------|------|------|
| (配列要素).range | TextRange | 挿入位置の範囲 |
| (配列要素).newText | string | 生成されたメソッドスタブコード |

## 表示項目

| 表示項目 | 説明 |
|----------|------|
| 生成されたメソッドスタブ | 未実装の抽象メソッドのスケルトンコード |

## イベント仕様

### 1-implementMethodsリクエスト

1. `implementMethods(ImplementMethodsParams params)` 関数が呼び出される
2. ドキュメントとファイルパスの取得
3. ワークスペース設定取得
4. フォーマット設定の確認（未適用の場合は `tryFindFormattingSettings` で推定）
5. `DCDExtComponent.implementAll` 呼び出し（コード, オフセット, フォーマット有効, dfmt引数, スニペット設定を渡す）
6. 未実装メソッドが0件なら空配列を返却
7. `DCDExtComponent.getInterfaceDetails` でクラス構造を取得
8. 挿入位置の決定：
   - **パターンA（クラス解析失敗 or 空クラス）**: 最初の `{` の直後に挿入
   - **パターンB（メソッドなしクラス）**: ブロック終端 `}` の直前に挿入
   - **パターンC（メソッドありクラス）**: 最後のメソッドのブロック範囲末尾の後に挿入
9. 各メソッドの `formatCode` 処理（必要に応じてインデント追加）
10. EOL・改行で結合してTextEditを生成

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

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

本機能はデータベースへの更新を行わない。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| implementMethodsリクエスト | なし | SELECT | ドキュメントの読み取りと解析のみ |

## メッセージ仕様

| メッセージ種別 | 条件 | メッセージ内容 |
|---------------|------|---------------|
| 空応答 | 未実装メソッドなし | 空のTextEdit配列 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| DCDExtComponentが利用不可 | 空配列を返却 |
| implementAllの結果が0件 | 空配列を返却 |
| クラス定義の `{` が見つからない | codeText.lengthをブレース位置として使用 |

## 備考

- `implementInterfaceSnippets` グローバルフラグで全体的なスニペット生成の有効/無効を制御
- コードアクション提供時に `implementInterfaceSnippets` が有効な場合はコマンド形式、無効な場合はcodeAction/resolve対応の遅延解決形式で提供
- 3つの挿入パターンでクラスの状態に応じて最適な位置にコードを挿入
- `formatCode` 関数はインデント不要な場合（スニペットが自動処理する場合）にはそのまま返却
- `getInterfaceDetails` が空（InterfaceDetails.init）を返す場合はパターンAにフォールバック

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | ImplementMethodsParams型の定義 |
| 1-2 | dcdext.d (workspaced) | workspacedサブパッケージ | ImplementedMethod型、InterfaceDetails型の定義 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | code_actions.d | `source/served/commands/code_actions.d` | `implementMethods` 関数（行572-655） |

**主要処理フロー**:
1. **行572**: `@protocolMethod("served/implementMethods")` でLSPメソッドとして登録
2. **行577-578**: ドキュメント・ファイルパス取得
3. **行584-585**: フォーマット設定確認
4. **行589-591**: `DCDExtComponent.implementAll` 呼び出し
5. **行592-593**: 結果が空なら早期リターン
6. **行609-611**: `getInterfaceDetails` 呼び出し
7. **行611-626**: パターンA（クラス先頭挿入）
8. **行627-638**: パターンB（クラス末尾挿入）
9. **行640-654**: パターンC（既存メソッド末尾挿入）

#### Step 3: コードアクション連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | code_actions.d | `source/served/commands/code_actions.d` | `provideCodeActions` 内の "Implement base classes/interfaces" アクション生成（行69-106） |
| 3-2 | code_actions.d | `source/served/commands/code_actions.d` | `resolveCodeAction` の "implementMethods" ケース（行172-183） |

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

```
implementMethods (code_actions.d:573)
    |
    +-- documents[uri] ドキュメント取得
    +-- workspace(uri).config 設定取得
    +-- tryFindFormattingSettings (format.d:101)
    +-- DCDExtComponent.implementAll (workspaced)
    |   +-- 未実装メソッド検出・コード生成
    +-- DCDExtComponent.getInterfaceDetails (workspaced)
    |   +-- クラス構造解析
    +-- [パターンA/B/C] 挿入位置決定
    +-- formatCode (code_actions.d:595)
    +-- TextEdit生成
```

### データフロー図

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

ImplementMethodsParams   --->   implementMethods              --->  TextEdit[]
  .textDocument.uri              |                                    .range
  .location                      +-- ドキュメント取得                  .newText
  .snippets                      +-- implementAll (未実装メソッド取得)
                                 +-- getInterfaceDetails (クラス構造)
                                 +-- 挿入位置決定
                                 +-- コード生成・フォーマット
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| code_actions.d | `source/served/commands/code_actions.d` | ソース | implementMethods関数およびコードアクション連携 |
| format.d | `source/served/commands/format.d` | ソース | tryFindFormattingSettings, generateDfmtArgs関数 |
| types.d | `source/served/types.d` | ソース | ImplementMethodsParams等のLSP型定義 |
| extension.d | `source/served/extension.d` | ソース | backend, documents等のグローバル変数 |
