Skip to content

Commit d01a47b

Browse files
committed
refactor(ast/estree): simplify custom serializers for FormalParameters (#10964)
Simplify custom serializers for `FormalParameters`, by using `ConcatElement` trait.
1 parent 647b6f3 commit d01a47b

1 file changed

Lines changed: 19 additions & 54 deletions

File tree

crates/oxc_ast/src/serialize.rs

Lines changed: 19 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::ast::*;
66
use oxc_ast_macros::ast_meta;
77
use oxc_estree::{
88
CompactFixesJSSerializer, CompactFixesTSSerializer, CompactJSSerializer, CompactTSSerializer,
9-
Concat2, ESTree, FlatStructSerializer, JsonSafeString, LoneSurrogatesString,
9+
Concat2, ConcatElement, ESTree, FlatStructSerializer, JsonSafeString, LoneSurrogatesString,
1010
PrettyFixesJSSerializer, PrettyFixesTSSerializer, PrettyJSSerializer, PrettyTSSerializer,
1111
SequenceSerializer, Serializer, StructSerializer,
1212
};
@@ -627,15 +627,17 @@ pub struct FormalParametersConverter<'a, 'b>(pub &'b FormalParameters<'a>);
627627
impl ESTree for FormalParametersConverter<'_, '_> {
628628
fn serialize<S: Serializer>(&self, serializer: S) {
629629
let mut seq = serializer.serialize_sequence();
630-
for item in &self.0.items {
631-
seq.serialize_element(item);
632-
}
630+
self.0.push_to_sequence(&mut seq);
631+
seq.end();
632+
}
633+
}
633634

634-
if let Some(rest) = &self.0.rest {
635+
impl ConcatElement for FormalParameters<'_> {
636+
fn push_to_sequence<S: SequenceSerializer>(&self, seq: &mut S) {
637+
self.items.push_to_sequence(seq);
638+
if let Some(rest) = &self.rest {
635639
seq.serialize_element(&FormalParametersRest(rest));
636640
}
637-
638-
seq.end();
639641
}
640642
}
641643

@@ -750,23 +752,12 @@ pub struct FunctionParams<'a, 'b>(pub &'b Function<'a>);
750752

751753
impl ESTree for FunctionParams<'_, '_> {
752754
fn serialize<S: Serializer>(&self, serializer: S) {
753-
let mut seq = serializer.serialize_sequence();
754-
755+
let func = self.0;
755756
if S::INCLUDE_TS_FIELDS {
756-
if let Some(this_param) = &self.0.this_param {
757-
seq.serialize_element(this_param);
758-
}
759-
}
760-
761-
for item in &self.0.params.items {
762-
seq.serialize_element(item);
763-
}
764-
765-
if let Some(rest) = &self.0.params.rest {
766-
seq.serialize_element(&FormalParametersRest(rest));
757+
Concat2(&func.this_param, func.params.as_ref()).serialize(serializer);
758+
} else {
759+
func.params.serialize(serializer);
767760
}
768-
769-
seq.end();
770761
}
771762
}
772763

@@ -1473,8 +1464,8 @@ pub struct TSCallSignatureDeclarationParams<'a, 'b>(pub &'b TSCallSignatureDecla
14731464

14741465
impl ESTree for TSCallSignatureDeclarationParams<'_, '_> {
14751466
fn serialize<S: Serializer>(&self, serializer: S) {
1476-
let v = self.0;
1477-
serialize_formal_params_with_this_param(v.this_param.as_deref(), &v.params, serializer);
1467+
let decl = self.0;
1468+
Concat2(&decl.this_param, decl.params.as_ref()).serialize(serializer);
14781469
}
14791470
}
14801471

@@ -1495,8 +1486,8 @@ pub struct TSMethodSignatureParams<'a, 'b>(pub &'b TSMethodSignature<'a>);
14951486

14961487
impl ESTree for TSMethodSignatureParams<'_, '_> {
14971488
fn serialize<S: Serializer>(&self, serializer: S) {
1498-
let v = self.0;
1499-
serialize_formal_params_with_this_param(v.this_param.as_deref(), &v.params, serializer);
1489+
let sig = self.0;
1490+
Concat2(&sig.this_param, sig.params.as_ref()).serialize(serializer);
15001491
}
15011492
}
15021493

@@ -1517,37 +1508,11 @@ pub struct TSFunctionTypeParams<'a, 'b>(pub &'b TSFunctionType<'a>);
15171508

15181509
impl ESTree for TSFunctionTypeParams<'_, '_> {
15191510
fn serialize<S: Serializer>(&self, serializer: S) {
1520-
let v = self.0;
1521-
serialize_formal_params_with_this_param(v.this_param.as_deref(), &v.params, serializer);
1511+
let fn_type = self.0;
1512+
Concat2(&fn_type.this_param, fn_type.params.as_ref()).serialize(serializer);
15221513
}
15231514
}
15241515

1525-
/// Shared serialization logic used by:
1526-
/// - `TSCallSignatureDeclarationParams`
1527-
/// - `TSMethodSignatureParams`
1528-
/// - `TSFunctionTypeParams`
1529-
fn serialize_formal_params_with_this_param<'a, S: Serializer>(
1530-
this_param: Option<&TSThisParameter<'a>>,
1531-
params: &FormalParameters<'a>,
1532-
serializer: S,
1533-
) {
1534-
let mut seq = serializer.serialize_sequence();
1535-
1536-
if let Some(this_param) = this_param {
1537-
seq.serialize_element(this_param);
1538-
}
1539-
1540-
for item in &params.items {
1541-
seq.serialize_element(item);
1542-
}
1543-
1544-
if let Some(rest) = &params.rest {
1545-
seq.serialize_element(&FormalParametersRest(rest));
1546-
}
1547-
1548-
seq.end();
1549-
}
1550-
15511516
// --------------------
15521517
// Comments
15531518
// --------------------

0 commit comments

Comments
 (0)