# 画面設計書 3-Code Fixes オプション設定画面

## 概要

本ドキュメントは、Visual Studio の F# 言語サービスにおけるコード修正（Code Fixes / Quick Actions）機能の有効・無効を設定する「Code Fixes オプション設定画面」の設計仕様を記述するものです。

### 本画面の処理概要

この画面は、F# コードエディタにおけるコード修正機能（電球アイコンで表示されるクイック修正提案）の各種機能を個別に有効化・無効化するためのオプションページです。

**業務上の目的・背景**：F# 開発者がコード修正機能を自身の開発スタイルに合わせてカスタマイズするために必要な画面です。一部の修正提案がパフォーマンスに影響する場合や、特定の修正が不要な場合に個別に無効化できます。コードの品質向上を支援する自動修正機能を開発者の好みに応じて調整することで、より効率的な開発体験を提供します。

**画面へのアクセス方法**：Visual Studio のメニューバーから「ツール」→「オプション」を選択し、オプションダイアログを開きます。左側のツリーから「テキストエディター」→「F#」→「Code Fixes」を選択することで本画面にアクセスできます。

**主要な操作・処理内容**：
1. 名前の簡略化（不要な修飾子の削除）機能の設定
2. open 文のトップレベル配置設定
3. 未使用の open 文の削除機能の設定
4. 未使用の宣言の分析・修正提案機能の設定
5. 未解決識別子に対する名前サジェスト機能の設定
6. 不要な括弧の削除機能の設定

**画面遷移**：
- 遷移元：Visual Studio オプションダイアログ
- 遷移先画面：同じ F# オプションカテゴリ内の他のページ（IntelliSense、QuickInfo、Advanced、Performance、Formatting）へタブ切替で遷移可能

**権限による表示制御**：特になし。Visual Studio のユーザー設定として保存され、すべてのユーザーが設定を変更可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 66 | コードフィックス | 主機能 | クイック修正機能の有効/無効を設定（名前の簡略化、未使用 open、未使用宣言、名前サジェスト、括弧削除） |
| 65 | 診断アナライザ | 補助機能 | コード診断機能の検出結果を Code Fixes で修正 |

## 画面種別

設定画面（オプションページ）

## URL/ルーティング

Visual Studio 内部ダイアログのため、URLは存在しません。
- GUIDパス: `{Guids.codeFixesOptionPageIdString}`
- オプションツリーパス: `テキストエディター` > `F#` > `Code Fixes`

## 入出力項目

| 項目名 | 項目種別 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| SimplifyName | 入力（チェックボックス） | bool | - | 名前の簡略化（不要な修飾子の削除）を有効にするかどうか |
| AlwaysPlaceOpensAtTopLevel | 入力（チェックボックス） | bool | - | open 文を常にトップレベルに配置するかどうか |
| UnusedOpens | 入力（チェックボックス） | bool | - | 未使用の open 文を削除する提案を有効にするかどうか |
| UnusedDeclarations | 入力（チェックボックス） | bool | - | 未使用の宣言を分析・修正提案するかどうか |
| SuggestNamesForErrors | 入力（チェックボックス） | bool | - | 未解決識別子に対して名前をサジェストするかどうか |
| RemoveParens | 入力（チェックボックス） | bool | - | 不要な括弧を削除する提案を有効にするかどうか |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| Code Fixes グループ | GroupBox | コード修正関連の設定をグループ化 |
| 名前の簡略化 | CheckBox | `simplifyName` - 不要な修飾子を削除する提案 |
| トップレベル配置 | CheckBox | `alwaysPlaceOpensAtTopLevel` - open 文の配置ルール |
| 未使用 open 削除 | CheckBox | `unusedOpens` - 未使用の open 文の削除提案 |
| 未使用宣言分析 | CheckBox | `unusedDeclaration` - 未使用の宣言に対する修正提案 |
| 名前サジェスト | CheckBox | `suggestNamesForErrors` - 未解決識別子への名前提案 |
| 括弧削除 | CheckBox | `removeParens` - 不要な括弧の削除提案（実験的機能） |

## イベント仕様

### 1-設定値の保存

OK ボタン押下時、設定値は Visual Studio の SettingsStore を通じて永続化されます。設定は `CodeFixesOptions` レコード型として管理されます。

### 2-設定値の読み込み

画面表示時、`EditorOptions` クラスの `CodeFixes` プロパティから現在の設定値が読み込まれ、各コントロールにバインドされます。

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

本画面はデータベースを使用しません。設定値は Visual Studio のユーザー設定ストア（レジストリまたは設定ファイル）に保存されます。

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

