Skip to content

Commit 7f079ab

Browse files
committed
fix(ast/estree): fix raw transfer deserializer for AssignmentTargetPropertyIdentifier (#15304)
1. Tiny bug fix - make sure `range` arrays for `key` and `value` are independent objects, so mutating one doesn't mutate the other. 2. Perf optimization - remove usage of `...` spread, which is expensive.
1 parent a7cf856 commit 7f079ab

File tree

10 files changed

+114
-19
lines changed

10 files changed

+114
-19
lines changed

apps/oxlint/src-js/generated/deserialize.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,8 +1251,21 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
12511251
parent,
12521252
}),
12531253
key = deserializeIdentifierReference(pos + 8),
1254-
init = deserializeOptionExpression(pos + 40),
1255-
value = { ...key };
1254+
keyStart,
1255+
keyEnd,
1256+
value = {
1257+
__proto__: NodeProto,
1258+
type: 'Identifier',
1259+
decorators: [],
1260+
name: key.name,
1261+
optional: false,
1262+
typeAnnotation: null,
1263+
start: (keyStart = key.start),
1264+
end: (keyEnd = key.end),
1265+
range: [keyStart, keyEnd],
1266+
parent,
1267+
},
1268+
init = deserializeOptionExpression(pos + 40);
12561269
if (init !== null) {
12571270
let left = value;
12581271
value = {

crates/oxc_ast/src/serialize/js.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,22 @@ impl ESTree for ArrowFunctionExpressionBody<'_> {
426426
#[estree(
427427
ts_type = "IdentifierReference | AssignmentTargetWithDefault",
428428
raw_deser = "
429+
// Clone `key`
430+
let keyStart, keyEnd;
431+
let value = {
432+
type: 'Identifier',
433+
...(IS_TS && { decorators: [] }),
434+
name: THIS.key.name,
435+
...(IS_TS && {
436+
optional: false,
437+
typeAnnotation: null,
438+
}),
439+
start: keyStart = THIS.key.start,
440+
end: keyEnd = THIS.key.end,
441+
...(RANGE && { range: [keyStart, keyEnd] }),
442+
...(PARENT && { parent }),
443+
};
429444
const init = DESER[Option<Expression>](POS_OFFSET.init);
430-
let value = { ...THIS.key };
431445
if (init !== null) {
432446
const left = value;
433447
value = {

napi/parser/generated/deserialize/js.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -970,8 +970,13 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
970970
end,
971971
},
972972
key = deserializeIdentifierReference(pos + 8),
973-
init = deserializeOptionExpression(pos + 40),
974-
value = { ...key };
973+
value = {
974+
type: 'Identifier',
975+
name: key.name,
976+
start: key.start,
977+
end: key.end,
978+
},
979+
init = deserializeOptionExpression(pos + 40);
975980
init !== null &&
976981
(value = {
977982
type: 'AssignmentPattern',

napi/parser/generated/deserialize/js_parent.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,8 +1093,14 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
10931093
parent,
10941094
}),
10951095
key = deserializeIdentifierReference(pos + 8),
1096-
init = deserializeOptionExpression(pos + 40),
1097-
value = { ...key };
1096+
value = {
1097+
type: 'Identifier',
1098+
name: key.name,
1099+
start: key.start,
1100+
end: key.end,
1101+
parent,
1102+
},
1103+
init = deserializeOptionExpression(pos + 40);
10981104
if (init !== null) {
10991105
let left = value;
11001106
value = {

napi/parser/generated/deserialize/js_range.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,8 +1029,16 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
10291029
range: [start, end],
10301030
},
10311031
key = deserializeIdentifierReference(pos + 8),
1032-
init = deserializeOptionExpression(pos + 40),
1033-
value = { ...key };
1032+
keyStart,
1033+
keyEnd,
1034+
value = {
1035+
type: 'Identifier',
1036+
name: key.name,
1037+
start: (keyStart = key.start),
1038+
end: (keyEnd = key.end),
1039+
range: [keyStart, keyEnd],
1040+
},
1041+
init = deserializeOptionExpression(pos + 40);
10341042
init !== null &&
10351043
(value = {
10361044
type: 'AssignmentPattern',

napi/parser/generated/deserialize/js_range_parent.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,8 +1126,17 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
11261126
parent,
11271127
}),
11281128
key = deserializeIdentifierReference(pos + 8),
1129-
init = deserializeOptionExpression(pos + 40),
1130-
value = { ...key };
1129+
keyStart,
1130+
keyEnd,
1131+
value = {
1132+
type: 'Identifier',
1133+
name: key.name,
1134+
start: (keyStart = key.start),
1135+
end: (keyEnd = key.end),
1136+
range: [keyStart, keyEnd],
1137+
parent,
1138+
},
1139+
init = deserializeOptionExpression(pos + 40);
11311140
if (init !== null) {
11321141
let left = value;
11331142
value = {

napi/parser/generated/deserialize/ts.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,8 +1048,16 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
10481048
end,
10491049
},
10501050
key = deserializeIdentifierReference(pos + 8),
1051-
init = deserializeOptionExpression(pos + 40),
1052-
value = { ...key };
1051+
value = {
1052+
type: 'Identifier',
1053+
decorators: [],
1054+
name: key.name,
1055+
optional: false,
1056+
typeAnnotation: null,
1057+
start: key.start,
1058+
end: key.end,
1059+
},
1060+
init = deserializeOptionExpression(pos + 40);
10531061
init !== null &&
10541062
(value = {
10551063
type: 'AssignmentPattern',

napi/parser/generated/deserialize/ts_parent.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,8 +1167,17 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
11671167
parent,
11681168
}),
11691169
key = deserializeIdentifierReference(pos + 8),
1170-
init = deserializeOptionExpression(pos + 40),
1171-
value = { ...key };
1170+
value = {
1171+
type: 'Identifier',
1172+
decorators: [],
1173+
name: key.name,
1174+
optional: false,
1175+
typeAnnotation: null,
1176+
start: key.start,
1177+
end: key.end,
1178+
parent,
1179+
},
1180+
init = deserializeOptionExpression(pos + 40);
11721181
if (init !== null) {
11731182
let left = value;
11741183
value = {

napi/parser/generated/deserialize/ts_range.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,8 +1107,19 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
11071107
range: [start, end],
11081108
},
11091109
key = deserializeIdentifierReference(pos + 8),
1110-
init = deserializeOptionExpression(pos + 40),
1111-
value = { ...key };
1110+
keyStart,
1111+
keyEnd,
1112+
value = {
1113+
type: 'Identifier',
1114+
decorators: [],
1115+
name: key.name,
1116+
optional: false,
1117+
typeAnnotation: null,
1118+
start: (keyStart = key.start),
1119+
end: (keyEnd = key.end),
1120+
range: [keyStart, keyEnd],
1121+
},
1122+
init = deserializeOptionExpression(pos + 40);
11121123
init !== null &&
11131124
(value = {
11141125
type: 'AssignmentPattern',

napi/parser/generated/deserialize/ts_range_parent.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,8 +1200,20 @@ function deserializeAssignmentTargetPropertyIdentifier(pos) {
12001200
parent,
12011201
}),
12021202
key = deserializeIdentifierReference(pos + 8),
1203-
init = deserializeOptionExpression(pos + 40),
1204-
value = { ...key };
1203+
keyStart,
1204+
keyEnd,
1205+
value = {
1206+
type: 'Identifier',
1207+
decorators: [],
1208+
name: key.name,
1209+
optional: false,
1210+
typeAnnotation: null,
1211+
start: (keyStart = key.start),
1212+
end: (keyEnd = key.end),
1213+
range: [keyStart, keyEnd],
1214+
parent,
1215+
},
1216+
init = deserializeOptionExpression(pos + 40);
12051217
if (init !== null) {
12061218
let left = value;
12071219
value = {

0 commit comments

Comments
 (0)