## Summary Extracted compilation-related fields into dedicated CompilationContext struct, completing all 7 steps of the Context Box refactoring plan. This is the final major context extraction, consolidating 15 compilation-specific fields. ## Changes - NEW: src/mir/builder/compilation_context.rs (435 lines, 15 fields) - Modified: src/mir/builder.rs (added compilation_ctx field + sync helpers) - Updated: phase-136-context-box-progress.md (7/7 complete) - Created: step-7-compilation-context-summary.md (detailed documentation) ## Extracted Fields (15 total) - compilation_context - Box compilation context - current_static_box - Currently compiling static box name - user_defined_boxes - User-defined box registry - reserved_value_ids - Reserved ValueIds (for PHI nodes) - fn_body_ast - Function body AST (for capture analysis) - weak_fields_by_box - Weak field registry - property_getters_by_box - Property getter registry - field_origin_class - Field origin tracking - field_origin_by_box - Class-level origin - static_method_index - Static method index - method_tail_index - Method tail fast lookup - method_tail_index_source_len - Source size snapshot - type_registry - Unified type information - current_slot_registry - Function-scope SlotRegistry - plugin_method_sigs - Plugin method signatures ## Tests - cargo test --release --lib: 1029/1033 passed (4 pre-existing failures) - phase135_trim_mir_verify.sh: PASS - Backward compatibility: 100% maintained (deprecated fields synced) ## Phase 136 Context Extraction: Complete! ✅ Total: 7 contexts, 36 fields extracted, 1086 lines of new modules - ✅ Step 1: TypeContext (3 fields, 130 lines) - ✅ Step 2: CoreContext (5 fields, 112 lines) - ✅ Step 3: ScopeContext (7 fields, 141 lines) - ✅ Step 4: BindingContext (1 field, 63 lines) - ✅ Step 5: VariableContext (1 field, 85 lines) - ✅ Step 6: MetadataContext (4 fields, 120 lines) - ✅ Step 7: CompilationContext (15 fields, 435 lines) ## Next Phase: Legacy Field Removal Phase 2 will remove all 36 deprecated fields from MirBuilder, eliminating 469 deprecation warnings and reducing builder.rs from 1472 → ~800-900 lines (500-600 line reduction). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
13 KiB
13 KiB
Phase 136 Step 7/7: CompilationContext 抽出 - 完了報告
🎉 Status: ✅ COMPLETE
実装日: 2025-12-15
コミット: ceb7baff
📊 実装サマリー
抽出したフィールド (15個)
| フィールド名 | 型 | 説明 |
|---|---|---|
compilation_context |
Option<BoxCompilationContext> |
Box コンパイルコンテキスト(静的 Box 分離) |
current_static_box |
Option<String> |
現在コンパイル中の static box 名 |
user_defined_boxes |
HashSet<String> |
ユーザー定義 Box 名レジストリ |
reserved_value_ids |
HashSet<ValueId> |
予約済み ValueId(PHI 用) |
fn_body_ast |
Option<Vec<ASTNode>> |
関数本体 AST(キャプチャ分析用) |
weak_fields_by_box |
HashMap<String, HashSet<String>> |
Weak フィールドレジストリ |
property_getters_by_box |
HashMap<String, HashMap<String, PropertyKind>> |
Property getter レジストリ |
field_origin_class |
HashMap<(ValueId, String), String> |
フィールド origin 追跡 |
field_origin_by_box |
HashMap<(String, String), String> |
クラスレベル field origin |
static_method_index |
HashMap<String, Vec<(String, usize)>> |
Static method インデックス |
method_tail_index |
HashMap<String, Vec<String>> |
Method tail 高速検索 |
method_tail_index_source_len |
usize |
Source サイズスナップショット |
type_registry |
TypeRegistry |
型情報管理一元化 |
current_slot_registry |
Option<FunctionSlotRegistry> |
関数スコープ SlotRegistry |
plugin_method_sigs |
HashMap<(String, String), MirType> |
Plugin method シグネチャ |
🏗️ 実装詳細
新規ファイル
src/mir/builder/compilation_context.rs (435 行)
構成:
CompilationContextstruct (15 フィールド)- Helper methods (30+ メソッド)
- Comprehensive tests (13 test cases)
主要メソッド:
// User-defined box 管理
pub fn is_user_defined_box(&self, name: &str) -> bool
pub fn register_user_box(&mut self, name: String)
// Reserved ValueId 管理(PHI 用)
pub fn is_reserved_value_id(&self, id: ValueId) -> bool
pub fn reserve_value_id(&mut self, id: ValueId)
pub fn clear_reserved_value_ids(&mut self)
// Static box モード
pub fn enter_static_box(&mut self, name: String)
pub fn exit_static_box(&mut self)
pub fn current_static_box(&self) -> Option<&str>
// Function body AST 管理
pub fn set_fn_body_ast(&mut self, ast: Vec<ASTNode>)
pub fn take_fn_body_ast(&mut self) -> Option<Vec<ASTNode>>
// Weak field registry
pub fn is_weak_field(&self, box_name: &str, field_name: &str) -> bool
pub fn register_weak_field(&mut self, box_name: String, field_name: String)
// Property getter registry
pub fn get_property_kind(&self, box_name: &str, prop_name: &str) -> Option<&PropertyKind>
pub fn register_property_getter(&mut self, box_name: String, prop_name: String, kind: PropertyKind)
// Field origin tracking
pub fn get_field_origin_class(&self, base_id: ValueId, field: &str) -> Option<&str>
pub fn set_field_origin_class(&mut self, base_id: ValueId, field: String, class: String)
// Static method index
pub fn register_static_method(&mut self, method_name: String, box_name: String, arity: usize)
pub fn get_static_method_candidates(&self, method_name: &str) -> Option<&[(String, usize)]>
// Method tail index (高速検索)
pub fn get_method_tail_candidates(&self, tail: &str) -> Option<&[String]>
pub fn maybe_rebuild_method_tail_index(&mut self, current_source_len: usize) -> bool
// Plugin method signatures
pub fn get_plugin_method_sig(&self, box_name: &str, method_name: &str) -> Option<&MirType>
// Slot registry
pub fn set_slot_registry(&mut self, registry: FunctionSlotRegistry)
pub fn take_slot_registry(&mut self) -> Option<FunctionSlotRegistry>
MirBuilder 統合
追加フィールド:
pub(super) comp_ctx: compilation_context::CompilationContext,
初期化 (MirBuilder::new()):
let plugin_method_sigs = plugin_sigs::load_plugin_method_sigs();
let comp_ctx = compilation_context::CompilationContext::with_plugin_sigs(plugin_method_sigs.clone());
Deprecated フィールド (15個):
- 全フィールドに
#[deprecated(note = "Use comp_ctx.* instead")]を追加 - 後方互換性維持のため残存(Phase 2 で削除予定)
✅ テスト結果
Build
✅ cargo build --release
Compiling nyash-rust v0.1.0
Finished `release` profile [optimized] target(s) in 26.00s
469 warnings (deprecated field usage)
Unit Tests
✅ cargo test --release --lib
test result: ok. 1029 passed; 4 failed; 56 ignored
4 failures are pre-existing issues (unrelated to CompilationContext)
Integration Tests
✅ bash tools/smokes/v2/profiles/integration/apps/phase135_trim_mir_verify.sh
[PASS] verify: MIR is valid (SSA/ValueId OK)
📈 影響範囲
ファイル使用状況
- 12 ファイル が comp_ctx フィールドを使用中
- 87 箇所 の使用箇所(全て deprecated フィールド経由)
Deprecation Warnings
- 36 deprecated フィールド in builder.rs
- 469 deprecation warnings 全体(Phase 2 削除で 0 に削減予定)
Builder.rs サイズ
- 現在: 1472 行(+15 deprecated フィールド)
- Phase 2 後: 800-900 行予想(-500-600 行削減)
🎯 CompilationContext の責務
1. Box コンパイル管理
- BoxCompilationContext: Static box コンパイル分離
- current_static_box: 現在の static box 追跡
- user_defined_boxes: ユーザー定義 Box レジストリ
2. PHI 予約管理
- reserved_value_ids: LoopHeaderPhiBuilder が予約した ValueId
- ValueId 衝突を構造的に防止
3. キャプチャ分析
- fn_body_ast: FunctionScopeCaptureAnalyzer が使用
- ラムダ/クロージャのキャプチャ変数推論
4. Method 解決最適化
- static_method_index: Static method 候補検索
- method_tail_index: Method+arity tail 高速検索
- method_tail_index_source_len: Rebuild トリガー
5. Weak 参照管理
- weak_fields_by_box: Weak field レジストリ
- GC safe な weak 参照サポート
6. Property 管理
- property_getters_by_box: computed/once/birth_once
- 統一 member property 種別管理
7. Origin 追跡
- field_origin_class: ValueId レベル origin
- field_origin_by_box: Box レベル origin
- 型推論・最適化支援
8. 型情報管理
- type_registry: TypeRegistryBox(NYASH_USE_TYPE_REGISTRY=1)
- 段階的移行用型情報一元管理
9. Slot レジストリ
- current_slot_registry: 関数スコープ観測
- 既存 variable_map/SSA に影響なし
10. Plugin 統合
- plugin_method_sigs: nyash_box.toml から読み込み
- Plugin method 戻り値型解決
🔍 Phase 136 全体進捗
✅ 完了した Context (7/7)
| Step | Context | フィールド数 | ファイル | 行数 | コミット |
|---|---|---|---|---|---|
| 1 | TypeContext | 3 | type_context.rs | 130 | 076f193f |
| 2 | CoreContext | 5 | core_context.rs | 112 | 81d79161 |
| 3 | ScopeContext | 7 | scope_context.rs | 141 | 3127ebb7 |
| 4 | BindingContext | 1 | binding_context.rs | 63 | 1adf57ec |
| 5 | VariableContext | 1 | variable_context.rs | 85 | ee2915a6 |
| 6 | MetadataContext | 4 | metadata_context.rs | 120 | 903ab8ef |
| 7 | CompilationContext | 15 | compilation_context.rs | 435 | ceb7baff |
| 合計 | 7 Context | 36 | 7 ファイル | 1086 行 | 7 コミット |
📊 Context Box 化の成果
Before Phase 136:
- builder.rs: 1200+ 行(全フィールド + ロジック)
- 責任分離: なし
- テスト容易性: 低い
- 保守性: 低い
After Phase 136 (Step 7/7):
- builder.rs: 1472 行(+deprecated フィールド)
- Context ファイル: 7 ファイル(1086 行)
- 責任分離: ✅ 7 Context に明確分離
- テスト容易性: ✅ 各 Context 独立テスト可能
- 保守性: ✅ 大幅向上
Phase 2 後の予想:
- builder.rs: 800-900 行(-500-600 行削減)
- Deprecation warnings: 469 → 0
- Context Box 化: 完全完了
🚀 Next Phase: Legacy フィールド削除(Phase 2)
タスク概要
-
Deprecated フィールド削除 (builder.rs)
- 36 deprecated フィールドを削除
- 各 Context ごとに段階的削除
-
Sync Helper 削除
sync_*_to_legacy()メソッド削除sync_legacy_to_*()メソッド削除
-
コード移行 (全ファイル)
- TypeContext: 16 ファイル, 113 箇所
- CoreContext: 30+ ファイル
- ScopeContext: vars/, lifecycle.rs, calls/
- BindingContext: vars/
- VariableContext: 17 ファイル
- MetadataContext: builder 内全体
- CompilationContext: 12 ファイル, 87 箇所
-
テスト実行 (各 Context 削除後)
- cargo build --release
- cargo test --release --lib
- phase135_trim_mir_verify.sh
-
コミット (1-2 回に分割)
期待効果
- ✅ Deprecation warnings: 469 → 0
- ✅ builder.rs: 1472 → 800-900 行
- ✅ Context Box 化: 完全完了
- ✅ 保守性: さらに向上
- ✅ テスト容易性: 完全独立化
📚 箱化モジュール化の機会発見
残存フィールド分析
builder.rs の非 Context フィールド (42 個):
pending_phis: PHI 挿入ペンディングloop_header_stack,loop_exit_stack,if_merge_stack: Control flow stack(ScopeContext 候補?)return_defer_*: Return defer 管理cleanup_*: Cleanup block 管理local_ssa_map,schedule_mat_map,pin_slot_names: SSA/Schedule 管理in_unified_boxcall_fallback,recursion_depth: Call 管理root_is_app_mode,static_box_singletons: Root context
さらなる Box 化候補:
- DeferContext (return_defer_, cleanup_)
- SSAContext (local_ssa_map, schedule_mat_map, pin_slot_names)
- CallContext (in_unified_boxcall_fallback, recursion_depth)
大きなファイル(箱化候補)
| ファイル | 行数 | 箱化機会 |
|---|---|---|
| control_flow/joinir/patterns/pattern2_with_break.rs | 1179 | Pattern ロジック共通化? |
| control_flow/joinir/merge/mod.rs | 1084 | Merge strategy 分離? |
| control_flow/joinir/merge/instruction_rewriter.rs | 892 | Rewrite rule Box 化? |
| lifecycle.rs | 753 | Lifecycle phase 分離? |
| ops.rs | 643 | Operation category 分離? |
重複コード調査
Pattern ファイル (4 ファイル, 合計 2400+ 行):
- pattern2_with_break.rs (1179 行)
- pattern4_with_continue.rs (438 行)
- pattern5_infinite_early_exit.rs (524 行)
- trim_loop_lowering.rs (594 行)
共通化機会:
- Exit line 処理(Phase 33 で一部完了)
- Variable mapping ロジック
- PHI 生成ロジック
💡 推奨事項
優先度 1: Phase 2 実施
- Legacy フィールド削除(最優先)
- Deprecation warnings 削減
- Builder.rs サイズ削減
優先度 2: さらなる Context 化
- DeferContext: Return defer + Cleanup 管理
- SSAContext: Local SSA + Schedule 管理
- CallContext: Unified call + Recursion 管理
優先度 3: Pattern ロジック共通化
- Exit line 処理の完全統一
- Variable mapping helper Box 化
- PHI 生成 strategy Box 化
🎓 学んだ教訓
✅ 成功要因
- 段階的移行: 7 ステップに分割し、各ステップで全テスト PASS
- 後方互換性: Deprecated フィールド残存で破壊的変更なし
- Box-First 原則: 各 Context を独立 struct として実装
- テスト駆動: 各ステップで受け入れ基準を明確化
📝 改善点
- 初期設計: 全 Context を先に設計してから実装すればより効率的
- Sync helper: 最終的に削除するので、直接 ctx 移行も検討可能
- 命名規則: ctx 名を統一(type_ctx, core_ctx, scope_ctx...)
🔧 実装パターン確立
// 1. Context struct 定義
pub(crate) struct XxxContext {
pub field1: Type1,
pub field2: Type2,
}
// 2. Helper methods
impl XxxContext {
pub fn new() -> Self { ... }
pub fn helper1(&self) -> ... { ... }
pub fn helper2(&mut self) -> ... { ... }
}
// 3. MirBuilder 統合
pub(super) xxx_ctx: xxx_context::XxxContext,
// 4. Deprecated フィールド
#[deprecated(note = "Use xxx_ctx.field1 instead")]
pub(super) field1: Type1,
// 5. Tests
#[cfg(test)]
mod tests { ... }
📖 参考資料
Phase 136 Step 7/7: ✅ COMPLETE
次のステップ: Phase 2 - Legacy フィールド削除