該当なし（Visual Studio 内部設定ストアを使用）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|--------------|------|----------------|----------|
| - | - | 本画面固有のメッセージはありません | - |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| 設定読み込み失敗 | デフォルト値（CodeFixesOptions.Default）が使用される |
| 設定保存失敗 | Visual Studio 標準のエラーハンドリングに従う |

## 備考

- 本画面は WPF UserControl として実装されています（`CodeFixesOptionControl.xaml`）
- 設定値は `CodeFixesOptions` レコード型で管理され、MEF を通じて他のコンポーネントからアクセス可能です
- デフォルト値は以下の通りです：
  - SimplifyName: false（パフォーマンス影響を考慮して無効）
  - AlwaysPlaceOpensAtTopLevel: true
  - UnusedOpens: true
  - UnusedDeclarations: true
  - SuggestNamesForErrors: true
  - RemoveParens: false（実験的機能のため無効）
- `RemoveParens` は実験的機能であり、タイピングパフォーマンスに影響を与える可能性があるため、注意書きが UI に表示されます

---

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

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

### 推奨読解順序

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

まず、画面で扱う設定データの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `CodeFixesOptions` レコード型（62-82行目）の定義を確認。6つのフィールドとデフォルト値を把握する |

**読解のコツ**: コメント（74-75行目）に SimplifyName がデフォルトで無効な理由（パフォーマンス問題）が記載されています。

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

オプションページとして Visual Studio に登録される仕組みを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `CodeFixesOptionPage` クラス（213-216行目）が Visual Studio オプションページとして登録される |

**主要処理フロー**:
1. **213行目**: `[<Guid(Guids.codeFixesOptionPageIdString)>]` 属性で GUID を指定
2. **214行目**: `AbstractOptionPage<CodeFixesOptions>` を継承してオプションページを定義
3. **216行目**: `CreateView()` メソッドで `CodeFixesOptionControl` を生成

#### Step 3: UI 定義を理解する

XAML で定義された UI コントロールの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CodeFixesOptionControl.xaml | `vsintegration/src/FSharp.UIResources/CodeFixesOptionControl.xaml` | UserControl の全体構造（GroupBox 内の CheckBox 配置） |

**主要処理フロー**:
- **20行目**: Code Fixes グループヘッダー
- **22-23行目**: `simplifyName` チェックボックス
- **24-25行目**: `alwaysPlaceOpensAtTopLevel` チェックボックス
- **27-28行目**: `unusedOpens` チェックボックス
- **29-30行目**: `unusedDeclaration` チェックボックス
- **32-33行目**: `suggestNamesForErrors` チェックボックス
- **34-35行目**: `removeParens` チェックボックス

#### Step 4: リソース文字列を理解する

UI に表示される文字列リソースを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Strings.resx | `vsintegration/src/FSharp.UIResources/Strings.resx` | `Code_Fixes`、`Simplify_name_code_fix`、`Unused_opens_code_fix`、`Remove_parens_code_fix` などのリソースキー |

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

```
Visual Studio オプションダイアログ
    │
    ├─ CodeFixesOptionPage (EditorOptions.fs:213-216)
    │      │
    │      └─ CreateView()
    │             │
    │             └─ CodeFixesOptionControl (XAML)
    │                    │
    │                    ├─ DataContext: CodeFixesOptions
    │                    └─ 各 CheckBox のバインディング
    │
    └─ EditorOptions (EditorOptions.fs:151-174)
           │
           ├─ CodeFixes プロパティ (165行目)
           └─ SettingsStore.Get<CodeFixesOptions>()
```

### データフロー図

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

ユーザー操作 ───▶ CodeFixesOptionControl ───▶ CodeFixesOptions
(CheckBox)                     │                         │
                               │                         │
                               ▼                         ▼
                    SettingsStore.Register() ───▶ Visual Studio 設定ストア
                               │
                               ▼
                    EditorOptions.CodeFixes ───▶ Code Fix プロバイダ群
                                                 (SimplifyNameCodeFix,
                                                  UnusedOpensCodeFix, etc.)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| CodeFixesOptionControl.xaml | `vsintegration/src/FSharp.UIResources/CodeFixesOptionControl.xaml` | XAML | UI レイアウト定義 |
| EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | ソース | オプションデータ構造とオプションページ登録 |
| Strings.resx | `vsintegration/src/FSharp.UIResources/Strings.resx` | リソース | UI 表示文字列の定義 |
| OptionPageStyle.xaml | `vsintegration/src/FSharp.UIResources/OptionPageStyle.xaml` | XAML | 共通スタイル定義 |
| SettingsStore.fs | `vsintegration/src/FSharp.Editor/Options/SettingsStore.fs` | ソース | 設定の永続化処理 |
