use oxc_ast::{
NONE,
ast::{
AssignmentTarget, BindingIdentifier, BindingPattern, BindingPatternKind, Expression,
IdentifierReference, SimpleAssignmentTarget,
},
};
use oxc_span::{Atom, SPAN, Span};
use oxc_syntax::{reference::ReferenceFlags, symbol::SymbolId};
use crate::TraverseCtx;
use super::MaybeBoundIdentifier;
#[derive(Debug, Clone)]
pub struct BoundIdentifier<'a> {
pub name: Atom<'a>,
pub symbol_id: SymbolId,
}
impl<'a> BoundIdentifier<'a> {
pub fn new(name: Atom<'a>, symbol_id: SymbolId) -> Self {
Self { name, symbol_id }
}
pub fn from_binding_ident(ident: &BindingIdentifier<'a>) -> Self {
Self { name: ident.name, symbol_id: ident.symbol_id() }
}
pub fn to_maybe_bound_identifier(&self) -> MaybeBoundIdentifier<'a> {
MaybeBoundIdentifier::new(self.name, Some(self.symbol_id))
}
pub fn create_binding_identifier<State>(
&self,
ctx: &TraverseCtx<'a, State>,
) -> BindingIdentifier<'a> {
ctx.ast.binding_identifier_with_symbol_id(SPAN, self.name, self.symbol_id)
}
pub fn create_binding_pattern<State>(
&self,
ctx: &TraverseCtx<'a, State>,
) -> BindingPattern<'a> {
let ident = self.create_binding_identifier(ctx);
let binding_pattern_kind = BindingPatternKind::BindingIdentifier(ctx.alloc(ident));
ctx.ast.binding_pattern(binding_pattern_kind, NONE, false)
}
pub fn create_read_reference<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_read_reference(SPAN, ctx)
}
pub fn create_read_expression<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_read_expression(SPAN, ctx)
}
pub fn create_spanned_read_reference<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_reference(span, ReferenceFlags::Read, ctx)
}
pub fn create_spanned_read_expression<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_expression(span, ReferenceFlags::Read, ctx)
}
pub fn create_write_reference<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_write_reference(SPAN, ctx)
}
pub fn create_write_expression<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_write_expression(SPAN, ctx)
}
pub fn create_write_target<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
self.create_spanned_write_target(SPAN, ctx)
}
pub fn create_write_simple_target<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
self.create_spanned_write_simple_target(SPAN, ctx)
}
pub fn create_spanned_write_reference<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_reference(span, ReferenceFlags::Write, ctx)
}
pub fn create_spanned_write_expression<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_expression(span, ReferenceFlags::Write, ctx)
}
pub fn create_spanned_write_target<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
self.create_spanned_target(span, ReferenceFlags::Write, ctx)
}
pub fn create_spanned_write_simple_target<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
self.create_spanned_simple_target(span, ReferenceFlags::Write, ctx)
}
pub fn create_read_write_reference<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_read_write_reference(SPAN, ctx)
}
pub fn create_read_write_expression<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_read_write_expression(SPAN, ctx)
}
pub fn create_read_write_target<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
self.create_spanned_read_write_target(SPAN, ctx)
}
pub fn create_read_write_simple_target<State>(
&self,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
self.create_spanned_read_write_simple_target(SPAN, ctx)
}
pub fn create_spanned_read_write_reference<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_reference(span, ReferenceFlags::Read | ReferenceFlags::Write, ctx)
}
pub fn create_spanned_read_write_expression<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_expression(span, ReferenceFlags::Read | ReferenceFlags::Write, ctx)
}
pub fn create_spanned_read_write_target<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
self.create_spanned_target(span, ReferenceFlags::Read | ReferenceFlags::Write, ctx)
}
pub fn create_spanned_read_write_simple_target<State>(
&self,
span: Span,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
self.create_spanned_simple_target(span, ReferenceFlags::Read | ReferenceFlags::Write, ctx)
}
pub fn create_reference<State>(
&self,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
self.create_spanned_reference(SPAN, flags, ctx)
}
pub fn create_expression<State>(
&self,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
self.create_spanned_expression(SPAN, flags, ctx)
}
pub fn create_target<State>(
&self,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
self.create_spanned_target(SPAN, flags, ctx)
}
pub fn create_simple_target<State>(
&self,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
self.create_spanned_simple_target(SPAN, flags, ctx)
}
pub fn create_spanned_reference<State>(
&self,
span: Span,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> IdentifierReference<'a> {
ctx.create_bound_ident_reference(span, self.name, self.symbol_id, flags)
}
pub fn create_spanned_expression<State>(
&self,
span: Span,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> Expression<'a> {
let ident = self.create_spanned_reference(span, flags, ctx);
Expression::Identifier(ctx.alloc(ident))
}
pub fn create_spanned_target<State>(
&self,
span: Span,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> AssignmentTarget<'a> {
let ident = self.create_spanned_reference(span, flags, ctx);
AssignmentTarget::AssignmentTargetIdentifier(ctx.alloc(ident))
}
pub fn create_spanned_simple_target<State>(
&self,
span: Span,
flags: ReferenceFlags,
ctx: &mut TraverseCtx<'a, State>,
) -> SimpleAssignmentTarget<'a> {
let ident = self.create_spanned_reference(span, flags, ctx);
SimpleAssignmentTarget::AssignmentTargetIdentifier(ctx.alloc(ident))
}
}