# 画面設計書 5-言語サービスパフォーマンスオプション画面

## 概要

本ドキュメントは、Visual Studio の F# 言語サービスにおけるパフォーマンス関連の設定を行う「言語サービスパフォーマンスオプション画面」の設計仕様を記述するものです。

### 本画面の処理概要

この画面は、F# 言語サービスのパフォーマンスを最適化するための各種設定をカスタマイズするためのオプションページです。プロジェクト間参照、IntelliSense の応答性、並列処理、参照検索のパフォーマンスなど、開発体験に直接影響する設定を提供します。

**業務上の目的・背景**：F# 開発者が大規模プロジェクトや複雑なソリューションで作業する際に、言語サービスのパフォーマンスを調整するために必要な画面です。メモリ使用量とレスポンス速度のトレードオフを開発者自身が調整できるようにすることで、様々な開発環境や要件に対応できます。

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

**主要な操作・処理内容**：
1. クロスプロジェクト参照のインメモリ保持設定
2. 透過的コンパイラキャッシュ係数の設定
3. 部分型チェックの有効化設定
4. Stale IntelliSense 結果の許可設定と待機時間設定
5. 並列参照解決の有効化設定
6. 高速参照検索・リネームの有効化設定
7. バックグラウンド解決・シンボル使用の保持設定

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

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 15 | バックグラウンドコンパイラ | 主機能 | クロスプロジェクト参照のインメモリ保持、バックグラウンド解決の保持設定 |
| 17 | 補完機能 | 補助機能 | Stale IntelliSense の許可、Stale までの時間設定による補完パフォーマンス調整 |
| 61 | 参照検索 | 補助機能 | 高速参照検索とリネームの有効化設定 |
| 52 | アセンブリ参照解決 | 補助機能 | 並列参照解決の有効化設定 |
| 19 | セマンティック分類 | 補助機能 | バックグラウンド ItemKeyStore とセマンティック分類の有効化設定 |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

| 項目名 | 項目種別 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| EnableInMemoryCrossProjectReferences | 入力（チェックボックス） | bool | - | クロスプロジェクト参照をインメモリで保持するかどうか |
| TransparentCompilerCacheFactor | 入力（テキストボックス） | int | - | 透過的コンパイラのキャッシュ係数（1-10000） |
| EnablePartialTypeChecking | 入力（チェックボックス） | bool | - | 部分型チェックを有効にするかどうか |
| AllowStaleCompletionResults | 入力（チェックボックス） | bool | - | Stale（古い）IntelliSense 結果を許可するかどうか |
| TimeUntilStaleCompletion | 入力（テキストボックス） | int | - | Stale 結果を使用するまでの待機時間（ミリ秒、0-10000） |
| EnableParallelReferenceResolution | 入力（チェックボックス） | bool | - | 並列参照解決を有効にするかどうか（要再起動） |
| EnableFastFindReferencesAndRename | 入力（チェックボックス） | bool | - | 高速参照検索・リネームを有効にするかどうか |
| KeepAllBackgroundResolutions | 入力（チェックボックス） | bool | - | すべてのバックグラウンド解決を保持するかどうか |
| KeepAllBackgroundSymbolUses | 入力（チェックボックス） | bool | - | すべてのバックグラウンドシンボル使用を保持するかどうか |
| EnableBackgroundItemKeyStoreAndSemanticClassification | 入力（チェックボックス） | bool | - | バックグラウンドシンボルキー保持を有効にするかどうか |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| Project Performance グループ | GroupBox | プロジェクトパフォーマンス関連の設定 |
| クロスプロジェクト参照 | CheckBox + ToolTip | `enableInMemoryCrossProjectReferences` |
| キャッシュ係数 | Label + TextBox | `transparentCompilerCacheFactor` |
| 部分型チェック | CheckBox | `enablePartialTypeChecking` |
| IntelliSense Performance グループ | GroupBox | IntelliSense パフォーマンス関連の設定 |
| Stale 結果許可 | CheckBox | `enableStaleIntelliSenseResults` |
| Stale 待機時間 | Label + TextBox | `timeUntilStaleIntelliSenseLabel`（Stale 許可時のみ有効） |
| Parallelization グループ | GroupBox | 並列処理の設定（要再起動） |
| 並列参照解決 | CheckBox | `enableParallelReferenceResolution` |
| Find References Performance グループ | GroupBox | 参照検索パフォーマンスの設定 |
| 高速参照検索 | CheckBox | `enableFastFindReferencesAndRename` |
| Language Service Settings グループ | GroupBox | 言語サービス詳細設定（上級者向け） |
| バックグラウンド解決保持 | CheckBox | `keepAllBackgroundResolutions` |
| シンボル使用保持 | CheckBox | `keepAllBackgroundSymbolUses` |
| シンボルキー保持 | CheckBox | `enableBackgroundItemKeyStoreAndSemanticClassification` |

