# 機能設計書 4-型チェック

## 概要

本ドキュメントは、F#コンパイラの型チェック機能の設計を記述する。型チェックは、F#コードの型推論と型チェックを行い、型の整合性を保証する中核機能である。

### 本機能の処理概要

型チェック機能は、パーサーが生成した構文木（ParsedInput）を入力として、型推論を実行し、すべての式・パターン・宣言に型を割り当てた型付き構文木（TypedTree/TAST）を生成する。

**業務上の目的・背景**：F#は静的型付け言語であり、コンパイル時に型エラーを検出することで実行時エラーを防止する。型推論により、明示的な型注釈を最小限に抑えながらも完全な型安全性を保証する。Hindley-Milner型推論をベースとした高度な型システムにより、ジェネリクス、サブタイピング、SRTP（Statically Resolved Type Parameters）などをサポートする。

**機能の利用シーン**：コンパイル時の型検証、IDE上でのリアルタイム型エラー表示、IntelliSenseの型情報提供、リファクタリング時の型整合性確認などで使用される。

**主要な処理内容**：
1. 初期型環境（TcEnv）の構築
2. モジュール・名前空間の型チェック
3. 型定義・型拡張の型チェック
4. 値・関数定義の型チェック
5. 式・パターンの型推論
6. 制約ソルバーによる型制約解決
7. 型付き構文木（TAST）の生成

**関連システム・外部連携**：制約ソルバー（ConstraintSolver）、名前解決（NameResolution）、インポート（TcImports）と連携する。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 型チェックは直接的なUI画面を持たない |

## 機能種別

型検証処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| inputs | ParsedInput list | Yes | パース済み構文木 | 有効なParsedInput |
| tcConfig | TcConfig | Yes | コンパイラ設定 | 初期化済み |
| tcImports | TcImports | Yes | インポート済みアセンブリ | 初期化済み |
| tcGlobals | TcGlobals | Yes | グローバル型情報 | 初期化済み |
| tcState | TcState | Yes | 型チェック状態 | 初期化済み |

### 入力データソース

- パーサーからの構文木（ParsedInput）
- インポートされた参照アセンブリの型情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| TypedAssembly | CheckedAssembly | 型付きアセンブリ |
| TcState | TcState | 更新された型チェック状態 |
| TcEnv | TcEnv | 型チェック環境 |
| TopAttribs | TopAttribs | トップレベル属性 |
| diagnostics | PhasedDiagnostic[] | 型エラー・警告 |

### 出力先

- コンパイラ内部データ構造（最適化・コード生成フェーズへ）

## 処理フロー

### 処理シーケンス

```
1. 初期化
   ├─ GetInitialTcEnv（初期型環境構築）
   └─ GetInitialTcState（初期状態構築）

2. ファイル単位の型チェック
   ├─ CheckOneInput（各ファイルの型チェック）
   │      ├─ CheckDeclarations（宣言の型チェック）
   │      └─ CheckExpressions（式の型チェック）
   └─ TcState更新

3. 制約解決
   ├─ ConstraintSolver.Solve
   └─ 型変数の具体化

4. 最終化
   ├─ CheckClosedInputSetFinish
   └─ TypedAssembly生成
```

### フローチャート

