Files
hakorune/docs/development/current/main/phases/phase-136/step-7-compilation-context-summary.md
nyash-codex 905a2b97fe refactor(mir): Extract CompilationContext from MirBuilder (Phase 136 follow-up 7/7)
## 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>
2025-12-15 22:17:38 +09:00

13 KiB
Raw Blame History

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> 予約済み ValueIdPHI 用)
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 行)

構成:

  • CompilationContext struct (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: TypeRegistryBoxNYASH_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

タスク概要

  1. Deprecated フィールド削除 (builder.rs)

    • 36 deprecated フィールドを削除
    • 各 Context ごとに段階的削除
  2. Sync Helper 削除

    • sync_*_to_legacy() メソッド削除
    • sync_legacy_to_*() メソッド削除
  3. コード移行 (全ファイル)

    • TypeContext: 16 ファイル, 113 箇所
    • CoreContext: 30+ ファイル
    • ScopeContext: vars/, lifecycle.rs, calls/
    • BindingContext: vars/
    • VariableContext: 17 ファイル
    • MetadataContext: builder 内全体
    • CompilationContext: 12 ファイル, 87 箇所
  4. テスト実行 (各 Context 削除後)

    • cargo build --release
    • cargo test --release --lib
    • phase135_trim_mir_verify.sh
  5. コミット (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 stackScopeContext 候補?)
  • 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 化候補:

  1. DeferContext (return_defer_, cleanup_)
  2. SSAContext (local_ssa_map, schedule_mat_map, pin_slot_names)
  3. 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 化

🎓 学んだ教訓

成功要因

  1. 段階的移行: 7 ステップに分割し、各ステップで全テスト PASS
  2. 後方互換性: Deprecated フィールド残存で破壊的変更なし
  3. Box-First 原則: 各 Context を独立 struct として実装
  4. テスト駆動: 各ステップで受け入れ基準を明確化

📝 改善点

  1. 初期設計: 全 Context を先に設計してから実装すればより効率的
  2. Sync helper: 最終的に削除するので、直接 ctx 移行も検討可能
  3. 命名規則: 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 フィールド削除