feat(joinir): extend balanced depth-scan policy to object family
This commit is contained in:
@ -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<BalancedDepthScanPolicyResult> {
|
||||
classify_balanced_depth_scan(condition, body, "{", "}")
|
||||
}
|
||||
|
||||
fn classify_balanced_depth_scan(
|
||||
condition: &ASTNode,
|
||||
body: &[ASTNode],
|
||||
|
||||
@ -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<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() {
|
||||
use crate::mir::builder::control_flow::joinir::trace;
|
||||
@ -31,4 +52,3 @@ impl BalancedDepthScanPolicyBox {
|
||||
decision
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user