feat(joinir): extend balanced depth-scan policy to object family

This commit is contained in:
nyash-codex
2025-12-17 23:09:19 +09:00
parent 09dd10349f
commit 3c1d8a824d
2 changed files with 30 additions and 3 deletions

View File

@ -36,6 +36,13 @@ pub(crate) fn classify_balanced_depth_scan_array_end(
classify_balanced_depth_scan(condition, body, "[", "]") classify_balanced_depth_scan(condition, body, "[", "]")
} }
pub(crate) fn classify_balanced_depth_scan_object_end(
condition: &ASTNode,
body: &[ASTNode],
) -> PolicyDecision<BalancedDepthScanPolicyResult> {
classify_balanced_depth_scan(condition, body, "{", "}")
}
fn classify_balanced_depth_scan( fn classify_balanced_depth_scan(
condition: &ASTNode, condition: &ASTNode,
body: &[ASTNode], body: &[ASTNode],

View File

@ -6,7 +6,10 @@
use crate::ast::ASTNode; 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; use super::PolicyDecision;
pub(crate) struct BalancedDepthScanPolicyBox; pub(crate) struct BalancedDepthScanPolicyBox;
@ -16,7 +19,25 @@ impl BalancedDepthScanPolicyBox {
condition: &ASTNode, condition: &ASTNode,
body: &[ASTNode], body: &[ASTNode],
) -> PolicyDecision<BalancedDepthScanPolicyResult> { ) -> PolicyDecision<BalancedDepthScanPolicyResult> {
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() { if crate::config::env::joinir_dev_enabled() {
use crate::mir::builder::control_flow::joinir::trace; use crate::mir::builder::control_flow::joinir::trace;
@ -31,4 +52,3 @@ impl BalancedDepthScanPolicyBox {
decision decision
} }
} }