# 機能設計書 43-アロー関数の括弧（arrowParens）

## 概要

本ドキュメントは、Prettierのアロー関数括弧制御機能（arrowParens）の設計仕様を定義する。

### 本機能の処理概要

arrowParensオプションは、単一パラメータのアロー関数において、パラメータを括弧で囲むかどうかを制御する。`(x) => x` のように常に括弧を付けるか、`x => x` のように括弧を省略するかを選択できる。

**業務上の目的・背景**：
アロー関数の単一パラメータに括弧を付けるかどうかは、コーディングスタイルの議論の的となることが多い。括弧を付けることで型注釈の追加やパラメータの追加が容易になる一方、括弧を省略することでコードが簡潔になる。この機能により、プロジェクト全体で一貫したアロー関数スタイルを自動的に適用でき、スタイルに関する議論を減らすことができる。

**機能の利用シーン**：
1. TypeScriptプロジェクトで型注釈付きパラメータに統一的に括弧を付けたい場合（always）
2. 簡潔なコードスタイルを好むプロジェクトで括弧を省略したい場合（avoid）
3. コードレビュー時のスタイル議論を防ぎたい場合
4. 複数パラメータへの変更を容易にするため、事前に括弧を付けておきたい場合

**主要な処理内容**：
1. arrowParensオプションの値取得（always/avoid）
2. アロー関数の検出
3. パラメータ数の判定（単一パラメータかどうか）
4. 括弧の必要性判定（型注釈、デフォルト値、分割代入等）
5. 括弧の挿入または削除

**関連システム・外部連携**：
- JavaScript/TypeScriptパーサー
- CLI、API、エディタプラグインからの呼び出し

**権限による制御**：
特になし。全てのユーザーが同一の機能を使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Playground | 補助機能 | サイドバーからアロー関数括弧オプションを設定 |
| 19 | Configuration - Options | 主機能 | arrowParensオプションの詳細説明 |

## 機能種別

設定オプション / フォーマット制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| arrowParens | string | No | 単一パラメータのアロー関数に括弧を付けるかどうか | "always" / "avoid" のいずれか |

### 入力データソース

- 設定ファイル（.prettierrc、prettier.config.js、package.json等）
- CLI引数（--arrow-parens）
- API呼び出し時のオプションオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| formatted | string | アロー関数の括弧が適切に制御されたフォーマット済みコード |

### 出力先

- 標準出力（CLIの場合）
- ファイル（--write オプション使用時）
- API戻り値

## 処理フロー

### 処理シーケンス

```
1. オプション解析
   └─ arrowParensオプションの値を取得（デフォルト: "always"）
2. アロー関数検出
   └─ ArrowFunctionExpressionノードを特定
3. パラメータ数判定
   └─ パラメータが1つかどうかを確認
4. 括弧必須判定
   └─ 型注釈、デフォルト値、パターン等で括弧が必須かチェック
5. 括弧出力
   └─ オプションと必須判定に基づいて括弧を出力
```

### フローチャート

```mermaid
flowchart TD
    A[ArrowFunctionExpression検出] --> B{パラメータ数}
    B -->|0個または2個以上| C[括弧必須]
    B -->|1個| D{arrowParensの値}
    D -->|always| C
    D -->|avoid| E{括弧が必要な構文?}
    E -->|Yes| C
    E -->|No| F[括弧省略]
    C --> G[出力]
    F --> G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-43-01 | デフォルト設定 | デフォルトでは"always"（常に括弧を付ける） | arrowParens未指定 |
| BR-43-02 | 常に括弧 | "always"では単一パラメータでも括弧を付ける | arrowParens: "always" |
| BR-43-03 | 括弧省略 | "avoid"では可能な限り括弧を省略する | arrowParens: "avoid" |
| BR-43-04 | 型注釈必須 | 型注釈がある場合は括弧が必須 | パラメータに型注釈あり |
| BR-43-05 | デフォルト値必須 | デフォルト値がある場合は括弧が必須 | パラメータにデフォルト値あり |
| BR-43-06 | 分割代入必須 | 分割代入パターンの場合は括弧が必須 | ObjectPattern/ArrayPattern |

### 計算ロジック

括弧省略可能性の判定:
- パラメータ数が1つ
- パラメータがIdentifier（単純な識別子）
- 型注釈がない
- デフォルト値がない
- コメントがない

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

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

該当なし（本機能はデータベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | バリデーションエラー | arrowParensに不正な値が指定された場合 | "always"/"avoid"のいずれかを指定する |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 処理時間への影響は軽微
- 既存のAST走査に統合されている

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

特になし

## 備考

- Flow型注釈がある場合も括弧が必要
- HookTypeAnnotation（Flow）では常に括弧が必要

---

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

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

### 推奨読解順序

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

オプション定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | options.js | `src/language-js/options.js` | arrowParensオプションの定義（7-21行目） |

**読解のコツ**: arrowParensはchoice型で、"always"と"avoid"の2つの選択肢がある。デフォルトは"always"。

#### Step 2: 括弧出力ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | function-parameters.js | `src/language-js/print/function-parameters.js` | printFunctionParameters関数（65-192行目） |

**主要処理フロー**:
1. **157-182行目**: isFlowShorthandWithOneArg判定
2. **174-181行目**: arrowParens === "always"またはHookTypeAnnotationの場合は括弧を付ける
3. **181行目**: それ以外の場合（avoid）は括弧なしでprintedを返す

#### Step 3: アロー関数特有の処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | function.js | `src/language-js/print/function.js` | アロー関数の出力処理 |
| 3-2 | arrow-function.js | `src/language-js/print/arrow-function.js` | アロー関数専用の処理 |

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

```
format() / formatWithCursor()
    │
    ├─ core.formatWithCursor()
    │      └─ printToDoc()
    │             └─ printer.print()
    │                    │
    │                    └─ printArrowFunction() [arrow-function.js]
    │                           └─ printFunctionParameters() [function-parameters.js]
    │                                  │
    │                                  ├─ options.arrowParens チェック
    │                                  │
    │                                  └─ isFlowShorthandWithOneArg判定
    │                                         └─ 括弧出力の決定
```

### データフロー図

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

options.arrowParens ──▶ printFunctionParameters() ──▶ "(x)" or "x"
                       │
パラメータ情報 ─────────┘
                       │
                       ▼
                  isFlowShorthandWithOneArg判定
                       │
                       ▼
                  括弧の有無を決定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| options.js | `src/language-js/options.js` | ソース | arrowParensオプション定義 |
| function-parameters.js | `src/language-js/print/function-parameters.js` | ソース | 関数パラメータ出力処理 |
| arrow-function.js | `src/language-js/print/arrow-function.js` | ソース | アロー関数出力処理 |
| function.js | `src/language-js/print/function.js` | ソース | 関数全般の出力処理 |
