From 3c1d8a824dbad83a13d51a6f2e64736130a08690 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Wed, 17 Dec 2025 23:09:19 +0900 Subject: [PATCH] feat(joinir): extend balanced depth-scan policy to object family --- .../policies/balanced_depth_scan_policy.rs | 7 +++++ .../balanced_depth_scan_policy_box.rs | 26 ++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) 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 } } -