Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/clone-submodules/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ runs:
show-progress: false
repository: oxc-project/acorn-test262
path: tasks/coverage/acorn-test262
ref: 96faefa7644f16bb163484ee50fa13d6ecff7e72 # Latest main at 4/3/25
ref: 7b7fa95e055352d76ddccc98cabc37ca1448cf92 # Latest main at 4/3/25
11 changes: 3 additions & 8 deletions crates/oxc_ast/src/ast/js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -370,11 +370,7 @@ pub enum ObjectPropertyKind<'a> {
#[ast(visit)]
#[derive(Debug)]
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
#[estree(
rename = "Property",
via = ObjectPropertyConverter,
field_order(span, method, shorthand, computed, key, kind, value),
)]
#[estree(rename = "Property", field_order(span, method, shorthand, computed, key, value, kind))]
pub struct ObjectProperty<'a> {
pub span: Span,
pub kind: PropertyKind,
Expand Down Expand Up @@ -936,7 +932,7 @@ pub enum AssignmentTargetProperty<'a> {
#[estree(
rename = "Property",
add_fields(method = False, shorthand = True, computed = False, kind = Init),
field_order(span, method, shorthand, computed, binding, kind, init),
field_order(span, method, shorthand, computed, binding, init, kind),
)]
pub struct AssignmentTargetPropertyIdentifier<'a> {
pub span: Span,
Expand Down Expand Up @@ -1566,9 +1562,8 @@ pub struct ObjectPattern<'a> {
#[generate_derive(CloneIn, GetSpan, GetSpanMut, ContentEq, ESTree)]
#[estree(
rename = "Property",
via = BindingPropertyConverter,
add_fields(method = False, kind = Init),
field_order(span, method, shorthand, computed, key, kind, value),
field_order(span, method, shorthand, computed, key, value, kind),
)]
pub struct BindingProperty<'a> {
pub span: Span,
Expand Down
26 changes: 23 additions & 3 deletions crates/oxc_ast/src/generated/derive_estree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,17 @@ impl ESTree for ObjectPropertyKind<'_> {

impl ESTree for ObjectProperty<'_> {
fn serialize<S: Serializer>(&self, serializer: S) {
crate::serialize::ObjectPropertyConverter(self).serialize(serializer)
let mut state = serializer.serialize_struct();
state.serialize_field("type", &JsonSafeString("Property"));
state.serialize_field("start", &self.span.start);
state.serialize_field("end", &self.span.end);
state.serialize_field("method", &self.method);
state.serialize_field("shorthand", &self.shorthand);
state.serialize_field("computed", &self.computed);
state.serialize_field("key", &self.key);
state.serialize_field("value", &self.value);
state.serialize_field("kind", &self.kind);
state.end();
}
}

Expand Down Expand Up @@ -710,11 +720,11 @@ impl ESTree for AssignmentTargetPropertyIdentifier<'_> {
state.serialize_field("shorthand", &crate::serialize::True(self));
state.serialize_field("computed", &crate::serialize::False(self));
state.serialize_field("key", &self.binding);
state.serialize_field("kind", &crate::serialize::Init(self));
state.serialize_field(
"value",
&crate::serialize::AssignmentTargetPropertyIdentifierValue(self),
);
state.serialize_field("kind", &crate::serialize::Init(self));
state.end();
}
}
Expand Down Expand Up @@ -1282,7 +1292,17 @@ impl ESTree for ObjectPattern<'_> {

impl ESTree for BindingProperty<'_> {
fn serialize<S: Serializer>(&self, serializer: S) {
crate::serialize::BindingPropertyConverter(self).serialize(serializer)
let mut state = serializer.serialize_struct();
state.serialize_field("type", &JsonSafeString("Property"));
state.serialize_field("start", &self.span.start);
state.serialize_field("end", &self.span.end);
state.serialize_field("method", &crate::serialize::False(self));
state.serialize_field("shorthand", &self.shorthand);
state.serialize_field("computed", &self.computed);
state.serialize_field("key", &self.key);
state.serialize_field("value", &self.value);
state.serialize_field("kind", &crate::serialize::Init(self));
state.end();
}
}

Expand Down
80 changes: 0 additions & 80 deletions crates/oxc_ast/src/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -380,86 +380,6 @@ impl ESTree for ImportDeclarationSpecifiers<'_, '_> {
}
}

/// Serialize `ObjectProperty` with fields in same order as Acorn.
#[ast_meta]
#[estree(raw_deser = "
const start = DESER[u32](POS_OFFSET.span.start),
end = DESER[u32](POS_OFFSET.span.end),
method = DESER[bool](POS_OFFSET.method),
shorthand = DESER[bool](POS_OFFSET.shorthand),
computed = DESER[bool](POS_OFFSET.computed),
key = DESER[PropertyKey](POS_OFFSET.key),
kind = DESER[PropertyKind](POS_OFFSET.kind),
value = DESER[Expression](POS_OFFSET.value),
obj = method || shorthand || kind !== 'init'
? {type: 'Property', start, end, method, shorthand, computed, key, kind, value}
: {type: 'Property', start, end, method, shorthand, computed, key, value, kind};
obj
")]
pub struct ObjectPropertyConverter<'a, 'b>(pub &'b ObjectProperty<'a>);

