use oxc_ast::ast::*;
use oxc_ast_visit::{Visit, walk::walk_call_expression};
use crate::state::PassDirty;
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 DropDiff<'a, 's> {
dirty: &'s mut PassDirty<'a>,
}
impl<'a, 's> DropDiff<'a, 's> {
pub(crate) fn new(dirty: &'s mut PassDirty<'a>) -> Self {
Self { dirty }
}
}
impl<'a> Visit<'a> for DropDiff<'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.dirty.dead_refs.capacity() {
self.dirty.dead_refs.set_bit(idx);
}
}
fn visit_call_expression(&mut self, it: &CallExpression<'a>) {
if as_direct_eval_call(it).is_some() {
self.dirty.eval_dropped = true;
}
walk_call_expression(self, it);
}
}