# 機能設計書 34-パラメータの後方移動

## 概要

本ドキュメントは、Clojure LSPの「パラメータの後方移動（drag-param-forward）」機能の設計仕様を記載する。この機能は、関数定義のパラメータを後方（右方向）に移動させ、同時にその関数のすべての呼び出し箇所の引数順序も自動的に更新するリファクタリング操作を提供する。

### 本機能の処理概要

**業務上の目的・背景**：関数のパラメータ順序を変更する必要が生じた場合に、手動での変更はミスが発生しやすい。本機能は、前方移動（drag-param-backward）と対をなし、パラメータを後方に移動させる操作を提供する。関数定義と全ての呼び出し箇所を同時に更新することで、安全なリファクタリングを実現する。

**機能の利用シーン**：この機能は以下の場面で利用される：
- 関数シグネチャの改善
- 部分適用を容易にするためのパラメータ順序調整
- APIの統一

**主要な処理内容**：
1. カーソル位置がdefn/defn-/defmacroのパラメータベクタ内にあることを確認
2. 可変長引数（&）を除外した移動対象を特定
3. 関数定義内のパラメータを後方に移動
4. プロジェクト全体の呼び出し箇所を検索して引数を更新
5. スレッディングマクロやpartial呼び出しを検出して警告

**関連システム・外部連携**：LSPプロトコルを通じてエディタと連携。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | エディタ画面 | 主画面 | コードアクションメニューから「Drag param forward」を選択 |

## 機能種別

リファクタリング（コード変換処理）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| uri | string | Yes | 対象ファイルのURI | 有効なファイルURIであること |
| line | number | Yes | カーソル行（0-indexed） | 0以上の整数 |
| character | number | Yes | カーソル列（0-indexed） | 0以上の整数 |

### 入力データソース

- エディタからのLSP `workspace/executeCommand` リクエスト
- コマンド名: `drag-param-forward`

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| changes-by-uri | map | URI別のテキスト編集リスト |
| show-document-after-edit | map | 編集後のカーソル位置 |

### 出力先

- LSPレスポンスとしてエディタに返却

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信
   └─ コマンドと引数を取得

2. パラメータベクタの特定
   └─ カーソル位置がdefn/defn-/defmacroのパラメータ内か確認

3. 可変長引数の除外
   └─ & 記号以降のパラメータを除外

4. 関数定義の編集
   └─ パラメータを後方に移動する編集を生成

5. 呼び出し箇所の編集
   └─ 各呼び出しで対応する引数を後方に移動

6. スキップ判定と結果返却
   └─ スキップがある場合は警告、ない場合は編集を返却
```

### フローチャート

```mermaid
flowchart TD
    A[コマンド受信] --> B{パラメータベクタ内?}
    B -->|No| C[nil返却]
    B -->|Yes| D[可変長引数除外]
    D --> E[関数定義の編集生成]
    E --> F[呼び出し箇所の編集]
    F --> G{スキップあり?}
    G -->|Yes| H[警告・nil返却]
    G -->|No| I[編集結果返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-34-01 | 対象関数 | defn、defn-、defmacroのパラメータのみ対象 | パラメータベクタ内で実行時 |
| BR-34-02 | 可変長引数除外 | &以降のパラメータは移動対象外 | 可変長引数を持つ関数 |
| BR-34-03 | 末尾パラメータ | 末尾パラメータ（&除外後）は後方移動不可 | 末尾パラメータ選択時 |
| BR-34-04 | スレッディング検出 | ->、->>、partial、apply内の呼び出しは安全に変更不可 | スレッディングマクロ内 |

### 計算ロジック

前方移動（drag-param-backward）と同様だが、移動方向が :forward となる。

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

本機能はclj-kondo解析データベースを参照のみ行う。

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 参照 | :analysis | SELECT | 関数定義と呼び出しを検索 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 警告 | スレッディングマクロ内の呼び出しが存在 | ユーザーに警告を表示しnil返却 |
| - | 操作不可 | 末尾パラメータで後方移動を試行 | nil返却 |

### リトライ仕様

リトライは行わない。

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

複数ファイルの編集はエディタ側で単一のアンドゥ操作として扱われる。

## パフォーマンス要件

- 応答時間: 500ms以内

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

- ファイルシステムへの書き込みは行わない

## 備考

- drag-param-backwardと対をなす機能
- 内部的には同じdrag関数をdir = :forwardで呼び出す

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | drag_param.clj | `lib/src/clojure_lsp/feature/drag_param.clj` | drag-forward関数 |

**主要処理フロー**:
- **93行目**: `can-drag-forward?` - 後方移動可否判定
- **118行目**: `drag-forward` - 公開API（dir = :forward で内部関数を呼び出し）

#### Step 2: コア機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | drag_param.clj | `lib/src/clojure_lsp/feature/drag_param.clj` | drag関数の:forwardケース |

**主要処理フロー**:
- **101-115行目**: `drag` - 前方/後方移動の共通処理

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

```
workspace/executeCommand (LSP)
    │
    └─ command/call-command
           │
           └─ run-command :drag-param-forward
                  │
                  └─ f.drag-param/drag-forward
                         │
                         └─ drag (dir = :forward)
                               │
                               ├─ plan
                               ├─ f.drag/identify-clauses
                               ├─ f.drag/drag-clause
                               └─ usage-edits
```

### データフロー図

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

URI, row, col      ──▶  drag-forward               ──▶  {:changes-by-uri, :show-document-after-edit}
                         (dir = :forward)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| drag_param.clj | `lib/src/clojure_lsp/feature/drag_param.clj` | ソース | パラメータ移動のコアロジック |
| drag.clj | `lib/src/clojure_lsp/feature/drag.clj` | ソース | ドラッグ機能の基盤 |
| command.clj | `lib/src/clojure_lsp/feature/command.clj` | ソース | コマンドディスパッチ |
| drag_param_test.clj | `lib/test/clojure_lsp/feature/drag_param_test.clj` | テスト | パラメータ移動のテスト |
