refactor(joinir): centralize balanced depth-scan policy decision

This commit is contained in:
nyash-codex
2025-12-17 22:59:27 +09:00
parent 6036627920
commit 10a2f3b48b
4 changed files with 39 additions and 15 deletions

View File

@ -11,24 +11,13 @@ pub(crate) struct ApplyPolicyStepBox;
impl ApplyPolicyStepBox { impl ApplyPolicyStepBox {
pub(crate) fn apply(condition: &ASTNode, body: &[ASTNode], facts: Pattern2Facts) -> Result<Pattern2Inputs, String> { pub(crate) fn apply(condition: &ASTNode, body: &[ASTNode], facts: Pattern2Facts) -> Result<Pattern2Inputs, String> {
use super::super::policies::balanced_depth_scan_policy; use super::super::policies::balanced_depth_scan_policy_box::BalancedDepthScanPolicyBox;
use super::super::policies::PolicyDecision; use super::super::policies::PolicyDecision;
use crate::mir::join_ir::lowering::common::body_local_slot::ReadOnlyBodyLocalSlotBox; use crate::mir::join_ir::lowering::common::body_local_slot::ReadOnlyBodyLocalSlotBox;
// Phase 107: balanced depth-scan (return-in-loop) policy. // Phase 107: balanced depth-scan (return-in-loop) policy.
// This route provides its own break-cond + derived recipe + post-loop early return plan. // This route provides its own break-cond + derived recipe + post-loop early return plan.
let decision = balanced_depth_scan_policy::classify_balanced_depth_scan_array_end(condition, body); match BalancedDepthScanPolicyBox::decide(condition, body) {
if crate::config::env::joinir_dev_enabled() {
use crate::mir::builder::control_flow::joinir::trace;
let summary = match &decision {
PolicyDecision::Use(_) => "Use".to_string(),
PolicyDecision::Reject(reason) => format!("Reject: {}", reason),
PolicyDecision::None => "None".to_string(),
};
trace::trace().dev("phase107/balanced_depth_scan_policy", &summary);
}
match decision {
PolicyDecision::Use(result) => { PolicyDecision::Use(result) => {
return Ok(Pattern2Inputs { return Ok(Pattern2Inputs {
loop_var_name: facts.loop_var_name, loop_var_name: facts.loop_var_name,

View File

@ -0,0 +1,34 @@
//! BalancedDepthScanPolicyBox (Phase 107)
//!
//! Responsibility:
//! - Provide a single SSOT entry point for the balanced depth-scan policy decision
//! so callers (routing/apply) don't duplicate Use/Reject/None handling.
use crate::ast::ASTNode;
use super::balanced_depth_scan_policy::{classify_balanced_depth_scan_array_end, BalancedDepthScanPolicyResult};
use super::PolicyDecision;
pub(crate) struct BalancedDepthScanPolicyBox;
impl BalancedDepthScanPolicyBox {
pub(crate) fn decide(
condition: &ASTNode,
body: &[ASTNode],
) -> PolicyDecision<BalancedDepthScanPolicyResult> {
let decision = classify_balanced_depth_scan_array_end(condition, body);
if crate::config::env::joinir_dev_enabled() {
use crate::mir::builder::control_flow::joinir::trace;
let summary = match &decision {
PolicyDecision::Use(_) => "Use".to_string(),
PolicyDecision::Reject(reason) => format!("Reject: {}", reason),
PolicyDecision::None => "None".to_string(),
};
trace::trace().dev("phase107/balanced_depth_scan_policy", &summary);
}
decision
}
}

View File

@ -34,3 +34,4 @@ pub(in crate::mir::builder) mod p5b_escape_derived_policy;
pub(in crate::mir::builder) mod trim_policy; pub(in crate::mir::builder) mod trim_policy;
pub(in crate::mir::builder) mod loop_true_read_digits_policy; pub(in crate::mir::builder) mod loop_true_read_digits_policy;
pub(in crate::mir::builder) mod balanced_depth_scan_policy; pub(in crate::mir::builder) mod balanced_depth_scan_policy;
pub(in crate::mir::builder) mod balanced_depth_scan_policy_box;

View File

@ -17,14 +17,14 @@ pub(in crate::mir::builder) fn choose_pattern_kind(
body: &[ASTNode], body: &[ASTNode],
) -> crate::mir::loop_pattern_detection::LoopPatternKind { ) -> crate::mir::loop_pattern_detection::LoopPatternKind {
use crate::mir::builder::control_flow::joinir::patterns::ast_feature_extractor as ast_features; use crate::mir::builder::control_flow::joinir::patterns::ast_feature_extractor as ast_features;
use crate::mir::builder::control_flow::joinir::patterns::policies::balanced_depth_scan_policy::classify_balanced_depth_scan_array_end; use crate::mir::builder::control_flow::joinir::patterns::policies::balanced_depth_scan_policy_box::BalancedDepthScanPolicyBox;
use crate::mir::builder::control_flow::joinir::patterns::policies::PolicyDecision; use crate::mir::builder::control_flow::joinir::patterns::policies::PolicyDecision;
use crate::mir::loop_pattern_detection; use crate::mir::loop_pattern_detection;
// Phase 107: Route balanced depth-scan (return-in-loop) to Pattern2 via policy. // Phase 107: Route balanced depth-scan (return-in-loop) to Pattern2 via policy.
// //
// This keeps Pattern routing structural: no by-name dispatch, no silent fallback. // This keeps Pattern routing structural: no by-name dispatch, no silent fallback.
match classify_balanced_depth_scan_array_end(condition, body) { match BalancedDepthScanPolicyBox::decide(condition, body) {
PolicyDecision::Use(_) => { PolicyDecision::Use(_) => {
return loop_pattern_detection::LoopPatternKind::Pattern2Break; return loop_pattern_detection::LoopPatternKind::Pattern2Break;
} }