## イベント仕様

### 1-Stale IntelliSense チェック変更

ユーザーが「Stale IntelliSense 結果を許可」チェックボックスをオフにした場合、待機時間設定の TextBox が無効化されます（IsEnabled がバインドされているため）。

### 2-入力値検証

キャッシュ係数と待機時間の TextBox には `IntegerRangeValidationRule` による入力検証が適用されています：
- TransparentCompilerCacheFactor: 1-10000 の範囲
- TimeUntilStaleCompletion: 0-10000 の範囲（ミリ秒）

### 3-設定値の保存

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

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

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

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

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

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

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|--------------|------|----------------|----------|
| Tooltip_in_memory_cross_project_references | ToolTip | In-memory cross-project references store project-level data in memory to allow IDE features to work across projects. | マウスホバー時 |
| Transparent_Compiler_Cache_Factor_Tooltip | ToolTip | Higher number means more memory will be used for caching. Changing the value wipes cache. | マウスホバー時 |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| 設定読み込み失敗 | デフォルト値（LanguageServicePerformanceOptions.Default）が使用される |
| 設定保存失敗 | Visual Studio 標準のエラーハンドリングに従う |
| 無効な数値入力 | ValidationRule により入力が拒否される |

## 備考

- 本画面は WPF UserControl として実装されています（`LanguageServicePerformanceOptionControl.xaml`）
- 設定値は `LanguageServicePerformanceOptions` レコード型で管理され、MEF を通じて他のコンポーネントからアクセス可能です
- デフォルト値は以下の通りです：
  - EnableInMemoryCrossProjectReferences: true
  - TransparentCompilerCacheFactor: 100
  - AllowStaleCompletionResults: true
  - TimeUntilStaleCompletion: 2000（ミリ秒）
  - EnableParallelReferenceResolution: false
  - EnableFastFindReferencesAndRename: true
  - EnablePartialTypeChecking: true
  - KeepAllBackgroundResolutions: false
  - KeepAllBackgroundSymbolUses: false
  - EnableBackgroundItemKeyStoreAndSemanticClassification: true
- 並列参照解決の変更は再起動後に反映されます
- 高速参照検索は実験的機能として提供されています

---

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

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

### 推奨読解順序

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

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

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

**読解のコツ**: 各フィールドの説明コメントはリソースファイルの対応する ToolTip で確認できます。

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

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

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

**主要処理フロー**:
1. **218行目**: `[<Guid(Guids.languageServicePerformanceOptionPageIdString)>]` 属性で GUID を指定
2. **219行目**: `AbstractOptionPage<LanguageServicePerformanceOptions>` を継承してオプションページを定義
3. **222-223行目**: `CreateView()` メソッドで `LanguageServicePerformanceOptionControl` を生成

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

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

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

**主要処理フロー**:
- **20-51行目**: Project Performance グループ（CheckBox + TextBox + CheckBox）
- **53-81行目**: IntelliSense Performance グループ（CheckBox + 条件付き TextBox）
- **82-88行目**: Parallelization グループ
- **89-95行目**: Find References Performance グループ
- **96-108行目**: Language Service Settings グループ（3つの CheckBox）

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

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

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

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

```
Visual Studio オプションダイアログ
    │
    ├─ LanguageServicePerformanceOptionPage (EditorOptions.fs:218-223)
    │      │
    │      └─ CreateView()
    │             │
    │             └─ LanguageServicePerformanceOptionControl (XAML)
    │                    │
    │                    ├─ DataContext: LanguageServicePerformanceOptions
    │                    ├─ IntegerRangeValidationRule（入力検証）
    │                    └─ 各コントロールのバインディング
    │
    └─ EditorOptions (EditorOptions.fs:151-174)
           │
           ├─ LanguageServicePerformance プロパティ (166行目)
           └─ SettingsStore.Get<LanguageServicePerformanceOptions>()
```

### データフロー図

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

ユーザー操作 ───▶ LanguageServicePerformanceOptionControl ───▶ LanguageServicePerformanceOptions
(CheckBox/                          │                                │
 TextBox)                           │                                │
                                    ▼                                ▼
                         SettingsStore.Register() ───▶ Visual Studio 設定ストア
                                    │
                                    ▼
                         EditorOptions.LanguageServicePerformance ───▶ 各種言語サービス
                                                                       - FSharpProjectOptionsManager
                                                                       - CompletionProvider
                                                                       - FindReferencesService
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| LanguageServicePerformanceOptionControl.xaml | `vsintegration/src/FSharp.UIResources/LanguageServicePerformanceOptionControl.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` | ソース | 設定の永続化処理 |
