Skip to content
35 changes: 32 additions & 3 deletions crates/oxc_ast/src/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ impl ESTree for FormalParametersConverter<'_, '_> {
fn serialize<S: Serializer>(&self, serializer: S) {
let mut seq = serializer.serialize_sequence();
for item in &self.0.items {
seq.serialize_element(item);
seq.serialize_element(&FormalParameterItem(item));
}

if let Some(rest) = &self.0.rest {
Expand Down Expand Up @@ -634,6 +634,35 @@ impl ESTree for FormalParametersRest<'_, '_> {
}
}

struct FormalParameterItem<'a, 'b>(&'b FormalParameter<'a>);

impl ESTree for FormalParameterItem<'_, '_> {
fn serialize<S: Serializer>(&self, serializer: S) {
let param = self.0;

if S::INCLUDE_TS_FIELDS && (param.accessibility.is_some() || param.readonly) {
let mut state = serializer.serialize_struct();
state.serialize_field("type", &JsonSafeString("TSParameterProperty"));
state.serialize_field("start", &param.span.start);
state.serialize_field("end", &param.span.end);
if let Some(accessibility) = &param.accessibility {
state.serialize_field("accessibility", accessibility);
} else {
state.serialize_field("accessibility", &Null(()));
}
state.serialize_field("decorators", &param.decorators);
state.serialize_field("override", &param.r#override);
state.serialize_field("parameter", &param.pattern);
state.serialize_field("readonly", &param.readonly);
state.serialize_field("static", &False(()));
state.end();
return;
}

param.serialize(serializer);
}
}

/// Serializer for `params` field of `Function`.
///
/// In TS-ESTree, this adds `this_param` to start of the `params` array.
Expand Down Expand Up @@ -662,7 +691,7 @@ impl ESTree for FunctionFormalParameters<'_, '_> {
}

for item in &self.0.params.items {
seq.serialize_element(item);
seq.serialize_element(&FormalParameterItem(item));
}

if let Some(rest) = &self.0.params.rest {
Expand Down Expand Up @@ -1196,7 +1225,7 @@ fn serialize_formal_params_with_this_param<'a, S: Serializer>(
}

for item in &params.items {
seq.serialize_element(item);
seq.serialize_element(&FormalParameterItem(item));
}

if let Some(rest) = &params.rest {
Expand Down
Loading
Loading