# 機能設計書 79-言語機能フラグ

## 概要

本ドキュメントは、F#コンパイラにおける言語バージョン管理と機能フラグ制御の設計を記述する。LanguageFeature列挙型とLanguageVersionクラスにより、言語バージョンごとの機能の有効/無効を制御する。

### 本機能の処理概要

**業務上の目的・背景**：F#言語は継続的に新機能が追加されており、各機能は特定の言語バージョン（4.7、5.0、6.0など）で導入される。LanguageVersion機構は、コンパイラオプション（`--langversion`）で指定されたバージョンに基づいて、どの機能を有効にするかを制御する。これにより、後方互換性を維持しながら新機能を段階的に導入でき、プレビュー機能のテストも可能となる。

**機能の利用シーン**：コンパイラの各フェーズ（パーサー、型チェッカー、コード生成など）で、新しい構文や動作を使用する前に機能フラグをチェックし、選択された言語バージョンでサポートされているかを判定する。

**主要な処理内容**：
1. LanguageFeature列挙型による約90の機能の定義
2. 機能と導入バージョンのマッピング管理
3. バージョン文字列の解析と検証
4. 特定機能の無効化サポート
5. プレビュー機能の分離管理

**関連システム・外部連携**：コンパイラオプション処理（CompilerOptions）、エラーメッセージシステム（FSComp.SR）と連携する。

**権限による制御**：本機能に特別な権限制御は存在しない。

## 関連画面

本機能はコンパイラ内部機能であり、直接関連する画面は存在しない。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | - |

## 機能種別

構成管理 / バージョン制御 / 機能フラグ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| versionText | string | Yes | バージョン指定文字列 | "4.6"〜"11.0"、"preview"、"default"、"latest"、"latestmajor" |
| disabledFeaturesArray | LanguageFeature array | No | 無効化する機能の配列 | 有効なLanguageFeature値 |

### 入力データソース

- コンパイラオプション（--langversion）
- プロジェクトファイル設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| SupportsFeature結果 | bool | 指定機能がサポートされているか |
| SpecifiedVersion | decimal | 指定されたバージョン数値 |
| IsPreviewEnabled | bool | プレビューが有効か |
| ValidVersions | string array | 有効なバージョン一覧 |

### 出力先

- コンパイラ内部の機能判定

## 処理フロー

### 処理シーケンス

```
【LanguageVersionコンストラクタ】
1. versionTextを大文字変換してパース
2. バージョン数値（decimal）を取得
3. disabledFeaturesArrayを保存

【SupportsFeature】
1. 機能がdisabledFeaturesに含まれるかチェック
   - 含まれる場合: false返却
2. features辞書から機能の導入バージョンを取得
3. 導入バージョン <= 指定バージョンか判定
4. 結果を返却
```

### フローチャート

