# 機能設計書 87-型付き構文木定義

## 概要

本ドキュメントは、F#コンパイラにおける型付き抽象構文木（TAST: Typed Abstract Syntax Tree）の定義について記述する。TASTはF#コンパイラの中間表現であり、型検査後のプログラムを表現する。

### 本機能の処理概要

**業務上の目的・背景**：
TASTはF#コンパイラパイプラインの中核を成す中間表現である。パーサーが生成したUntypedTreeに対して型検査を行い、その結果をTASTとして表現する。TASTは型情報を含む完全な表現であり、最適化、コード生成、インテリセンス、リファクタリングなどの様々なコンパイラサービスの基盤となる。

**機能の利用シーン**：
- 型検査フェーズでの型付き式の構築
- 最適化フェーズでの式変換
- コード生成フェーズでのIL生成
- FSharp.Compiler.ServiceでのAPI提供
- インテリセンス、補完、リファクタリング

**主要な処理内容**：
1. 型パラメータ（Typar）の定義
2. 型（TType）の定義
3. 式（Expr）の定義
4. 値（Val）の定義
5. エンティティ（Entity/Tycon）の定義
6. モジュール・名前空間の定義

**関連システム・外部連携**：
- SyntaxTree: パース結果（UntypedTree）
- TypedTreeOps: TAST操作ユーティリティ
- ILGen: IL生成
- FSharp.Compiler.Service: エディタサービスAPI

**権限による制御**：
特になし。コンパイラ内部のデータ構造。

## 関連画面

該当なし（コンパイラ内部データ構造）

## 機能種別

コンパイラデータ構造（型付き抽象構文木定義）

## データ構造仕様

### 主要な型定義

#### ValInline（43-58行目）

| 値 | 説明 |
|-----|------|
| Always | 常にインライン化される（ただしILコードは残る） |
| Optional | オプティマイザによってインライン化可能 |
| Never | インライン化禁止 |

#### ValRecursiveScopeInfo（62-68行目）

| 値 | 説明 |
|-----|------|
| ValInRecScope of bool | 再帰スコープ内（boolは汎化済みか） |
| ValNotInRecScope | 再帰スコープ外 |

#### ValMutability（70-72行目）

| 値 | 説明 |
|-----|------|
| Immutable | 不変 |
| Mutable | 可変 |

#### TyparDynamicReq（75-82行目）

| 値 | 説明 |
|-----|------|
| No | ランタイムで不要（消去可能） |
| Yes | ランタイムで必要（消去不可） |

#### ValBaseOrThisInfo（84-97行目）

| 値 | 説明 |
|-----|------|
| CtorThisVal | コンストラクタ内の`this`参照セル |
| BaseVal | `base`値 |
| NormalVal | 通常の値 |
| MemberThisVal | メンバーの`this`値（例: `member x.M()`の`x`） |

#### ValFlags（99-251行目）

ビットフィールドで値のフラグを管理。

| フラグ | 説明 |
|--------|------|
| BaseOrThisInfo | base/this情報 |
| IsCompilerGenerated | コンパイラ生成 |
| InlineInfo | インライン情報 |
| MutabilityInfo | 可変性 |
| IsMemberOrModuleBinding | メンバー/モジュールバインディング |
| IsExtensionMember | 拡張メンバー |
| IsIncrClassSpecialMember | インクリメンタルクラス特殊メンバー |
| IsTypeFunction | 型関数 |
| RecursiveValInfo | 再帰値情報 |
| MakesNoCriticalTailcalls | 重要な末尾呼び出しなし |
| PermitsExplicitTypeInstantiation | 明示的型インスタンス化許可 |
| HasBeenReferenced | 参照済み |
| IsCompiledAsStaticPropertyWithoutField | フィールドなし静的プロパティ |
| IsGeneratedEventVal | 生成されたイベント値 |
| IsFixed | 固定 |
| IgnoresByrefScope | byrefスコープ無視 |
| InlineIfLambda | ラムダならインライン |
| IsImplied | 暗黙的 |

#### TyparKind（254-272行目）

| 値 | 説明 |
|-----|------|
| Type | 型パラメータ |
| Measure | 単位パラメータ |

#### TyparRigidity（276-299行目）

| 値 | 説明 |
|-----|------|
| Rigid | 解決不可 |
| WillBeRigid | 推論後に解決不可 |
| WarnIfNotRigid | 解決時に警告 |
| Flexible | 解決可能 |
| Anon | 匿名（`_`由来） |

#### TyparFlags（302-398行目）

ビットフィールドで型パラメータのフラグを管理。

| フラグ | 説明 |
|--------|------|
| IsFromError | エラー後生成 |
| IsCompilerGenerated | コンパイラ生成 |
| StaticReq | 静的要件（^a変数） |
| Rigidity | 剛性 |
| Kind | 種類（Type/Measure） |
| ComparisonConditionalOn | 比較条件付き |
| DynamicReq | 動的要件 |
| EqualityConditionalOn | 等値条件付き |
| IsCompatFlex | 互換性フレキシブル |
| IsSupportsNullFlex | null許容フレキシブル |

## 処理フロー

### 型検査からTAST構築

