From 0193c95412055c3636c3346bba9a09b8cd7d3908 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 10 Feb 2025 19:00:10 +0900 Subject: [PATCH] Revert "chore: revert AssignmentTargetPropertyIdentifier" This reverts commit a65ad4913329f2b8304d47c93c3ca7dd343214c6. --- crates/oxc_ast/src/ast/js.rs | 9 +++++- crates/oxc_ast/src/generated/derive_estree.rs | 18 ++++++----- crates/oxc_ast/src/serialize.rs | 30 +++++++++++++++++++ npm/oxc-types/types.d.ts | 10 +++++-- tasks/ast_tools/src/derives/estree.rs | 10 +++---- 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/crates/oxc_ast/src/ast/js.rs b/crates/oxc_ast/src/ast/js.rs index 9dd57824738056..b766f2daee9fef 100644 --- a/crates/oxc_ast/src/ast/js.rs +++ b/crates/oxc_ast/src/ast/js.rs @@ -882,9 +882,16 @@ pub enum AssignmentTargetProperty<'a> { #[ast(visit)] #[derive(Debug)] #[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ESTree)] +#[estree( + rename = "Property", + add_fields(kind = "\"init\"", method = false, shorthand = true, computed = false), + add_ts = "kind: \"init\"; method: false; shorthand: false; computed: false" +)] pub struct AssignmentTargetPropertyIdentifier<'a> { pub span: Span, + #[estree(rename = "key")] pub binding: IdentifierReference<'a>, + #[estree(rename = "value", via = crate::serialize::AssignmentTargetPropertyIdentifierValue(self), ts_type = "IdentifierReference | AssignmentTargetWithDefault")] pub init: Option>, } @@ -2222,7 +2229,7 @@ pub struct ImportExpression<'a> { pub struct ImportDeclaration<'a> { pub span: Span, /// `None` for `import 'foo'`, `Some([])` for `import {} from 'foo'` - #[estree(via = crate::serialize::OptionVecDefault, ts_type = "Array")] + #[estree(via = crate::serialize::OptionVecDefault(&self.specifiers), ts_type = "Array")] pub specifiers: Option>>, pub source: StringLiteral<'a>, pub phase: Option, diff --git a/crates/oxc_ast/src/generated/derive_estree.rs b/crates/oxc_ast/src/generated/derive_estree.rs index 4dabd3bd14716f..2bbb771e16a62e 100644 --- a/crates/oxc_ast/src/generated/derive_estree.rs +++ b/crates/oxc_ast/src/generated/derive_estree.rs @@ -707,11 +707,18 @@ impl Serialize for AssignmentTargetProperty<'_> { impl Serialize for AssignmentTargetPropertyIdentifier<'_> { fn serialize(&self, serializer: S) -> Result { let mut map = serializer.serialize_map(None)?; - map.serialize_entry("type", "AssignmentTargetPropertyIdentifier")?; + map.serialize_entry("type", "Property")?; map.serialize_entry("start", &self.span.start)?; map.serialize_entry("end", &self.span.end)?; - map.serialize_entry("binding", &self.binding)?; - map.serialize_entry("init", &self.init)?; + map.serialize_entry("key", &self.binding)?; + map.serialize_entry( + "value", + &crate::serialize::AssignmentTargetPropertyIdentifierValue(self), + )?; + map.serialize_entry("kind", &"init")?; + map.serialize_entry("method", &false)?; + map.serialize_entry("shorthand", &true)?; + map.serialize_entry("computed", &false)?; map.end() } } @@ -1678,10 +1685,7 @@ impl Serialize for ImportDeclaration<'_> { map.serialize_entry("type", "ImportDeclaration")?; map.serialize_entry("start", &self.span.start)?; map.serialize_entry("end", &self.span.end)?; - map.serialize_entry( - "specifiers", - &crate::serialize::OptionVecDefault::from(&self.specifiers), - )?; + map.serialize_entry("specifiers", &crate::serialize::OptionVecDefault(&self.specifiers))?; map.serialize_entry("source", &self.source)?; map.serialize_entry("phase", &self.phase)?; map.serialize_entry("withClause", &self.with_clause)?; diff --git a/crates/oxc_ast/src/serialize.rs b/crates/oxc_ast/src/serialize.rs index 8c7946b0a8bf7d..c283f731508a8d 100644 --- a/crates/oxc_ast/src/serialize.rs +++ b/crates/oxc_ast/src/serialize.rs @@ -298,3 +298,33 @@ impl Serialize for JSXMemberExpressionObject<'_> { } } } + +pub struct AssignmentTargetPropertyIdentifierValue<'a>( + pub &'a AssignmentTargetPropertyIdentifier<'a>, +); + +impl Serialize for AssignmentTargetPropertyIdentifierValue<'_> { + fn serialize(&self, serializer: S) -> Result { + if let Some(init) = &self.0.init { + AssignmentTargetPropertyIdentifierValueAssignmentPattern { + span: self.0.span, + left: &self.0.binding, + right: init, + } + .serialize(serializer) + } else { + self.0.binding.serialize(serializer) + } + } +} + +/// wrapper to serialize same as `AssignmentTargetWithDefault` +/// but without extra enum/Box for `AssignmentTargetWithDefault.binding` +#[derive(Serialize)] +#[serde(tag = "type", rename = "AssignmentPattern")] +pub struct AssignmentTargetPropertyIdentifierValueAssignmentPattern<'a> { + #[serde(flatten)] + pub span: Span, + pub left: &'a IdentifierReference<'a>, + pub right: &'a Expression<'a>, +} diff --git a/npm/oxc-types/types.d.ts b/npm/oxc-types/types.d.ts index a74a868a0bc7e5..4d7fc3930c3008 100644 --- a/npm/oxc-types/types.d.ts +++ b/npm/oxc-types/types.d.ts @@ -269,9 +269,13 @@ export interface AssignmentTargetWithDefault extends Span { export type AssignmentTargetProperty = AssignmentTargetPropertyIdentifier | AssignmentTargetPropertyProperty; export interface AssignmentTargetPropertyIdentifier extends Span { - type: 'AssignmentTargetPropertyIdentifier'; - binding: IdentifierReference; - init: Expression | null; + type: 'Property'; + key: IdentifierReference; + value: IdentifierReference | AssignmentTargetWithDefault; + kind: 'init'; + method: false; + shorthand: false; + computed: false; } export interface AssignmentTargetPropertyProperty extends Span { diff --git a/tasks/ast_tools/src/derives/estree.rs b/tasks/ast_tools/src/derives/estree.rs index 3b51676a0e6476..e73e3b53e65484 100644 --- a/tasks/ast_tools/src/derives/estree.rs +++ b/tasks/ast_tools/src/derives/estree.rs @@ -4,7 +4,7 @@ use std::borrow::Cow; use proc_macro2::TokenStream; use quote::quote; -use syn::{parse_str, Type}; +use syn::{parse_str, Expr}; use crate::{ schema::{Def, EnumDef, FieldDef, Schema, StructDef, TypeDef, VariantDef, Visibility}, @@ -186,9 +186,9 @@ fn parse_estree_attr(location: AttrLocation, part: AttrPart) -> Result<()> { /// Generate body of `serialize` method for a struct. fn generate_body_for_struct(struct_def: &StructDef, schema: &Schema) -> TokenStream { if let Some(via_str) = struct_def.estree.via.as_deref() { - let via_ty = parse_str::(via_str).unwrap(); + let via_expr = parse_str::(via_str).unwrap(); return quote! { - #via_ty::from(self).serialize(serializer) + #via_expr.serialize(serializer) }; } @@ -297,8 +297,8 @@ impl<'s> StructSerializerGenerator<'s> { let mut value = quote!( #self_path.#field_name_ident ); if let Some(via_str) = field.estree.via.as_deref() { - let via_ty = parse_str::(via_str).unwrap(); - value = quote!( #via_ty::from(&#value) ); + let via_expr = parse_str::(via_str).unwrap(); + value = quote!( #via_expr ); } else if let Some(append_field_index) = field.estree.append_field_index { let append_from_ident = struct_def.fields[append_field_index].ident(); value = quote! {