# 機能設計書 97-シグネチャ整合性

## 概要

本ドキュメントは、F#コンパイラにおけるシグネチャ整合性チェック（Signature Conformance）機能について記述する。F#のシグネチャファイル（.fsi）と実装ファイル（.fs）の間の整合性を検証し、実装がシグネチャで宣言されたインターフェースを正しく満たしているかを確認する。

### 本機能の処理概要

**業務上の目的・背景**：F#のシグネチャファイルは、モジュールの公開インターフェースを定義する。実装ファイルがシグネチャと整合していることを保証することで、ライブラリのAPI安定性、カプセル化、ドキュメント化を実現する。また、型推論の結果がシグネチャと一致することを検証する。

**機能の利用シーン**：
- ライブラリのAPI設計と検証
- 実装詳細の隠蔽（カプセル化）
- 増分コンパイルの最適化
- APIドキュメント生成

**主要な処理内容**：
1. 型の整合性チェック - 型定義、型略称、型パラメータの一致確認
2. 値の整合性チェック - 関数/値のシグネチャの一致確認
3. アクセシビリティチェック - 可視性の整合確認
4. 属性の整合性チェック - 属性の伝播と一致確認
5. 制約の整合性チェック - 型パラメータ制約の一致確認

**関連システム・外部連携**：型チェッカー（CheckDeclarations.fs）から呼び出され、シグネチャファイルがある場合に実装との整合性を検証する。

**権限による制御**：アクセシビリティ（public/internal/private）の検証

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | IDE統合 | 参照画面 | シグネチャ不整合のエラー表示 |

## 機能種別

シグネチャ整合性検証

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| implModRef | ModuleOrNamespaceRef | Yes | 実装モジュール参照 | - |
| sigModType | ModuleOrNamespaceType | Yes | シグネチャのモジュール型 | - |
| aenv | TypeEquivEnv | Yes | 型等価性環境 | - |

### 入力データソース

型チェッカーからの実装モジュールとシグネチャモジュール

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| result | bool | 整合性チェック結果（成功/失敗） |
| diagnostics | Diagnostic list | 不整合箇所の診断メッセージ |

### 出力先

コンパイラ診断出力

## 処理フロー

### 処理シーケンス

```
1. 型定義の整合性チェック
   ├─ 型名の一致
   ├─ 型パラメータの一致
   ├─ 継承関係の一致
   └─ インターフェース実装の一致

2. 値/関数の整合性チェック
   ├─ 名前の一致
   ├─ 型の一致
   ├─ ジェネリクスの一致
   └─ 可変性（mutable）の一致

3. アクセシビリティチェック
   ├─ シグネチャより実装が制限的でないこと
   └─ internal/privateの適切な使用

4. 属性の整合性チェック
   ├─ シグネチャの属性を実装に伝播
   └─ 矛盾する属性の検出

5. 制約の整合性チェック
   ├─ 型パラメータ制約の一致
   └─ equality/comparison制約
```

### フローチャート

