refactor(mir): Phase 139-P3-B - RoutingDecision を enum 対応 + レガシー削除

- RoutingDecision の missing_caps を Vec<CapabilityTag> に変更(型安全化)
- error_tags は to_tag() メソッドで自動生成
- 全 callsite を enum variant に修正
- capability_tags モジュール(文字列定数群)を完全削除
- 全テスト PASS(型安全性向上を確認)
- フォーマット適用
This commit is contained in:
nyash-codex
2025-12-16 07:02:14 +09:00
parent 146f14a019
commit e404746612
106 changed files with 1475 additions and 1017 deletions

View File

@ -441,11 +441,7 @@ mod tests {
let result = DigitPosDetector::detect(&condition, &loop_body, "p");
assert!(
result.is_some(),
"Expected detection for operator {:?}",
op
);
assert!(result.is_some(), "Expected detection for operator {:?}", op);
}
}

View File

@ -56,9 +56,7 @@ pub(super) fn body_matches(a: &[ASTNode], b: &[ASTNode]) -> bool {
/// Collect local variable declarations from statements
///
/// Returns Vec<(name, init_expr)> for each variable declared with `local`.
pub(super) fn collect_local_declarations(
stmts: &[ASTNode],
) -> Vec<(String, Option<Box<ASTNode>>)> {
pub(super) fn collect_local_declarations(stmts: &[ASTNode]) -> Vec<(String, Option<Box<ASTNode>>)> {
let mut locals = Vec::new();
for stmt in stmts {

View File

@ -80,8 +80,9 @@ impl TrimPatternInfo {
/// - JoinInlineBoundary will handle the boundary mapping
pub fn to_carrier_info(
&self,
#[cfg(feature = "normalized_dev")]
binding_map: Option<&std::collections::BTreeMap<String, crate::mir::BindingId>>,
#[cfg(feature = "normalized_dev")] binding_map: Option<
&std::collections::BTreeMap<String, crate::mir::BindingId>,
>,
) -> crate::mir::join_ir::lowering::carrier_info::CarrierInfo {
use super::trim_loop_helper::TrimLoopHelper;
use crate::mir::join_ir::lowering::carrier_info::CarrierInfo;
@ -110,11 +111,9 @@ impl TrimPatternInfo {
#[cfg(not(feature = "normalized_dev"))]
let recorder = PromotedBindingRecorder::new();
if let Err(e) = recorder.record_promotion(
&mut carrier_info,
&self.var_name,
&self.carrier_name,
) {
if let Err(e) =
recorder.record_promotion(&mut carrier_info, &self.var_name, &self.carrier_name)
{
log_trim_promotion_error(&e);
}
@ -195,8 +194,7 @@ impl LoopBodyCarrierPromoter {
// 3. 各 LoopBodyLocal に対して TrimDetector で検出を試行
for var_name in &body_locals {
// Phase 79: Use TrimDetector for pure detection logic
if let Some(detection) = TrimDetector::detect(break_cond, request.loop_body, var_name)
{
if let Some(detection) = TrimDetector::detect(break_cond, request.loop_body, var_name) {
if is_joinir_debug() || std::env::var("JOINIR_TEST_DEBUG").is_ok() {
eprintln!(
"[promoter/pattern5] Trim pattern detected! var='{}', literals={:?}",

View File

@ -148,11 +148,8 @@ impl DigitPosPromoter {
}
// Step 3: Use DigitPosDetector for pure detection
let detection = DigitPosDetector::detect(
condition.unwrap(),
req.loop_body,
req.loop_param_name,
);
let detection =
DigitPosDetector::detect(condition.unwrap(), req.loop_body, req.loop_param_name);
if detection.is_none() {
return DigitPosPromotionResult::CannotPromote {
@ -171,16 +168,14 @@ impl DigitPosPromoter {
}
// Step 4: Build CarrierInfo
use crate::mir::join_ir::lowering::carrier_info::{
CarrierInit, CarrierRole, CarrierVar,
};
use crate::mir::join_ir::lowering::carrier_info::{CarrierInit, CarrierRole, CarrierVar};
// Boolean carrier (condition-only, for break)
let promoted_carrier_bool = CarrierVar {
name: detection.bool_carrier_name.clone(),
host_id: ValueId(0), // Placeholder (will be remapped)
join_id: None, // Will be allocated later
role: CarrierRole::ConditionOnly, // Phase 227: DigitPos is condition-only
host_id: ValueId(0), // Placeholder (will be remapped)
join_id: None, // Will be allocated later
role: CarrierRole::ConditionOnly, // Phase 227: DigitPos is condition-only
init: CarrierInit::BoolConst(false), // Phase 228: Initialize with false
#[cfg(feature = "normalized_dev")]
binding_id: None, // Phase 78: Set by CarrierBindingAssigner

View File

@ -116,7 +116,7 @@ fn classify_body(body: &[ASTNode]) -> LoopPatternKind {
carrier_count: carrier_count(body),
break_count: if has_break_flag { 1 } else { 0 },
continue_count: if has_continue_flag { 1 } else { 0 },
is_infinite_loop: false, // テストでは通常ループを想定
is_infinite_loop: false, // テストでは通常ループを想定
update_summary: None,
};
classify(&features)

View File

@ -424,7 +424,11 @@ mod tests {
let result = TrimDetector::detect(&condition, &loop_body, var_name);
assert!(result.is_some(), "Expected detection for var '{}'", var_name);
assert!(
result.is_some(),
"Expected detection for var '{}'",
var_name
);
let result = result.unwrap();
assert_eq!(result.match_var, var_name);
assert_eq!(result.carrier_name, format!("is_{}_match", var_name));