rolldown_ecmascript_utils 1.2.7

Helper utilities for ECMAScript processing
Documentation
use oxc::allocator::GetAllocator;
use oxc::{
  allocator::{IntoIn as _, TakeIn},
  ast::{
    ast::{
      AssignmentTargetMaybeDefault, AssignmentTargetProperty, AssignmentTargetRest, BindingPattern,
      BindingProperty, IdentifierReference,
    },
    builder::GetAstBuilder,
  },
};

use crate::BindingPatternExt as _;

pub trait BindingPropertyExt<'ast> {
  fn into_assignment_target_property<B: GetAstBuilder<'ast> + GetAllocator<'ast>>(
    self,
    builder: &B,
  ) -> AssignmentTargetProperty<'ast>;
}

impl<'ast> BindingPropertyExt<'ast> for BindingProperty<'ast> {
  fn into_assignment_target_property<B: GetAstBuilder<'ast> + GetAllocator<'ast>>(
    self,
    builder: &B,
  ) -> AssignmentTargetProperty<'ast> {
    match self.value {
      BindingPattern::AssignmentPattern(assign_pat) => {
        let assign_pat = assign_pat.unbox();
        if self.shorthand {
          let binding_id = assign_pat.left.get_binding_identifier().unwrap();
          AssignmentTargetProperty::new_assignment_target_property_identifier(
            self.span,
            IdentifierReference::new(binding_id.span, binding_id.name, builder),
            Some(assign_pat.right),
            builder,
          )
        } else {
          AssignmentTargetProperty::new_assignment_target_property_property(
            self.span,
            self.key,
            AssignmentTargetMaybeDefault::new_assignment_target_with_default(
              assign_pat.span,
              assign_pat.left.into_assignment_target(builder),
              assign_pat.right,
              builder,
            ),
            self.computed,
            builder,
          )
          .into_in(builder.allocator())
        }
      }
      BindingPattern::BindingIdentifier(ref id) => {
        if self.shorthand {
          AssignmentTargetProperty::new_assignment_target_property_identifier(
            self.span,
            IdentifierReference::new(id.span, id.name, builder),
            None,
            builder,
          )
        } else {
          AssignmentTargetProperty::new_assignment_target_property_property(
            self.span,
            self.key,
            AssignmentTargetMaybeDefault::from(self.value.into_assignment_target(builder)),
            self.computed,
            builder,
          )
          .into_in(builder.allocator())
        }
      }
      BindingPattern::ArrayPattern(arr_pat) => {
        let mut arr_pat = arr_pat.unbox();
        let rest = arr_pat.rest.take().map(|rest| {
          AssignmentTargetRest::boxed(
            rest.span,
            rest.unbox().argument.into_assignment_target(builder),
            builder,
          )
        });
        let mut elements = oxc::allocator::Vec::with_capacity_in(arr_pat.elements.len(), builder);
        arr_pat.elements.take_in(&builder.allocator()).into_iter().for_each(|element| {
          elements.push(element.map(|binding_pat| {
            AssignmentTargetMaybeDefault::from(binding_pat.into_assignment_target(builder))
          }));
        });
        AssignmentTargetProperty::new_assignment_target_property_property(
          self.span,
          self.key,
          AssignmentTargetMaybeDefault::new_array_assignment_target(
            arr_pat.span,
            elements,
            rest,
            builder,
          ),
          self.computed,
          builder,
        )
        .into_in(builder.allocator())
      }
      BindingPattern::ObjectPattern(obj_pat) => {
        let mut obj_pat = obj_pat.unbox();
        let rest = obj_pat.rest.take().map(|rest| {
          AssignmentTargetRest::boxed(
            rest.span,
            rest.unbox().argument.into_assignment_target(builder),
            builder,
          )
        });
        let mut properties =
          oxc::allocator::Vec::with_capacity_in(obj_pat.properties.len(), builder);
        obj_pat.properties.take_in(&builder.allocator()).into_iter().for_each(|property| {
          properties.push(property.into_assignment_target_property(builder));
        });
        AssignmentTargetProperty::new_assignment_target_property_property(
          self.span,
          self.key,
          AssignmentTargetMaybeDefault::new_object_assignment_target(
            obj_pat.span,
            properties,
            rest,
            builder,
          ),
          self.computed,
          builder,
        )
        .into_in(builder.allocator())
      }
    }
  }
}