refactor(ast): refactor custom Serialize impls (#3859)

Store `&[T]` instead of `&Vec<'a, T>` in temp structures in custom `Serialize` impls. Slightly cleaner and removes some lifetimes.
This commit is contained in:
overlookmotel 2024-06-24 02:31:59 +00:00
parent 063cfdeb40
commit acf69fa1b6

View file

@ -1,4 +1,4 @@
use oxc_allocator::{Box, Vec}; use oxc_allocator::Box;
use oxc_span::Span; use oxc_span::Span;
use serde::{ use serde::{
ser::{SerializeSeq, Serializer}, ser::{SerializeSeq, Serializer},
@ -80,7 +80,7 @@ struct SerArrayAssignmentTarget<'a, 'b> {
#[serde(flatten)] #[serde(flatten)]
span: Span, span: Span,
elements: elements:
ElementsAndRest<'a, 'b, Option<AssignmentTargetMaybeDefault<'a>>, AssignmentTargetRest<'a>>, ElementsAndRest<'b, Option<AssignmentTargetMaybeDefault<'a>>, AssignmentTargetRest<'a>>,
} }
impl<'a> Serialize for ObjectAssignmentTarget<'a> { impl<'a> Serialize for ObjectAssignmentTarget<'a> {
@ -98,7 +98,7 @@ impl<'a> Serialize for ObjectAssignmentTarget<'a> {
struct SerObjectAssignmentTarget<'a, 'b> { struct SerObjectAssignmentTarget<'a, 'b> {
#[serde(flatten)] #[serde(flatten)]
span: Span, span: Span,
properties: ElementsAndRest<'a, 'b, AssignmentTargetProperty<'a>, AssignmentTargetRest<'a>>, properties: ElementsAndRest<'b, AssignmentTargetProperty<'a>, AssignmentTargetRest<'a>>,
} }
impl<'a> Serialize for ObjectPattern<'a> { impl<'a> Serialize for ObjectPattern<'a> {
@ -116,7 +116,7 @@ impl<'a> Serialize for ObjectPattern<'a> {
struct SerObjectPattern<'a, 'b> { struct SerObjectPattern<'a, 'b> {
#[serde(flatten)] #[serde(flatten)]
span: Span, span: Span,
properties: ElementsAndRest<'a, 'b, BindingProperty<'a>, Box<'a, BindingRestElement<'a>>>, properties: ElementsAndRest<'b, BindingProperty<'a>, Box<'a, BindingRestElement<'a>>>,
} }
impl<'a> Serialize for ArrayPattern<'a> { impl<'a> Serialize for ArrayPattern<'a> {
@ -134,7 +134,7 @@ impl<'a> Serialize for ArrayPattern<'a> {
struct SerArrayPattern<'a, 'b> { struct SerArrayPattern<'a, 'b> {
#[serde(flatten)] #[serde(flatten)]
span: Span, span: Span,
elements: ElementsAndRest<'a, 'b, Option<BindingPattern<'a>>, Box<'a, BindingRestElement<'a>>>, elements: ElementsAndRest<'b, Option<BindingPattern<'a>>, Box<'a, BindingRestElement<'a>>>,
} }
/// Serialize `FormalParameters`, to be estree compatible, with `items` and `rest` fields combined /// Serialize `FormalParameters`, to be estree compatible, with `items` and `rest` fields combined
@ -162,7 +162,7 @@ struct SerFormalParameters<'a, 'b> {
#[serde(flatten)] #[serde(flatten)]
span: Span, span: Span,
kind: FormalParameterKind, kind: FormalParameterKind,
items: ElementsAndRest<'a, 'b, FormalParameter<'a>, SerFormalParameterRest<'a, 'b>>, items: ElementsAndRest<'b, FormalParameter<'a>, SerFormalParameterRest<'a, 'b>>,
} }
#[derive(Serialize)] #[derive(Serialize)]
@ -175,18 +175,18 @@ struct SerFormalParameterRest<'a, 'b> {
optional: bool, optional: bool,
} }
pub struct ElementsAndRest<'a, 'b, E, R> { pub struct ElementsAndRest<'b, E, R> {
elements: &'b Vec<'a, E>, elements: &'b [E],
rest: &'b Option<R>, rest: &'b Option<R>,
} }
impl<'a, 'b, E, R> ElementsAndRest<'a, 'b, E, R> { impl<'b, E, R> ElementsAndRest<'b, E, R> {
pub fn new(elements: &'b Vec<'a, E>, rest: &'b Option<R>) -> Self { pub fn new(elements: &'b [E], rest: &'b Option<R>) -> Self {
Self { elements, rest } Self { elements, rest }
} }
} }
impl<'a, 'b, E: Serialize, R: Serialize> Serialize for ElementsAndRest<'a, 'b, E, R> { impl<'b, E: Serialize, R: Serialize> Serialize for ElementsAndRest<'b, E, R> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
if let Some(rest) = self.rest { if let Some(rest) = self.rest {
let mut seq = serializer.serialize_seq(Some(self.elements.len() + 1))?; let mut seq = serializer.serialize_seq(Some(self.elements.len() + 1))?;