refactor(mir): Remove TypeContext legacy fields (Phase 2-3/7)
完全移行→削除の安全順序(Option C)に従い、TypeContext の deprecated フィールドと sync helpers を完全削除。 ⚠️ 危険ゾーン: TypeFactsBox 等の同名フィールドと混同しないよう、 ファイル単位で手作業移行を実施。 ## Changes - Migrated all MirBuilder access sites to type_ctx.* (manual, 40+ files) - Removed 3 deprecated fields (value_types, value_kinds, value_origin_newbox) - Removed 2 sync helpers (sync_type_ctx_to_legacy, sync_legacy_to_type_ctx) - Verified TypeFactsBox, CalleeGuardBox unchanged (no false positives) ## Tests - cargo test --release --lib: 1029/1033 PASS - TypeFactsBox integration: PASS (borrowed references unchanged) - Deprecation warnings: 456 → 255 (-201, -44%) ## Safety Verification ✅ TypeFactsBox unchanged (still uses &'a BTreeMap borrowed references) ✅ CalleeGuardBox unchanged ✅ CalleeResolverBox unchanged ✅ BoxCompilationContext unchanged Phase 2 Progress: 3/7 contexts complete (43%) - ✅ MetadataContext - ✅ CoreContext - ✅ TypeContext (this commit) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -33,14 +33,14 @@ pub(in super::super) fn annotate_call_result_from_func_name<S: AsRef<str>>(
|
||||
// Normalize to Known Box(JsonParser)
|
||||
ret = MirType::Box("JsonParser".into());
|
||||
}
|
||||
builder.value_types.insert(dst, ret.clone());
|
||||
builder.type_ctx.value_types.insert(dst, ret.clone());
|
||||
if let MirType::Box(bx) = ret {
|
||||
builder.value_origin_newbox.insert(dst, bx);
|
||||
builder.type_ctx.value_origin_newbox.insert(dst, bx);
|
||||
if super::super::utils::builder_debug_enabled()
|
||||
|| std::env::var("NYASH_BUILDER_DEBUG").ok().as_deref() == Some("1")
|
||||
{
|
||||
let bx = builder
|
||||
.value_origin_newbox
|
||||
.type_ctx.value_origin_newbox
|
||||
.get(&dst)
|
||||
.cloned()
|
||||
.unwrap_or_default();
|
||||
@ -56,9 +56,9 @@ pub(in super::super) fn annotate_call_result_from_func_name<S: AsRef<str>>(
|
||||
// 2) No module signature—apply minimal heuristic for known functions
|
||||
if name == "JsonParser.parse/1" {
|
||||
let ret = MirType::Box("JsonNode".into());
|
||||
builder.value_types.insert(dst, ret.clone());
|
||||
builder.type_ctx.value_types.insert(dst, ret.clone());
|
||||
if let MirType::Box(bx) = ret {
|
||||
builder.value_origin_newbox.insert(dst, bx);
|
||||
builder.type_ctx.value_origin_newbox.insert(dst, bx);
|
||||
}
|
||||
if super::super::utils::builder_debug_enabled()
|
||||
|| std::env::var("NYASH_BUILDER_DEBUG").ok().as_deref() == Some("1")
|
||||
@ -70,9 +70,9 @@ pub(in super::super) fn annotate_call_result_from_func_name<S: AsRef<str>>(
|
||||
}
|
||||
} else if name == "JsonParser.current_token/0" {
|
||||
let ret = MirType::Box("JsonToken".into());
|
||||
builder.value_types.insert(dst, ret.clone());
|
||||
builder.type_ctx.value_types.insert(dst, ret.clone());
|
||||
if let MirType::Box(bx) = ret {
|
||||
builder.value_origin_newbox.insert(dst, bx);
|
||||
builder.type_ctx.value_origin_newbox.insert(dst, bx);
|
||||
}
|
||||
if super::super::utils::builder_debug_enabled()
|
||||
|| std::env::var("NYASH_BUILDER_DEBUG").ok().as_deref() == Some("1")
|
||||
@ -85,9 +85,9 @@ pub(in super::super) fn annotate_call_result_from_func_name<S: AsRef<str>>(
|
||||
} else if name == "JsonTokenizer.tokenize/0" {
|
||||
// Tokenize returns an ArrayBox of tokens
|
||||
let ret = MirType::Box("ArrayBox".into());
|
||||
builder.value_types.insert(dst, ret.clone());
|
||||
builder.type_ctx.value_types.insert(dst, ret.clone());
|
||||
if let MirType::Box(bx) = ret {
|
||||
builder.value_origin_newbox.insert(dst, bx);
|
||||
builder.type_ctx.value_origin_newbox.insert(dst, bx);
|
||||
}
|
||||
if super::super::utils::builder_debug_enabled()
|
||||
|| std::env::var("NYASH_BUILDER_DEBUG").ok().as_deref() == Some("1")
|
||||
@ -100,9 +100,9 @@ pub(in super::super) fn annotate_call_result_from_func_name<S: AsRef<str>>(
|
||||
} else if name == "JsonParserModule.create_parser/0" {
|
||||
// Fallback path for parser factory
|
||||
let ret = MirType::Box("JsonParser".into());
|
||||
builder.value_types.insert(dst, ret.clone());
|
||||
builder.type_ctx.value_types.insert(dst, ret.clone());
|
||||
if let MirType::Box(bx) = ret {
|
||||
builder.value_origin_newbox.insert(dst, bx);
|
||||
builder.type_ctx.value_origin_newbox.insert(dst, bx);
|
||||
}
|
||||
if super::super::utils::builder_debug_enabled()
|
||||
|| std::env::var("NYASH_BUILDER_DEBUG").ok().as_deref() == Some("1")
|
||||
|
||||
@ -270,7 +270,7 @@ impl MirBuilder {
|
||||
if let Err(e) = self.emit_constructor_call(math_recv, "MathBox".to_string(), vec![]) {
|
||||
return Some(Err(e));
|
||||
}
|
||||
self.value_origin_newbox
|
||||
self.type_ctx.value_origin_newbox
|
||||
.insert(math_recv, "MathBox".to_string());
|
||||
// birth()
|
||||
if let Err(e) = self.emit_method_call(None, math_recv, "birth".to_string(), vec![]) {
|
||||
@ -567,7 +567,7 @@ impl MirBuilder {
|
||||
"[DEBUG/param-recv] build_method_call receiver '{}' → ValueId({})",
|
||||
name, object_value.0
|
||||
);
|
||||
if let Some(origin) = self.value_origin_newbox.get(&object_value) {
|
||||
if let Some(origin) = self.type_ctx.value_origin_newbox.get(&object_value) {
|
||||
eprintln!("[DEBUG/param-recv] origin: {}", origin);
|
||||
}
|
||||
if let Some(&mapped_id) = self.variable_map.get(name) {
|
||||
|
||||
@ -48,12 +48,12 @@ impl MirBuilder {
|
||||
// BoxCompilationContext mode: clear()で完全独立化
|
||||
if context_active {
|
||||
self.variable_map.clear();
|
||||
self.value_origin_newbox.clear();
|
||||
self.type_ctx.value_origin_newbox.clear();
|
||||
// value_types も static box 単位で独立させる。
|
||||
// これにより、前の static box で使用された ValueId に紐づく型情報が
|
||||
// 次の box にリークして誤った box_name 推論(例: Stage1UsingResolverBox)
|
||||
// を引き起こすことを防ぐ。
|
||||
self.value_types.clear();
|
||||
self.type_ctx.value_types.clear();
|
||||
}
|
||||
|
||||
LoweringContext {
|
||||
@ -203,14 +203,14 @@ impl MirBuilder {
|
||||
'search: for (_bid, bb) in f.blocks.iter() {
|
||||
for inst in bb.instructions.iter() {
|
||||
if let MirInstruction::Return { value: Some(v) } = inst {
|
||||
if let Some(mt) = self.value_types.get(v).cloned() {
|
||||
if let Some(mt) = self.type_ctx.value_types.get(v).cloned() {
|
||||
inferred = Some(mt);
|
||||
break 'search;
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(MirInstruction::Return { value: Some(v) }) = &bb.terminator {
|
||||
if let Some(mt) = self.value_types.get(v).cloned() {
|
||||
if let Some(mt) = self.type_ctx.value_types.get(v).cloned() {
|
||||
inferred = Some(mt);
|
||||
break;
|
||||
}
|
||||
@ -244,9 +244,9 @@ impl MirBuilder {
|
||||
if ctx.context_active {
|
||||
// BoxCompilationContext mode: clear のみ(次回も完全独立)
|
||||
self.variable_map.clear();
|
||||
self.value_origin_newbox.clear();
|
||||
self.type_ctx.value_origin_newbox.clear();
|
||||
// static box ごとに型情報も独立させる(前 box の型メタデータを引きずらない)
|
||||
self.value_types.clear();
|
||||
self.type_ctx.value_types.clear();
|
||||
} else if let Some(saved) = ctx.saved_var_map {
|
||||
// Legacy mode: Main.main 側の variable_map を元に戻す
|
||||
self.variable_map = saved;
|
||||
@ -316,7 +316,7 @@ impl MirBuilder {
|
||||
// me
|
||||
let me_id = f.params[0];
|
||||
self.variable_map.insert("me".to_string(), me_id);
|
||||
self.value_origin_newbox.insert(me_id, box_name.to_string());
|
||||
self.type_ctx.value_origin_newbox.insert(me_id, box_name.to_string());
|
||||
slot_regs.push(("me".to_string(), None));
|
||||
|
||||
// 通常パラメータ
|
||||
@ -449,14 +449,14 @@ impl MirBuilder {
|
||||
'search: for (_bid, bb) in f.blocks.iter() {
|
||||
for inst in bb.instructions.iter() {
|
||||
if let MirInstruction::Return { value: Some(v) } = inst {
|
||||
if let Some(mt) = self.value_types.get(v).cloned() {
|
||||
if let Some(mt) = self.type_ctx.value_types.get(v).cloned() {
|
||||
inferred = Some(mt);
|
||||
break 'search;
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(MirInstruction::Return { value: Some(v) }) = &bb.terminator {
|
||||
if let Some(mt) = self.value_types.get(v).cloned() {
|
||||
if let Some(mt) = self.type_ctx.value_types.get(v).cloned() {
|
||||
inferred = Some(mt);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -78,7 +78,7 @@ impl UnifiedCallEmitterBox {
|
||||
{
|
||||
let recv_cls = box_type
|
||||
.clone()
|
||||
.or_else(|| builder.value_origin_newbox.get(&receiver).cloned())
|
||||
.or_else(|| builder.type_ctx.value_origin_newbox.get(&receiver).cloned())
|
||||
.unwrap_or_default();
|
||||
// Use indexed candidate lookup (tail → names)
|
||||
let candidates: Vec<String> = builder.method_candidates(method, arity_for_try);
|
||||
@ -100,9 +100,9 @@ impl UnifiedCallEmitterBox {
|
||||
{
|
||||
let class_name_opt = box_type
|
||||
.clone()
|
||||
.or_else(|| builder.value_origin_newbox.get(&receiver).cloned())
|
||||
.or_else(|| builder.type_ctx.value_origin_newbox.get(&receiver).cloned())
|
||||
.or_else(|| {
|
||||
builder.value_types.get(&receiver).and_then(|t| {
|
||||
builder.type_ctx.value_types.get(&receiver).and_then(|t| {
|
||||
if let crate::mir::MirType::Box(b) = t {
|
||||
Some(b.clone())
|
||||
} else {
|
||||
@ -152,8 +152,8 @@ impl UnifiedCallEmitterBox {
|
||||
if let CallTarget::Global(ref _n) = target { /* dev trace removed */ }
|
||||
// Fallback: if Global target is unknown, try unique static-method mapping (name/arity)
|
||||
let resolver = super::resolver::CalleeResolverBox::new(
|
||||
&builder.value_origin_newbox,
|
||||
&builder.value_types,
|
||||
&builder.type_ctx.value_origin_newbox,
|
||||
&builder.type_ctx.value_types,
|
||||
Some(&builder.type_registry), // 🎯 TypeRegistry を渡す
|
||||
);
|
||||
let mut callee = match resolver.resolve(target.clone()) {
|
||||
@ -203,12 +203,12 @@ impl UnifiedCallEmitterBox {
|
||||
args: Vec::new(), // Static box singleton, no constructor args
|
||||
})?;
|
||||
// Register type information
|
||||
builder.value_types.insert(
|
||||
builder.type_ctx.value_types.insert(
|
||||
singleton_id,
|
||||
crate::mir::MirType::Box(box_name.to_string()),
|
||||
);
|
||||
builder
|
||||
.value_origin_newbox
|
||||
.type_ctx.value_origin_newbox
|
||||
.insert(singleton_id, box_name.to_string());
|
||||
// Cache for future use
|
||||
builder
|
||||
@ -243,7 +243,7 @@ impl UnifiedCallEmitterBox {
|
||||
// Structural guard FIRST: prevent static compiler boxes from being called with runtime receivers
|
||||
// 箱理論: CalleeGuardBox による構造的分離
|
||||
// (Guard may convert Method → Global, so we check BEFORE materializing receiver)
|
||||
let guard = super::guard::CalleeGuardBox::new(&builder.value_types);
|
||||
let guard = super::guard::CalleeGuardBox::new(&builder.type_ctx.value_types);
|
||||
callee = guard.apply_static_runtime_guard(callee)?;
|
||||
|
||||
// Safety: ensure receiver is materialized ONLY for Method calls
|
||||
@ -277,8 +277,8 @@ impl UnifiedCallEmitterBox {
|
||||
// Validate call arguments
|
||||
// 箱理論: CalleeResolverBox で引数検証
|
||||
let resolver = super::resolver::CalleeResolverBox::new(
|
||||
&builder.value_origin_newbox,
|
||||
&builder.value_types,
|
||||
&builder.type_ctx.value_origin_newbox,
|
||||
&builder.type_ctx.value_types,
|
||||
Some(&builder.type_registry),
|
||||
);
|
||||
resolver.validate_args(&callee, &args)?;
|
||||
@ -296,7 +296,7 @@ impl UnifiedCallEmitterBox {
|
||||
// Try to retrieve origin info for receiver
|
||||
let recv_meta = receiver.and_then(|r| {
|
||||
builder
|
||||
.value_origin_newbox
|
||||
.type_ctx.value_origin_newbox
|
||||
.get(&r)
|
||||
.cloned()
|
||||
.map(|cls| (r, cls))
|
||||
|
||||
Reference in New Issue
Block a user