```
UntypedTree (Syntax.SynExpr)
    │
    ▼
型検査 (CheckExpressions.fs)
    │
    ├─ 型推論・統一
    │
    ├─ 名前解決
    │
    └─ 制約解決
    │
    ▼
TypedTree (Expr, Val, Entity, TType, Typar)
    │
    ├─ 最適化 (Optimizer)
    │
    ├─ コード生成 (ILGen)
    │
    └─ サービスAPI (FSharp.Compiler.Service)
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-87-01 | 再帰スコープ | ValInRecScopeは推論中のみ有効 | 再帰定義の推論中 |
| BR-87-02 | PickledBits | シリアライズ時に一部フラグを除去 | メタデータ保存時 |
| BR-87-03 | 型パラメータ剛性 | 推論中はFlexible、後にRigidに進化 | 型推論中 |

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

該当なし（メモリ内データ構造）

## エラー処理

該当なし（データ構造定義）

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

該当なし

## パフォーマンス要件

- ValFlagsとTyparFlagsはビットフィールドでメモリ効率を最大化
- Stampによる高速なエンティティ比較

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

該当なし

## 備考

- Stampはint64でエンティティの一意識別に使用
- PickledBitsはメタデータ保存時に不要なフラグを除去（249-251行目）
- WellKnownNames.CopyOfStructは防御コピーの特殊名（34-36行目）

---

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

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

### 推奨読解順序

#### Step 1: 基本的な列挙型を理解する

まず、TASTで使用される基本的な列挙型を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ValInline型（43-58行目） |
| 1-2 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ValMutability型（70-72行目） |
| 1-3 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | TyparKind型（254-272行目） |
| 1-4 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | TyparRigidity型（276-299行目） |

#### Step 2: フラグ構造体を理解する

ビットフィールドによるフラグ管理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ValFlags型（99-251行目） |
| 2-2 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | TyparFlags型（302-398行目） |

**読解のコツ**: ビットフィールドは`&&&`（AND）と`|||`（OR）で操作される。各フラグはビット位置が固定されている。

#### Step 3: 主要な型を理解する（ファイル後半）

Val、TType、Expr等の主要な型定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | Typar型 |
| 3-2 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | TType型 |
| 3-3 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | Val型 |
| 3-4 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | Expr型 |
| 3-5 | TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | Entity型 |

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

```
TypedTree.fs (型定義)
    │
    ├─ ValInline / ValMutability / TyparKind / TyparRigidity
    │      └─ 基本的な列挙型
    │
    ├─ ValFlags / TyparFlags
    │      └─ ビットフィールド構造体
    │
    ├─ Typar
    │      └─ 型パラメータ（ジェネリック型変数）
    │
    ├─ TType
    │      ├─ TType_forall: 全称型
    │      ├─ TType_app: 型適用
    │      ├─ TType_fun: 関数型
    │      ├─ TType_tuple: タプル型
    │      └─ TType_var: 型変数
    │
    ├─ Val
    │      └─ 値（関数、変数、メンバー）
    │
    ├─ Expr
    │      ├─ Expr.Val: 値参照
    │      ├─ Expr.Lambda: ラムダ式
    │      ├─ Expr.App: 関数適用
    │      ├─ Expr.Let: let式
    │      ├─ Expr.LetRec: let rec式
    │      ├─ Expr.Match: パターンマッチ
    │      ├─ Expr.Op: 演算
    │      └─ ...
    │
    └─ Entity (Tycon)
           └─ 型定義（クラス、レコード、共用体、モジュール）
```

### データフロー図

```
[パース]                      [型検査]                       [後続フェーズ]

SyntaxTree (UntypedTree)
    │
    ▼
パーサー出力 ────────────────▶ 型検査
                                   │
                                   ├─▶ 名前解決 (Name Resolution)
                                   │
                                   ├─▶ 型推論・統一 (Unification)
                                   │
                                   ├─▶ 制約解決 (Constraint Solving)
                                   │
                                   └─▶ TAST構築
                                          │
                                          ├─▶ Typar (型パラメータ)
                                          │     ├─ TyparKind
                                          │     ├─ TyparRigidity
                                          │     └─ TyparFlags
                                          │
                                          ├─▶ TType (型)
                                          │
                                          ├─▶ Val (値)
                                          │     ├─ ValInline
                                          │     ├─ ValMutability
                                          │     └─ ValFlags
                                          │
                                          ├─▶ Expr (式)
                                          │
                                          └─▶ Entity (型定義)
                                                  │
                                                  ▼
                                          最適化 / コード生成 / サービスAPI
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TypedTree.fs | `src/Compiler/TypedTree/TypedTree.fs` | ソース | TAST型定義 |
| TypedTreeBasics.fs | `src/Compiler/TypedTree/TypedTreeBasics.fs` | ソース | 基本操作 |
| TypedTreeOps.fs | `src/Compiler/TypedTree/TypedTreeOps.fs` | ソース | TAST操作ユーティリティ |
| TcGlobals.fs | `src/Compiler/TypedTree/TcGlobals.fs` | ソース | グローバル型情報 |
| CheckExpressions.fs | `src/Compiler/Checking/CheckExpressions.fs` | ソース | 型検査（TAST構築元） |
