diff --git a/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs b/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs
index 85aaa9ac..50cd7457 100644
--- a/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs
+++ b/src/mir/builder/control_flow/joinir/patterns/pattern2_with_break.rs
@@ -407,7 +407,7 @@ mod tests {
},
];
- let ctx = LoopPatternContext::new(&condition, &body, "parse_number_like", true);
+ let ctx = LoopPatternContext::new(&condition, &body, "parse_number_like", true, false);
let builder = MirBuilder::new();
assert_eq!(ctx.pattern_kind, LoopPatternKind::Pattern2Break);
@@ -452,7 +452,7 @@ mod tests {
},
];
- let ctx = LoopPatternContext::new(&condition, &body, "_atoi", true);
+ let ctx = LoopPatternContext::new(&condition, &body, "_atoi", true, false);
let builder = MirBuilder::new();
// Verify pattern classification
diff --git a/src/mir/builder/control_flow/joinir/patterns/router.rs b/src/mir/builder/control_flow/joinir/patterns/router.rs
index 966df22b..a4f71c02 100644
--- a/src/mir/builder/control_flow/joinir/patterns/router.rs
+++ b/src/mir/builder/control_flow/joinir/patterns/router.rs
@@ -28,6 +28,7 @@ use crate::mir::loop_pattern_detection::{LoopFeatures, LoopPatternKind};
use crate::mir::builder::control_flow::plan::lowerer::PlanLowerer;
use crate::mir::builder::control_flow::plan::normalizer::PlanNormalizer;
use crate::mir::builder::control_flow::plan::verifier::PlanVerifier;
+use crate::mir::builder::control_flow::plan::single_planner;
/// AST Feature Extractor (declared in mod.rs as pub module, import from parent)
use super::ast_feature_extractor as ast_features;
@@ -49,6 +50,9 @@ pub(crate) struct LoopPatternContext<'a> {
/// Debug logging enabled
pub debug: bool,
+ /// In static box context? (affects Pattern8 routing)
+ pub in_static_box: bool,
+
/// Has continue statement(s) in body? (Phase 194+)
#[allow(dead_code)]
pub has_continue: bool,
@@ -93,6 +97,7 @@ impl<'a> LoopPatternContext<'a> {
body: &'a [ASTNode],
func_name: &'a str,
debug: bool,
+ in_static_box: bool,
) -> Self {
// Use AST Feature Extractor for break/continue detection
let has_continue = ast_features::detect_continue_in_body(body);
@@ -110,6 +115,7 @@ impl<'a> LoopPatternContext<'a> {
body,
func_name,
debug,
+ in_static_box,
has_continue,
has_break,
features,
@@ -126,9 +132,10 @@ impl<'a> LoopPatternContext<'a> {
body: &'a [ASTNode],
func_name: &'a str,
debug: bool,
+ in_static_box: bool,
fn_body: &'a [ASTNode],
) -> Self {
- let mut ctx = Self::new(condition, body, func_name, debug);
+ let mut ctx = Self::new(condition, body, func_name, debug, in_static_box);
ctx.fn_body = Some(fn_body);
ctx
}
@@ -159,157 +166,7 @@ fn lower_via_plan(
PlanLowerer::lower(builder, core_plan, ctx)
}
-/// Phase 287: Plan extractor function type for routing table
-///
-/// Extractors have two signatures:
-/// - Simple: (condition, body) - Pattern1/4/9
-/// - WithFnBody: (condition, body, fn_body) - Pattern6/7
-type SimplePlanExtractor = fn(&ASTNode, &[ASTNode]) -> Result