```mermaid
flowchart TD
    A[ParsedInput入力] --> B[TcEnv初期化]
    B --> C[モジュール型チェック]
    C --> D[型定義チェック]
    D --> E[値定義チェック]
    E --> F[式の型推論]
    F --> G{制約解決成功?}
    G -->|Yes| H[TcState更新]
    G -->|No| I[型エラー報告]
    H --> J[次ファイル?]
    J -->|Yes| C
    J -->|No| K[TypedAssembly生成]
    I --> L[エラー回復・継続]
    L --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 型推論 | 型注釈がない場合は文脈から型を推論 | 常時 |
| BR-002 | 単相性制限 | 値制限によりジェネリクスを制限する場合あり | let束縛時 |
| BR-003 | サブタイピング | 継承関係に基づく型互換性 | クラス型使用時 |
| BR-004 | SRTP | 静的解決型パラメータによるアドホック多相 | inline関数時 |

### 計算ロジック

型推論はHindley-Milner型推論の拡張であり、制約収集と制約解決の2フェーズで動作する。式の型チェック時に型制約を収集し、ConstraintSolverが統一アルゴリズムで解決する。

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| FS0001 | 型不一致 | 期待型と実際型の不一致 | 型注釈追加または式修正 |
| FS0039 | 未定義識別子 | 存在しない識別子参照 | 識別子定義または修正 |
| FS0072 | メンバー不在 | 型にメンバーが存在しない | メンバー名修正 |
| FS0193 | 型制約違反 | ジェネリック制約の不満足 | 型制約修正 |

### リトライ仕様

型エラー発生時もエラー回復を行い、可能な限り型チェックを継続して複数エラーを報告する。

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

該当なし

## パフォーマンス要件

- 大規模プロジェクト（1000ファイル）でも合理的な時間で型チェック完了
- インクリメンタルビルドでは変更ファイルのみ再チェック

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

- 型プロバイダーのコード実行は信頼されたアセンブリのみ

## 備考

F#の型システムは.NETのCLR型システムと互換性を持ちながら、判別共用体、レコード、計算式など関数型プログラミング固有の機能をサポートする。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | 型付き構文木（TAST）の定義 |
| 1-2 | CheckBasics.fs | `src/Compiler/Checking/CheckBasics.fs` | TcEnv、TcState等の基本型定義 |

**読解のコツ**:
- TTypeは型を表す判別共用体
- Exprは型付き式を表す
- ValとValRefは値/関数の定義と参照

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | CheckDeclarations.fs | `src/Compiler/Checking/CheckDeclarations.fs` | トップレベル宣言の型チェック |

**主要処理フロー**:
- CheckOneInput: 1ファイルの型チェック
- CheckModuleOrNamespace: モジュール/名前空間の型チェック

#### Step 3: 式の型チェックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CheckExpressions.fs | `src/Compiler/Checking/Expressions/CheckExpressions.fs` | 式の型推論・チェック |

**主要処理フロー**:
- TcExpr: 式の型チェックのメインエントリ
- TcExprOfUnknownType: 型が未知の式のチェック

#### Step 4: 名前解決を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | NameResolution.fs | `src/Compiler/Checking/NameResolution.fs` | 識別子から実体への解決 |

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

```
CheckClosedInputSet
    │
    ├─ GetInitialTcEnv / GetInitialTcState
    │
    └─ CheckOneInput（ファイルごと）
           │
           ├─ CheckModuleOrNamespace
           │      ├─ CheckTypeDefns（型定義）
           │      └─ CheckLetOrDoBindings（let/do束縛）
           │
           └─ CheckExpressions
                  ├─ TcExpr（式の型チェック）
                  ├─ TcPat（パターンの型チェック）
                  └─ ConstraintSolver.Solve（制約解決）
```

### データフロー図

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

ParsedInput        ──▶  CheckDeclarations        ──▶  ModuleOrNamespaceType
                              │
                              ▼
SynExpr            ──▶  TcExpr                   ──▶  Expr + TType
                              │
                              ▼
型制約             ──▶  ConstraintSolver         ──▶  解決済み型
                              │
                              ▼
TcState            ──▶  CheckClosedInputSetFinish ──▶ TypedAssembly
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| CheckDeclarations.fs | `src/Compiler/Checking/CheckDeclarations.fs` | ソース | 宣言の型チェック |
| CheckExpressions.fs | `src/Compiler/Checking/Expressions/CheckExpressions.fs` | ソース | 式の型チェック |
| CheckPatterns.fs | `src/Compiler/Checking/CheckPatterns.fs` | ソース | パターンの型チェック |
| ConstraintSolver.fs | `src/Compiler/Checking/ConstraintSolver.fs` | ソース | 制約解決 |
| NameResolution.fs | `src/Compiler/Checking/NameResolution.fs` | ソース | 名前解決 |
| TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ソース | 型付き構文木定義 |
| TypedTreeOps.fs | `src/Compiler/TypedTree/TypedTreeOps.fs` | ソース | 型付き構文木操作 |
| TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | ソース | グローバル型情報 |
| CheckBasics.fs | `src/Compiler/Checking/CheckBasics.fs` | ソース | 型チェック基本型 |
| infos.fs | `src/Compiler/Checking/infos.fs` | ソース | メンバー情報 |
