diff --git a/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy.rs b/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy.rs index a5911280..fd444027 100644 --- a/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy.rs +++ b/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy.rs @@ -36,6 +36,13 @@ pub(crate) fn classify_balanced_depth_scan_array_end( classify_balanced_depth_scan(condition, body, "[", "]") } +pub(crate) fn classify_balanced_depth_scan_object_end( + condition: &ASTNode, + body: &[ASTNode], +) -> PolicyDecision { + classify_balanced_depth_scan(condition, body, "{", "}") +} + fn classify_balanced_depth_scan( condition: &ASTNode, body: &[ASTNode], diff --git a/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy_box.rs b/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy_box.rs index c8fc4ee0..1d7accf6 100644 --- a/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy_box.rs +++ b/src/mir/builder/control_flow/joinir/patterns/policies/balanced_depth_scan_policy_box.rs @@ -6,7 +6,10 @@ use crate::ast::ASTNode; -use super::balanced_depth_scan_policy::{classify_balanced_depth_scan_array_end, BalancedDepthScanPolicyResult}; +use super::balanced_depth_scan_policy::{ + classify_balanced_depth_scan_array_end, classify_balanced_depth_scan_object_end, + BalancedDepthScanPolicyResult, +}; use super::PolicyDecision; pub(crate) struct BalancedDepthScanPolicyBox; @@ -16,7 +19,25 @@ impl BalancedDepthScanPolicyBox { condition: &ASTNode, body: &[ASTNode], ) -> PolicyDecision { - let decision = classify_balanced_depth_scan_array_end(condition, body); + // Try known balanced families. Order is SSOT. + // - array: `[` ... `]` + // - object: `{` ... `}` + // + // IMPORTANT: `Reject` means "close-but-unsupported" for that family, not "not this family". + // We only return `Reject` if no other family matches. + let array = classify_balanced_depth_scan_array_end(condition, body); + let decision = match array { + PolicyDecision::Use(_) => array, + PolicyDecision::Reject(_) => { + let object = classify_balanced_depth_scan_object_end(condition, body); + match object { + PolicyDecision::Use(_) => object, + PolicyDecision::Reject(_) => array, + PolicyDecision::None => array, + } + } + PolicyDecision::None => classify_balanced_depth_scan_object_end(condition, body), + }; if crate::config::env::joinir_dev_enabled() { use crate::mir::builder::control_flow::joinir::trace; @@ -31,4 +52,3 @@ impl BalancedDepthScanPolicyBox { decision } } -