diff --git a/crates/oxc_ast/src/ast/js.rs b/crates/oxc_ast/src/ast/js.rs index f9f2ff775..74ba9d34a 100644 --- a/crates/oxc_ast/src/ast/js.rs +++ b/crates/oxc_ast/src/ast/js.rs @@ -414,6 +414,7 @@ pub struct ThisExpression { pub struct ArrayExpression<'a> { #[serde(flatten)] pub span: Span, + #[tsify(type = "Array")] pub elements: Vec<'a, ArrayExpressionElement<'a>>, /// Array trailing comma /// @@ -423,13 +424,14 @@ pub struct ArrayExpression<'a> { /// Array Expression Element #[derive(Debug, Hash, SerAttrs)] #[cfg_attr(feature = "serde", derive(Serialize))] -#[cfg_attr(feature = "wasm", derive(Tsify))] #[serde(untagged)] pub enum ArrayExpressionElement<'a> { SpreadElement(Box<'a, SpreadElement<'a>>), Expression(Expression<'a>), /// Array hole for sparse arrays /// + // Serialize as `null`. `serialize_elision` in serialize.rs. + #[serde(serialize_with = "ArrayExpressionElement::serialize_elision")] Elision(Span), } diff --git a/crates/oxc_ast/src/serialize.rs b/crates/oxc_ast/src/serialize.rs index dee5970b7..0761763b9 100644 --- a/crates/oxc_ast/src/serialize.rs +++ b/crates/oxc_ast/src/serialize.rs @@ -4,10 +4,10 @@ use serde::{ }; use crate::ast::{ - ArrayAssignmentTarget, ArrayPattern, AssignmentTargetMaybeDefault, AssignmentTargetProperty, - AssignmentTargetRest, BindingPattern, BindingPatternKind, BindingProperty, BindingRestElement, - FormalParameter, FormalParameterKind, FormalParameters, ObjectAssignmentTarget, ObjectPattern, - Program, RegExpFlags, TSTypeAnnotation, + ArrayAssignmentTarget, ArrayExpressionElement, ArrayPattern, AssignmentTargetMaybeDefault, + AssignmentTargetProperty, AssignmentTargetRest, BindingPattern, BindingPatternKind, + BindingProperty, BindingRestElement, FormalParameter, FormalParameterKind, FormalParameters, + ObjectAssignmentTarget, ObjectPattern, Program, RegExpFlags, TSTypeAnnotation, }; use oxc_allocator::{Box, Vec}; use oxc_span::Span; @@ -45,6 +45,17 @@ impl Serialize for RegExpFlags { } } +/// Serialize `ArrayExpressionElement::Elision` variant as `null` in JSON +impl<'a> ArrayExpressionElement<'a> { + #[allow(clippy::trivially_copy_pass_by_ref)] + pub(crate) fn serialize_elision( + _span: &Span, + serializer: S, + ) -> Result { + serializer.serialize_none() + } +} + /// Serialize `ArrayAssignmentTarget`, `ObjectAssignmentTarget`, `ObjectPattern`, `ArrayPattern` /// to be estree compatible, with `elements`/`properties` and `rest` fields combined.