# 機能設計書 90-型プロバイダ

## 概要

本ドキュメントは、F#コンパイラにおける型プロバイダの統合機能の設計について記述する。型プロバイダは、外部データソースに基づいて型を動的に生成するF#の強力な機能であり、本モジュールはその統合と管理を担当する。

### 本機能の処理概要

**業務上の目的・背景**：
型プロバイダは、JSON、XML、SQL、CSVなどの外部データソースのスキーマに基づいて、コンパイル時に型を生成する。これにより、型安全なデータアクセスをボイラープレートコードなしで実現できる。TypeProviders.fsは、型プロバイダの検出、読み込み、型生成、エラー処理などの統合機能を提供する。

**機能の利用シーン**：
- `[<TypeProvider>]`属性を持つアセンブリの検出
- 型プロバイダからの提供型（ProvidedType）の取得
- 静的パラメータの解決
- 生成型/消去型の処理

**主要な処理内容**：
1. 型プロバイダアセンブリの検出と読み込み
2. ITypeProviderインターフェースの呼び出し
3. ProvidedTypeの管理
4. 静的パラメータの解決
5. エラーハンドリングとキャッシング

**関連システム・外部連携**：
- FSharp.Core.CompilerServices: 型プロバイダAPI
- TypedTree: TAST型定義
- 外部型プロバイダアセンブリ

**権限による制御**：
型プロバイダは外部コードを実行するため、セキュリティ上の考慮が必要。

## 関連画面

該当なし（コンパイラ内部機能）

## 機能種別

コンパイラ機能（型プロバイダ統合）

## データ構造仕様

### ProvidedType

型プロバイダから提供される型を表現。

```fsharp
type ProvidedType = {
    Type: System.Type
    Context: ProvidedTypeContext
}
```

### ProvidedTypeContext

提供型のコンテキスト情報。

```fsharp
type ProvidedTypeContext = {
    TypeProvider: ITypeProvider
    ResolutionEnvironment: ResolutionEnvironment
}
```

### ResolutionEnvironment

型解決に必要な環境情報。

```fsharp
type ResolutionEnvironment = {
    resolutionFolder: string
    outputFile: string option
    showResolutionMessages: bool
    referencedAssemblies: string[]
    temporaryFolder: string
}
```

### 主要な関数

| 関数名 | パラメータ | 説明 |
|--------|----------|------|
| GetTypeProvidersOfAssembly | 各種 | アセンブリから型プロバイダを取得 |
| CreateTypeProvider | 各種 | 型プロバイダインスタンスを作成 |
| GetTypeProviderImplementationTypes | 各種 | 実装型を取得 |
| ApplyStaticArguments | 各種 | 静的パラメータを適用 |

## 処理フロー

### 型プロバイダの使用フロー

```
参照アセンブリの読み込み
    │
    ▼
[<TypeProvider>]属性の検出
    │
    ▼
GetTypeProvidersOfAssembly
    │
    ├─ CreateTypeProvider
    │      └─ ITypeProviderインスタンス作成
    │
    └─ キャッシュに登録
    │
    ▼
型検査中
    │
    ├─ GetProvidedNamespace
    │
    ├─ GetTypes
    │
    └─ ApplyStaticArguments (静的パラメータがある場合)
    │
    ▼
ProvidedTypeの取得
    │
    ├─ 生成型 (Generative) → 新しい.NET型を生成
    │
    └─ 消去型 (Erased) → 既存の型に消去
    │
    ▼
コード生成
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-90-01 | 型プロバイダの無効化 | `NO_TYPEPROVIDERS`定義で型プロバイダを無効化 | ビルド設定 |
| BR-90-02 | 静的パラメータ | 静的パラメータは文字列、整数、ブール等の定数のみ | ApplyStaticArguments時 |
| BR-90-03 | 消去型の制限 | 消去型はインスタンス化できない | 型検査時 |
| BR-90-04 | エラー隔離 | 型プロバイダのエラーはコンパイル継続可能 | エラーハンドリング |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| TypeProviderError | 型プロバイダエラー | 型プロバイダがエラーを報告 | エラー表示して継続 |
| - | 読み込みエラー | 型プロバイダアセンブリが見つからない | 警告表示 |
| - | 静的パラメータエラー | 無効な静的パラメータ | エラー報告 |

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

- 型プロバイダはコンパイル時にコードを実行するため、信頼されたソースからのみ使用
- サンドボックス環境での実行を推奨
- エラーメッセージに機密情報を含めない

## 備考

- `#if !NO_TYPEPROVIDERS`で条件コンパイル
- 型プロバイダは.NET Framework/.NET Coreの両方をサポート
- デザイン時（IDE）とコンパイル時で異なる動作が可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | ProvidedType型 |
| 1-2 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | ProvidedTypeContext型 |
| 1-3 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | ResolutionEnvironment型 |

#### Step 2: 主要な関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | GetTypeProvidersOfAssembly関数 |
| 2-2 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | CreateTypeProvider関数 |
| 2-3 | TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | GetTypeProviderImplementationTypes関数 |

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TypeProviders.fs | `src/Compiler/TypedTree/TypeProviders.fs` | ソース | 型プロバイダ統合 |
| TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ソース | TAST型定義 |
| CompilerServices (FSharp.Core) | - | 外部 | ITypeProviderインターフェース |