```mermaid
flowchart TD
    A[SupportsFeature呼び出し] --> B{disabledFeaturesに含まれる?}
    B -->|Yes| C[false返却]
    B -->|No| D{features辞書に存在?}
    D -->|No| E[false返却]
    D -->|Yes| F{導入version <= 指定version?}
    F -->|Yes| G[true返却]
    F -->|No| H[false返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-79-01 | バージョン階層 | 新バージョンは旧バージョンの全機能を含む | 常時 |
| BR-79-02 | デフォルトバージョン | "default"は10.0を意味する | default指定時 |
| BR-79-03 | プレビュー | "preview"は9999を意味し全機能有効 | preview指定時 |
| BR-79-04 | 機能無効化 | disabledFeaturesで特定機能を無効化可能 | disabledFeatures指定時 |
| BR-79-05 | 後方互換性 | 8.0より前のバージョンは環境変数でスキップ可能 | SKIP_VERSION_SUPPORTED_CHECK設定時 |

### 計算ロジック

- バージョン比較: `featureVersion <= specifiedVersion`
- プレビュー判定: `specified = 9999m`

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

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 無効なバージョン | 認識できないバージョン文字列 | 0mを返却（機能は無効扱い） |
| InvalidArg | 例外 | GetFeatureVersionStringで未知の機能 | 例外スロー |

### リトライ仕様

特になし。バージョン解析は即座に結果を返却する。

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

本機能はトランザクション管理を必要としない。

## パフォーマンス要件

- 辞書ルックアップによるO(1)の機能判定
- 静的フィールドによるメモリ効率の最適化
- デフォルトLanguageVersionのシングルトンパターン

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

- バージョン文字列は信頼されたコンパイラオプションからのみ受け付け
- リフレクションを使用したTryParseFeatureは内部用途のみ

## 備考

- 約90の言語機能がLanguageFeature列挙型で定義
- 各機能はFSComp.SRを通じてローカライズ可能な説明文字列を持つ
- F# 4.7からF# 11.0まで、およびpreviewをサポート
- FromEndSlicingは現在もpreviewのまま（未完成機能）

---

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

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

### 推奨読解順序

#### Step 1: 機能列挙型を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | LanguageFeatures.fs | `src/Compiler/Facilities/LanguageFeatures.fs` | LanguageFeature列挙型 |

**主要処理フロー**:
- **17-108行目**: LanguageFeature列挙型 - 約90の機能を定義
- **18-19行目**: SingleUnderscorePattern、WildCardInForLoop - F# 4.7の機能
- **31-32行目**: AndBang、ResumableStateMachines - F# 5.0/6.0の機能
- **80行目**: WhileBang - F# 8.0の機能
- **101-107行目**: 最新機能 - F# 10.0/11.0の機能

**読解のコツ**: 機能名からおおよその内容を推測可能。例えばStringInterpolationは文字列補間、WhileBangはwhile!構文。

#### Step 2: バージョン管理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | LanguageFeatures.fs | `src/Compiler/Facilities/LanguageFeatures.fs` | LanguageVersionクラス |

**主要処理フロー**:
- **109-110行目**: LanguageVersionクラスのコンストラクタ
- **113-125行目**: バージョン定数の定義（4.6〜11.0、preview、default）
- **143-256行目**: features辞書 - 機能と導入バージョンのマッピング
- **260-283行目**: getVersionFromString - バージョン文字列のパース

**読解のコツ**: features辞書は言語バージョンごとにセクション分けされており、コメントで「F# 4.7」「F# 5.0」などと明示されている。

#### Step 3: 機能判定APIを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | LanguageFeatures.fs | `src/Compiler/Facilities/LanguageFeatures.fs` | SupportsFeatureメソッド |

**主要処理フロー**:
- **298-304行目**: SupportsFeature - メイン判定ロジック
- **299-300行目**: disabledFeaturesチェック
- **302-304行目**: バージョン比較
- **318-327行目**: ContainsVersion、IsVersionSupported - バージョン検証

**読解のコツ**: SupportsFeatureは2段階判定。まずdisabledFeaturesをチェックし、次にバージョン比較を行う。

#### Step 4: 機能文字列を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | LanguageFeatures.fs | `src/Compiler/Facilities/LanguageFeatures.fs` | GetFeatureString |

**主要処理フロー**:
- **348-445行目**: GetFeatureString - 機能名からローカライズ文字列を取得
- **448-451行目**: GetFeatureVersionString - 機能のバージョン文字列を取得
- **454-469行目**: TryParseFeature - 文字列から機能をパース（リフレクション使用）

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

```
コンパイラオプション処理
    │
    └─ LanguageVersion(versionText)
           │
           ├─ getVersionFromString(versionText)
           │      │
           │      └─ バージョン数値を返却
           │
           └─ LanguageVersion インスタンス
                  │
                  ├─ SupportsFeature(featureId)
                  │      │
                  │      ├─ Array.contains チェック
                  │      │
                  │      └─ features.TryGetValue + バージョン比較
                  │
                  ├─ IsPreviewEnabled
                  │      │
                  │      └─ specified = previewVersion
                  │
                  └─ GetFeatureString(feature)
                         │
                         └─ FSComp.SR.feature* 呼び出し
```

### データフロー図

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

"default" ─────────────▶ getVersionFromString ───────────────▶ 10.0m
                              │
                              └─ 大文字変換 + パターンマッチ

LanguageFeature ───────▶ SupportsFeature ────────────────────▶ bool
    │                        │
    │                        ├─ disabledFeatures確認
    │                        │
    │                        └─ features辞書参照
    │
    └──────────────────▶ GetFeatureString ───────────────────▶ string
                              │
                              └─ FSComp.SR呼び出し
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| LanguageFeatures.fs | `src/Compiler/Facilities/LanguageFeatures.fs` | ソース | 言語機能フラグの主実装 |
| LanguageFeatures.fsi | `src/Compiler/Facilities/LanguageFeatures.fsi` | シグネチャ | 公開APIの定義 |
| CompilerOptions.fs | `src/Compiler/Driver/CompilerOptions.fs` | ソース | --langversionオプション処理 |
| FSComp.fs | `src/Compiler/FSComp.fs` | ソース | 機能説明文字列のリソース |
