use oxc_ast::ast::*;
use oxc_ast_visit::{Visit, walk::walk_call_expression};
use crate::state::PassChanges;
pub fn as_direct_eval_call<'a, 'b>(
call: &'b CallExpression<'a>,
) -> Option<&'b IdentifierReference<'a>> {
if call.optional {
return None;
}
let ident = call.callee.get_identifier_reference()?;
(ident.name == "eval").then_some(ident)
}
pub struct DroppedSubtreeCollector<'a, 's> {
pass_changes: &'s mut PassChanges<'a>,
}
impl<'a, 's> DroppedSubtreeCollector<'a, 's> {
pub(crate) fn new(pass_changes: &'s mut PassChanges<'a>) -> Self {
Self { pass_changes }
}
}
impl<'a> Visit<'a> for DroppedSubtreeCollector<'a, '_> {
fn visit_identifier_reference(&mut self, it: &IdentifierReference<'a>) {
let Some(reference_id) = it.reference_id.get() else { return };
let idx = reference_id.index();
if idx < self.pass_changes.removed_references.capacity() {
self.pass_changes.removed_references.set_bit(idx);
}
}
fn visit_call_expression(&mut self, it: &CallExpression<'a>) {
if as_direct_eval_call(it).is_some() {
self.pass_changes.direct_eval_dropped = true;
}
walk_call_expression(self, it);
}
}