Skip to content

Commit f084e83

Browse files
hi-ogawaoverlookmotel
authored andcommitted
fix(ast): estree compat AssignmentTargetPropertyIdentifier
1 parent dd927a6 commit f084e83

6 files changed

Lines changed: 58 additions & 202 deletions

File tree

crates/oxc_ast/src/ast/js.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,9 +884,16 @@ pub enum AssignmentTargetProperty<'a> {
884884
#[ast(visit)]
885885
#[derive(Debug)]
886886
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
887+
#[estree(
888+
rename = "Property",
889+
add_fields(kind = "\"init\"", method = false, shorthand = true, computed = false),
890+
add_ts = "kind: \"init\"; method: false; shorthand: false; computed: false"
891+
)]
887892
pub struct AssignmentTargetPropertyIdentifier<'a> {
888893
pub span: Span,
894+
#[estree(rename = "key")]
889895
pub binding: IdentifierReference<'a>,
896+
#[estree(rename = "value", via = crate::serialize::AssignmentTargetPropertyIdentifierValue(self), ts_type = "IdentifierReference | AssignmentTargetWithDefault")]
890897
pub init: Option<Expression<'a>>,
891898
}
892899

crates/oxc_ast/src/generated/derive_estree.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -709,11 +709,18 @@ impl Serialize for AssignmentTargetProperty<'_> {
709709
impl Serialize for AssignmentTargetPropertyIdentifier<'_> {
710710
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
711711
let mut map = serializer.serialize_map(None)?;
712-
map.serialize_entry("type", "AssignmentTargetPropertyIdentifier")?;
712+
map.serialize_entry("type", "Property")?;
713713
map.serialize_entry("start", &self.span.start)?;
714714
map.serialize_entry("end", &self.span.end)?;
715-
map.serialize_entry("binding", &self.binding)?;
716-
map.serialize_entry("init", &self.init)?;
715+
map.serialize_entry("key", &self.binding)?;
716+
map.serialize_entry(
717+
"value",
718+
&crate::serialize::AssignmentTargetPropertyIdentifierValue(self),
719+
)?;
720+
map.serialize_entry("kind", &"init")?;
721+
map.serialize_entry("method", &false)?;
722+
map.serialize_entry("shorthand", &true)?;
723+
map.serialize_entry("computed", &false)?;
717724
map.end()
718725
}
719726
}

crates/oxc_ast/src/serialize.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,33 @@ impl Serialize for ArrowFunctionExpressionBody<'_> {
307307
}
308308
}
309309
}
310+
311+
pub struct AssignmentTargetPropertyIdentifierValue<'a>(
312+
pub &'a AssignmentTargetPropertyIdentifier<'a>,
313+
);
314+
315+
impl Serialize for AssignmentTargetPropertyIdentifierValue<'_> {
316+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
317+
if let Some(init) = &self.0.init {
318+
AssignmentTargetPropertyIdentifierValueAssignmentPattern {
319+
span: self.0.span,
320+
left: &self.0.binding,
321+
right: init,
322+
}
323+
.serialize(serializer)
324+
} else {
325+
self.0.binding.serialize(serializer)
326+
}
327+
}
328+
}
329+
330+
/// wrapper to serialize same as `AssignmentTargetWithDefault`
331+
/// but without extra enum/Box for `AssignmentTargetWithDefault.binding`
332+
#[derive(Serialize)]
333+
#[serde(tag = "type", rename = "AssignmentPattern")]
334+
pub struct AssignmentTargetPropertyIdentifierValueAssignmentPattern<'a> {
335+
#[serde(flatten)]
336+
pub span: Span,
337+
pub left: &'a IdentifierReference<'a>,
338+
pub right: &'a Expression<'a>,
339+
}

npm/oxc-types/types.d.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,13 @@ export interface AssignmentTargetWithDefault extends Span {
268268
export type AssignmentTargetProperty = AssignmentTargetPropertyIdentifier | AssignmentTargetPropertyProperty;
269269

270270
export interface AssignmentTargetPropertyIdentifier extends Span {
271-
type: 'AssignmentTargetPropertyIdentifier';
272-
binding: IdentifierReference;
273-
init: Expression | null;
271+
type: 'Property';
272+
key: IdentifierReference;
273+
value: IdentifierReference | AssignmentTargetWithDefault;
274+
kind: 'init';
275+
method: false;
276+
shorthand: false;
277+
computed: false;
274278
}
275279

276280
export interface AssignmentTargetPropertyProperty extends Span {

tasks/ast_tools/src/derives/estree.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::borrow::Cow;
44

55
use proc_macro2::TokenStream;
66
use quote::quote;
7-
use syn::{parse_str, Expr, Type};
7+
use syn::{parse_str, Expr};
88

99
use crate::{
1010
schema::{Def, EnumDef, FieldDef, Schema, StructDef, TypeDef, VariantDef, Visibility},
@@ -186,9 +186,9 @@ fn parse_estree_attr(location: AttrLocation, part: AttrPart) -> Result<()> {
186186
/// Generate body of `serialize` method for a struct.
187187
fn generate_body_for_struct(struct_def: &StructDef, schema: &Schema) -> TokenStream {
188188
if let Some(via_str) = struct_def.estree.via.as_deref() {
189-
let via_ty = parse_str::<Type>(via_str).unwrap();
189+
let via_expr = parse_str::<Expr>(via_str).unwrap();
190190
return quote! {
191-
#via_ty::from(self).serialize(serializer)
191+
#via_expr.serialize(serializer)
192192
};
193193
}
194194

0 commit comments

Comments
 (0)