impl ESTree for ObjectPropertyConverter<'_, '_> {
fn serialize<S: Serializer>(&self, serializer: S) {
let prop = self.0;
let mut state = serializer.serialize_struct();
state.serialize_field("type", &JsonSafeString("Property"));
state.serialize_field("start", &prop.span.start);
state.serialize_field("end", &prop.span.end);
state.serialize_field("method", &prop.method);
state.serialize_field("shorthand", &prop.shorthand);
state.serialize_field("computed", &prop.computed);
state.serialize_field("key", &prop.key);
// Acorn has `kind` field before `value` for methods and shorthand properties
if prop.method || prop.kind != PropertyKind::Init || prop.shorthand {
state.serialize_field("kind", &prop.kind);
state.serialize_field("value", &prop.value);
} else {
state.serialize_field("value", &prop.value);
state.serialize_field("kind", &prop.kind);
}
state.end();
}
}

/// Serialize `BindingProperty` with fields in same order as Acorn.
#[ast_meta]
#[estree(raw_deser = "
const start = DESER[u32](POS_OFFSET.span.start),
end = DESER[u32](POS_OFFSET.span.end),
shorthand = DESER[bool](POS_OFFSET.shorthand),
computed = DESER[bool](POS_OFFSET.computed),
key = DESER[PropertyKey](POS_OFFSET.key),
value = DESER[BindingPattern](POS_OFFSET.value),
obj = shorthand
? {type: 'Property', start, end, method: false, shorthand, computed, key, kind: 'init', value}
: {type: 'Property', start, end, method: false, shorthand, computed, key, value, kind: 'init'};
obj
")]
pub struct BindingPropertyConverter<'a, 'b>(pub &'b BindingProperty<'a>);

impl ESTree for BindingPropertyConverter<'_, '_> {
fn serialize<S: Serializer>(&self, serializer: S) {
let prop = self.0;
let mut state = serializer.serialize_struct();
state.serialize_field("type", &JsonSafeString("Property"));
state.serialize_field("start", &prop.span.start);
state.serialize_field("end", &prop.span.end);
state.serialize_field("method", &false);
state.serialize_field("shorthand", &prop.shorthand);
state.serialize_field("computed", &prop.computed);
state.serialize_field("key", &prop.key);
// Acorn has `kind` field before `value` for shorthand properties
if prop.shorthand {
state.serialize_field("kind", &JsonSafeString("init"));
state.serialize_field("value", &prop.value);
} else {
state.serialize_field("value", &prop.value);
state.serialize_field("kind", &JsonSafeString("init"));
}
state.end();
}
}

/// Serializer for `ArrowFunctionExpression`'s `body` field.
///
/// Serializes as either an expression (if `expression` property is set),
Expand Down
2 changes: 1 addition & 1 deletion justfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ submodules:
just clone-submodule tasks/coverage/babel https://github.com/babel/babel.git 578ac4df1c8a05f01350553950dbfbbeaac013c2
just clone-submodule tasks/coverage/typescript https://github.com/microsoft/TypeScript.git 15392346d05045742e653eab5c87538ff2a3c863
just clone-submodule tasks/prettier_conformance/prettier https://github.com/prettier/prettier.git 7584432401a47a26943dd7a9ca9a8e032ead7285
just clone-submodule tasks/coverage/acorn-test262 https://github.com/oxc-project/acorn-test262 96faefa7644f16bb163484ee50fa13d6ecff7e72
just clone-submodule tasks/coverage/acorn-test262 https://github.com/oxc-project/acorn-test262 7b7fa95e055352d76ddccc98cabc37ca1448cf92
just update-transformer-fixtures

# Install git pre-commit to format files
Expand Down
46 changes: 23 additions & 23 deletions napi/parser/deserialize-js.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,18 +114,17 @@ function deserializeObjectExpression(pos) {
}

function deserializeObjectProperty(pos) {
const start = deserializeU32(pos),
end = deserializeU32(pos + 4),
method = deserializeBool(pos + 48),
shorthand = deserializeBool(pos + 49),
computed = deserializeBool(pos + 50),
key = deserializePropertyKey(pos + 16),
kind = deserializePropertyKind(pos + 8),
value = deserializeExpression(pos + 32),
obj = method || shorthand || kind !== 'init'
? { type: 'Property', start, end, method, shorthand, computed, key, kind, value }
: { type: 'Property', start, end, method, shorthand, computed, key, value, kind };
return obj;
return {
type: 'Property',
start: deserializeU32(pos),
end: deserializeU32(pos + 4),
method: deserializeBool(pos + 48),
shorthand: deserializeBool(pos + 49),
computed: deserializeBool(pos + 50),
key: deserializePropertyKey(pos + 16),
value: deserializeExpression(pos + 32),
kind: deserializePropertyKind(pos + 8),
};
}

