use oxc_ast::ast::*;
use oxc_span::{GetSpan, GetSpanMut};
use crate::{VisitMut, walk_mut};
use super::Utf8ToUtf16Converter;
impl Utf8ToUtf16Converter<'_> {
pub(crate) fn convert_formal_parameters(&mut self, params: &mut FormalParameters<'_>) {
self.visit_formal_parameter_list(&mut params.items);
if let Some(rest) = &mut params.rest {
self.convert_offset(&mut rest.span.start);
self.visit_decorators(&mut rest.decorators);
self.visit_binding_rest_element(&mut rest.rest);
if let Some(type_annotation) = &mut rest.type_annotation {
self.visit_ts_type_annotation(type_annotation);
}
self.convert_offset(&mut rest.span.end);
}
}
pub(crate) fn convert_object_property(&mut self, prop: &mut ObjectProperty<'_>) {
self.convert_offset(&mut prop.span.start);
match (prop.shorthand, &mut prop.key, &mut prop.value) {
(true, PropertyKey::StaticIdentifier(key), Expression::Identifier(value)) => {
self.visit_identifier_name(key);
value.span = key.span;
}
(_, key, value) => {
self.visit_property_key(key);
self.visit_expression(value);
}
}
self.convert_offset(&mut prop.span.end);
}
pub(crate) fn convert_binding_property(&mut self, prop: &mut BindingProperty<'_>) {
self.convert_offset(&mut prop.span.start);
match (prop.shorthand, &mut prop.key, &mut prop.value) {
(
true,
PropertyKey::StaticIdentifier(key),
BindingPattern::BindingIdentifier(value),
) => {
self.visit_identifier_name(key);
value.span = key.span;
}
(
true,
PropertyKey::StaticIdentifier(key),
BindingPattern::AssignmentPattern(pattern),
) => {
self.visit_assignment_pattern(pattern);
key.span = pattern.left.span();
}
(_, key, value) => {
self.visit_property_key(key);
match value {
BindingPattern::BindingIdentifier(ident) => {
self.visit_binding_identifier(ident);
}
BindingPattern::ObjectPattern(pattern) => self.visit_object_pattern(pattern),
BindingPattern::ArrayPattern(pattern) => self.visit_array_pattern(pattern),
BindingPattern::AssignmentPattern(pattern) => {
self.visit_assignment_pattern(pattern);
}
}
}
}
self.convert_offset(&mut prop.span.end);
}
pub(crate) fn convert_export_declaration(&mut self, decl: &mut ExportDeclaration<'_>) {
if let Declaration::ClassDeclaration(class) = &mut decl.declaration {
self.convert_exported_class(class, &mut decl.span);
} else {
self.convert_offset(&mut decl.span.start);
walk_mut::walk_export_declaration(self, decl);
self.convert_offset(&mut decl.span.end);
}
}
pub(crate) fn convert_export_default_declaration(
&mut self,
decl: &mut ExportDefaultDeclaration<'_>,
) {
if let ExportDefaultDeclarationKind::ClassDeclaration(class) = &mut decl.declaration {
self.convert_exported_class(class, &mut decl.span);
} else {
self.convert_offset(&mut decl.span.start);
walk_mut::walk_export_default_declaration(self, decl);
self.convert_offset(&mut decl.span.end);
}
}
fn convert_exported_class(&mut self, class: &mut Class<'_>, export_decl_span: &mut Span) {
let mut decl_start = export_decl_span.start;
for decorator in &mut class.decorators {
if decorator.span.start > decl_start {
self.convert_offset(&mut export_decl_span.start);
self.convert_offset(&mut class.span.start);
decl_start = u32::MAX;
}
self.visit_decorator(decorator);
}
if decl_start < u32::MAX {
self.convert_offset(&mut export_decl_span.start);
self.convert_offset(&mut class.span.start);
}
if let Some(id) = &mut class.id {
self.visit_binding_identifier(id);
}
if let Some(type_parameters) = &mut class.type_parameters {
self.visit_ts_type_parameter_declaration(type_parameters);
}
if let Some(heritage) = &mut class.heritage {
self.visit_expression(&mut heritage.expression);
if let Some(type_arguments) = &mut heritage.type_arguments {
self.visit_ts_type_parameter_instantiation(type_arguments);
}
}
self.visit_ts_class_implements_list(&mut class.implements);
self.visit_class_body(&mut class.body);
self.convert_offset(&mut class.span.end);
self.convert_offset(&mut export_decl_span.end);
}
pub(crate) fn convert_export_specifier(&mut self, specifier: &mut ExportSpecifier<'_>) {
self.convert_offset(&mut specifier.span.start);
let same_spans = specifier.local.span() == specifier.exported.span();
self.visit_module_export_name(&mut specifier.local);
if same_spans {
*specifier.exported.span_mut() = specifier.local.span();
} else {
self.visit_module_export_name(&mut specifier.exported);
}
self.convert_offset(&mut specifier.span.end);
}
pub(crate) fn convert_import_specifier(&mut self, specifier: &mut ImportSpecifier<'_>) {
self.convert_offset(&mut specifier.span.start);
let same_spans = specifier.imported.span() == specifier.local.span;
self.visit_module_export_name(&mut specifier.imported);
if same_spans {
specifier.local.span = specifier.imported.span();
} else {
self.visit_binding_identifier(&mut specifier.local);
}
self.convert_offset(&mut specifier.span.end);
}
pub(crate) fn convert_template_literal(&mut self, lit: &mut TemplateLiteral<'_>) {
self.convert_offset(&mut lit.span.start);
for (quasi, expression) in lit.quasis.iter_mut().zip(&mut lit.expressions) {
self.visit_template_element(quasi);
self.visit_expression(expression);
}
self.visit_template_element(lit.quasis.last_mut().unwrap());
self.convert_offset(&mut lit.span.end);
}
pub(crate) fn convert_ts_template_literal_type(&mut self, lit: &mut TSTemplateLiteralType<'_>) {
self.convert_offset(&mut lit.span.start);
for (quasi, ts_type) in lit.quasis.iter_mut().zip(&mut lit.types) {
self.visit_template_element(quasi);
self.visit_ts_type(ts_type);
}
self.visit_template_element(lit.quasis.last_mut().unwrap());
self.convert_offset(&mut lit.span.end);
}
pub(crate) fn convert_ts_global_declaration(&mut self, decl: &mut TSGlobalDeclaration<'_>) {
self.convert_offset(&mut decl.span.start);
self.convert_offset(&mut decl.global_span.start);
self.convert_offset(&mut decl.global_span.end);
self.visit_ts_module_block(&mut decl.body);
self.convert_offset(&mut decl.span.end);
}
}