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:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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={:?}",
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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));
|
||||
|
||||
Reference in New Issue
Block a user