feat(naming): Phase 25.4-A - NamingBox SSOT化完了

🎯 目的: static/global 呼び出しの名前決定を src/mir/naming.rs に一本化

 実装完了:
- NamingBox(src/mir/naming.rs)実装
  - encode_static_method(box, method, arity)
  - normalize_static_global_name(func_name)
  - static/global 名前の正規化ロジック統一

- MIR Builder統合(SSOT使用)
  - src/mir/builder/decls.rs: build_static_main_box
  - src/mir/builder/exprs.rs: 静的メソッド呼び出し
  - src/mir/builder/metadata/propagate.rs: メタデータ伝播
  - src/mir/builder/observe/mod.rs: Observe機能
  - src/mir/builder/observe/types.rs: 型観測(新規)

- VM実行器統合(SSOT使用)
  - src/backend/mir_interpreter/handlers/calls/global.rs
  - normalize_static_global_name使用
  - レガシーフォールバック削除済み確認

- テスト追加
  - src/tests/mir_static_box_naming.rs
  - encode/normalize の動作検証

📚 ドキュメント:
- docs/development/architecture/mir-naming-box.md
  - NamingBoxの設計思想
  - SSOT原則の説明
  - 使用例

🎯 効果:
- 名前決定ロジックが1箇所に集約
- Builder/VM で同じ正規化ルールを使用
- 将来の名前空間拡張が容易

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-21 09:01:43 +09:00
parent 380a724b9c
commit 28a312ea0d
11 changed files with 274 additions and 10 deletions

View File

@ -6,11 +6,17 @@ impl MirInterpreter {
func_name: &str,
args: &[ValueId],
) -> Result<VMValue, VMError> {
// Normalize arity suffix for extern-like dispatch, but keep original name
// NamingBox: static box 名の正規化main._nop/0 → Main._nop/0 など)
let canonical = crate::mir::naming::normalize_static_global_name(func_name);
// Normalize arity suffix for extern-like dispatch, but keep canonical/original name
// for module-local function table lookup (functions may carry arity suffix).
let base = super::super::utils::normalize_arity_suffix(func_name);
// Module-local/global function: execute by function table if present (use original name)
if let Some(func) = self.functions.get(func_name).cloned() {
let base = super::super::utils::normalize_arity_suffix(&canonical);
// Module-local/global function: execute by function table if present.
// まず canonical 名で探すMain._nop/0 など。Phase 25.x 時点では
// レガシー名での再探索は廃止し、NamingBox 側の正規化に一本化する。
if let Some(func) = self.functions.get(&canonical).cloned() {
let mut argv: Vec<VMValue> = Vec::with_capacity(args.len());
for a in args {
argv.push(self.reg_load(*a)?);
@ -136,7 +142,9 @@ impl MirInterpreter {
}
Ok(VMValue::Void)
}
_ => Err(self.err_with_context("global function", &format!("Unknown: {}", func_name))),
_ => Err(
self.err_with_context("global function", &format!("Unknown: {}", func_name)),
),
}
}
}