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

@ -3,6 +3,7 @@ use super::{MirInstruction, ValueId};
use crate::ast::{
ASTNode, AssignStmt, BinaryExpr, CallExpr, FieldAccessExpr, MethodCallExpr, ReturnStmt,
};
use crate::mir::builder::observe::types as type_trace;
impl super::MirBuilder {
// Main expression dispatcher
@ -295,10 +296,20 @@ impl super::MirBuilder {
args: vec![],
effects: super::EffectMask::MUT,
})?;
self.value_origin_newbox
.insert(arr_id, "ArrayBox".to_string());
self.value_origin_newbox.insert(arr_id, "ArrayBox".to_string());
self.value_types
.insert(arr_id, super::MirType::Box("ArrayBox".to_string()));
// TypeRegistry + trace for deterministic debug
self.type_registry
.record_newbox(arr_id, "ArrayBox".to_string());
self.type_registry
.record_type(arr_id, super::MirType::Box("ArrayBox".to_string()));
type_trace::origin("newbox:ArrayLiteral", arr_id, "ArrayBox");
type_trace::ty(
"newbox:ArrayLiteral",
arr_id,
&super::MirType::Box("ArrayBox".to_string()),
);
for e in elements {
let v = self.build_expression_impl(e)?;
self.emit_instruction(MirInstruction::BoxCall {
@ -328,10 +339,19 @@ impl super::MirBuilder {
args: vec![],
effects: super::EffectMask::MUT,
})?;
self.value_origin_newbox
.insert(map_id, "MapBox".to_string());
self.value_origin_newbox.insert(map_id, "MapBox".to_string());
self.value_types
.insert(map_id, super::MirType::Box("MapBox".to_string()));
self.type_registry
.record_newbox(map_id, "MapBox".to_string());
self.type_registry
.record_type(map_id, super::MirType::Box("MapBox".to_string()));
type_trace::origin("newbox:MapLiteral", map_id, "MapBox");
type_trace::ty(
"newbox:MapLiteral",
map_id,
&super::MirType::Box("MapBox".to_string()),
);
for (k, expr) in entries {
// const string key
let k_id = crate::mir::builder::emission::constant::emit_string(self, k);