```mermaid
flowchart TD
    A[シグネチャ/実装読み込み] --> B[型定義チェック]
    B --> C{整合?}
    C -->|No| D[エラー: 型不整合]
    C -->|Yes| E[値/関数チェック]
    E --> F{整合?}
    F -->|No| G[エラー: 値不整合]
    F -->|Yes| H[アクセシビリティチェック]
    H --> I{整合?}
    I -->|No| J[エラー: アクセス不整合]
    I -->|Yes| K[属性チェック]
    K --> L[成功]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-97-1 | 名前一致 | シグネチャと実装で名前が一致 | 常時 |
| BR-97-2 | 型一致 | シグネチャと実装で型が等価 | 常時 |
| BR-97-3 | アクセス制限 | 実装はシグネチャより制限的でない | 常時 |
| BR-97-4 | 属性伝播 | シグネチャの属性は実装に伝播 | 常時 |

### 計算ロジック

**型等価性の判定**：
```
1. 型パラメータを正規化
2. 型コンストラクタの等価性を確認
3. 型引数を再帰的に確認
4. nullability属性を考慮
```

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| FS0034 | ValueNotContained | 値がシグネチャに不在 | 実装またはシグネチャを修正 |
| FS0035 | TypeNotContained | 型がシグネチャに不在 | 実装またはシグネチャを修正 |
| FS0193 | RequiredButNotSpecified | シグネチャ必須項目の欠落 | 欠落項目を追加 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

シグネチャ整合性チェックのオーバーヘッドは全体のコンパイル時間の5%未満であること

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

該当なし

## 備考

シグネチャファイルは省略可能であり、存在しない場合はすべての定義が公開される。FSharp.CoreはAPIの安定性のためにシグネチャファイルを使用している。

---

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

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

### 推奨読解順序

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

シグネチャ整合性チェックで使用される型を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SignatureConformance.fs | `src/Compiler/Checking/SignatureConformance.fs` | Checker型、TypeEquivEnv型 |

**主要な型定義**:
- **28-42行目**: TypeMismatchSource - 型不一致の種類
- **30-42行目**: 各種例外定義（RequiredButNotSpecified, ValueNotContained等）
- **53-61行目**: Checker - 整合性チェックのコンテキスト

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

シグネチャ整合性チェックの主要な関数を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SignatureConformance.fs | `src/Compiler/Checking/SignatureConformance.fs` | checkTypeDef, checkVal関数 |

**主要処理フロー**:
- **71-127行目**: checkAttribs - 属性の整合性チェック
- **129-178行目**: checkTypars - 型パラメータの整合性チェック
- **180-284行目**: checkTypeDef - 型定義の整合性チェック
- **339-375行目**: checkVal - 値/関数の整合性チェック

#### Step 3: 呼び出し元を理解する

シグネチャ整合性チェックがどこから使われるかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CheckDeclarations.fs | `src/Compiler/Checking/CheckDeclarations.fs` | シグネチャ付きモジュールのチェック |

**読解のコツ**:
- Checker型はglobals, amap, denvなどのコンテキストを保持
- checkTyparで型パラメータの制約も含めて検証
- sigToImplRemapでシグネチャの参照を実装にリマップ

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

```
CheckDeclarations.fs
    │
    └─ SignatureConformance.fs (Checker)
           │
           ├─ checkModuleOrNamespaceContents
           │      └─ モジュール内の全要素をチェック
           │
           ├─ checkTypeDef
           │      ├─ checkTypars: 型パラメータ
           │      ├─ checkTypeRepr: 型表現
           │      └─ checkAttribs: 属性
           │
           └─ checkVal
                  ├─ checkValInfo: 値情報
                  ├─ 型等価性チェック
                  └─ checkMemberDatasConform: メンバーデータ
```

### データフロー図

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

実装モジュール ───▶ Checker ───▶ 診断メッセージ
(ModuleOrNamespaceRef)  │
                        │
シグネチャモジュール ───▶│───▶ 整合性チェック結果
(ModuleOrNamespaceType)  │
                        ▼
              ┌──────────────┐
              │ 型チェック    │
              │ 値チェック    │
              │ アクセスチェック│
              │ 属性チェック   │
              └──────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SignatureConformance.fs | `src/Compiler/Checking/SignatureConformance.fs` | ソース | シグネチャ整合性チェック実装 |
| SignatureConformance.fsi | `src/Compiler/Checking/SignatureConformance.fsi` | ソース | 公開シグネチャ |
| CheckDeclarations.fs | `src/Compiler/Checking/CheckDeclarations.fs` | ソース | 呼び出し元 |
| TypedTreeOps.fs | `src/Compiler/TypedTree/TypedTreeOps.fs` | ソース | 型等価性判定 |
| AccessibilityLogic.fs | `src/Compiler/Checking/AccessibilityLogic.fs` | ソース | アクセシビリティ判定 |
