use oxc_ast::ast::Expression;
use oxc_semantic::SymbolFlags;
use oxc_span::SPAN;
use crate::{context::TraverseCtx, utils::ast_builder::create_assignment};
pub fn key_needs_temp_var(key: &Expression, ctx: &TraverseCtx) -> bool {
match key {
Expression::BooleanLiteral(_)
| Expression::NullLiteral(_)
| Expression::NumericLiteral(_)
| Expression::BigIntLiteral(_)
| Expression::RegExpLiteral(_)
| Expression::StringLiteral(_) => false,
Expression::TemplateLiteral(lit) => !lit.expressions.is_empty(),
Expression::Identifier(ident) => {
match ctx.scoping().get_reference(ident.reference_id()).symbol_id() {
Some(symbol_id) => ctx.scoping().symbol_is_mutated(symbol_id),
None => true,
}
}
_ => true,
}
}
pub fn create_computed_key_temp_var<'a>(
key: Expression<'a>,
ctx: &mut TraverseCtx<'a>,
) -> (/* assignment */ Expression<'a>, /* identifier */ Expression<'a>) {
let outer_scope_id = ctx.current_block_scope_id();
let binding =
ctx.generate_uid_based_on_node(&key, outer_scope_id, SymbolFlags::BlockScopedVariable);
ctx.state.var_declarations.insert_let(&binding, None, ctx.ast);
let assignment = create_assignment(&binding, key, SPAN, ctx);
let ident = binding.create_read_expression(ctx);
(assignment, ident)
}