#![allow(clippy::unused_trait_names)]
use alloc::{collections::BTreeSet, string::ToString};
use crate::{
ast::ExprRef,
compiler::destructuring_planner::{
create_destructuring_plan, destructuring::create_destructuring_plan_with_tracking,
utils::validate_pattern_bindings, BindingPlan, BindingPlannerError, Result, ScopingMode,
VariableBindingContext,
},
};
pub fn create_loop_index_binding_plan<T: VariableBindingContext>(
index_expr: &ExprRef,
context: &T,
) -> Result<BindingPlan> {
let destructuring_plan =
create_destructuring_plan(index_expr, context, ScopingMode::RespectParent).ok_or_else(
|| BindingPlannerError::FailedToCreateDestructuringPlan {
plan_type: "loop index".to_string(),
span: index_expr.span().clone(),
},
)?;
Ok(BindingPlan::LoopIndex {
index_expr: index_expr.clone(),
destructuring_plan,
})
}
pub fn create_parameter_binding_plan<T: VariableBindingContext>(
param_expr: &ExprRef,
context: &T,
scoping: ScopingMode,
) -> Result<BindingPlan> {
let mut newly_bound = BTreeSet::new();
let destructuring_plan =
create_destructuring_plan_with_tracking(param_expr, context, scoping, &mut newly_bound)
.ok_or_else(|| BindingPlannerError::FailedToCreateDestructuringPlan {
plan_type: "parameter".to_string(),
span: param_expr.span().clone(),
})?;
if scoping == ScopingMode::AllowShadowing {
validate_pattern_bindings(param_expr, &newly_bound, context)?;
}
Ok(BindingPlan::Parameter {
param_expr: param_expr.clone(),
destructuring_plan,
})
}