function deserializeTemplateLiteral(pos) {
Expand Down Expand Up @@ -381,8 +380,8 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
shorthand: true,
computed: false,
key: deserializeIdentifierReference(pos + 8),
kind: 'init',
value,
kind: 'init',
};
}

Expand Down Expand Up @@ -715,16 +714,17 @@ function deserializeObjectPattern(pos) {
}

function deserializeBindingProperty(pos) {
const start = deserializeU32(pos),
end = deserializeU32(pos + 4),
shorthand = deserializeBool(pos + 56),
computed = deserializeBool(pos + 57),
key = deserializePropertyKey(pos + 8),
value = deserializeBindingPattern(pos + 24),
obj = shorthand
? { type: 'Property', start, end, method: false, shorthand, computed, key, kind: 'init', value }
: { type: 'Property', start, end, method: false, shorthand, computed, key, value, kind: 'init' };
return obj;
return {
type: 'Property',
start: deserializeU32(pos),
end: deserializeU32(pos + 4),
method: false,
shorthand: deserializeBool(pos + 56),
computed: deserializeBool(pos + 57),
key: deserializePropertyKey(pos + 8),
value: deserializeBindingPattern(pos + 24),
kind: 'init',
};
}

function deserializeArrayPattern(pos) {
Expand Down
46 changes: 23 additions & 23 deletions napi/parser/deserialize-ts.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,18 +114,17 @@ function deserializeObjectExpression(pos) {
}

function deserializeObjectProperty(pos) {
const start = deserializeU32(pos),
end = deserializeU32(pos + 4),
method = deserializeBool(pos + 48),
shorthand = deserializeBool(pos + 49),
computed = deserializeBool(pos + 50),
key = deserializePropertyKey(pos + 16),
kind = deserializePropertyKind(pos + 8),
value = deserializeExpression(pos + 32),
obj = method || shorthand || kind !== 'init'
? { type: 'Property', start, end, method, shorthand, computed, key, kind, value }
: { type: 'Property', start, end, method, shorthand, computed, key, value, kind };
return obj;
return {
type: 'Property',
start: deserializeU32(pos),
end: deserializeU32(pos + 4),
method: deserializeBool(pos + 48),
shorthand: deserializeBool(pos + 49),
computed: deserializeBool(pos + 50),
key: deserializePropertyKey(pos + 16),
value: deserializeExpression(pos + 32),
kind: deserializePropertyKind(pos + 8),
};
}

function deserializeTemplateLiteral(pos) {
Expand Down Expand Up @@ -384,8 +383,8 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
shorthand: true,
computed: false,
key: deserializeIdentifierReference(pos + 8),
kind: 'init',
value,
kind: 'init',
};
}

Expand Down Expand Up @@ -724,16 +723,17 @@ function deserializeObjectPattern(pos) {
}

function deserializeBindingProperty(pos) {
const start = deserializeU32(pos),
end = deserializeU32(pos + 4),
shorthand = deserializeBool(pos + 56),
computed = deserializeBool(pos + 57),
key = deserializePropertyKey(pos + 8),
value = deserializeBindingPattern(pos + 24),
obj = shorthand
? { type: 'Property', start, end, method: false, shorthand, computed, key, kind: 'init', value }
: { type: 'Property', start, end, method: false, shorthand, computed, key, value, kind: 'init' };
return obj;
return {
type: 'Property',
start: deserializeU32(pos),
end: deserializeU32(pos + 4),
method: false,
shorthand: deserializeBool(pos + 56),
computed: deserializeBool(pos + 57),
key: deserializePropertyKey(pos + 8),
value: deserializeBindingPattern(pos + 24),
kind: 'init',
};
}

function deserializeArrayPattern(pos) {
Expand Down
6 changes: 3 additions & 3 deletions npm/oxc-types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ export interface ObjectProperty extends Span {
shorthand: boolean;
computed: boolean;
key: PropertyKey;
kind: PropertyKind;
value: Expression;
kind: PropertyKind;
}

export type PropertyKey = IdentifierName | PrivateIdentifier | Expression;
Expand Down Expand Up @@ -274,8 +274,8 @@ export interface AssignmentTargetPropertyIdentifier extends Span {
shorthand: true;
computed: false;
key: IdentifierReference;
kind: 'init';
value: IdentifierReference | AssignmentTargetWithDefault;
kind: 'init';
}

export interface AssignmentTargetPropertyProperty extends Span {
Expand Down Expand Up @@ -520,8 +520,8 @@ export interface BindingProperty extends Span {
shorthand: boolean;
computed: boolean;
key: PropertyKey;
kind: 'init';
value: BindingPattern;
kind: 'init';
}

export interface ArrayPattern extends Span {
Expand Down
Loading