Skip to content

Commit e75d42d

Browse files
committed
perf(napi/parser, linter/plugins): remove runtime preserveParens option from raw transfer deserializers (#14338)
We had a runtime `preserveParens` option in deserializers to cater for linter, but it was not used in parser. Convert it to a compile-time option instead.
1 parent c0562eb commit e75d42d

File tree

12 files changed

+5925
-61
lines changed

12 files changed

+5925
-61
lines changed

.github/generated/ast_changes_watch_list.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ src:
7171
- 'napi/parser/generated/deserialize/js_range.js'
7272
- 'napi/parser/generated/deserialize/ts.js'
7373
- 'napi/parser/generated/deserialize/ts_range.js'
74+
- 'napi/parser/generated/deserialize/ts_range_no_parens.js'
7475
- 'napi/parser/generated/lazy/constructors.js'
7576
- 'napi/parser/generated/lazy/types.js'
7677
- 'napi/parser/generated/lazy/walk.js'

apps/oxlint/scripts/build.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const parserFilePaths = [
3232
'generated/lazy/types.js',
3333
'generated/lazy/walk.js',
3434
*/
35-
'generated/deserialize/ts_range.js',
35+
'generated/deserialize/ts_range_no_parens.js',
3636
'generated/visit/keys.js',
3737
'generated/visit/types.js',
3838
'generated/visit/visitor.d.ts',

apps/oxlint/src-js/plugins/source_code.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
// @ts-expect-error
77
} from '../generated/constants.js';
88
// @ts-expect-error we need to generate `.d.ts` file for this module
9-
import { deserializeProgramOnly } from '../../dist/generated/deserialize/ts_range.js';
9+
// We use the deserializer which removes `ParenthesizedExpression`s from AST to match ESLint
10+
import { deserializeProgramOnly } from '../../dist/generated/deserialize/ts_range_no_parens.js';
1011

1112
import type { Program } from '@oxc-project/types';
1213
import type { Scope, ScopeManager, Variable } from './scope.ts';
@@ -67,10 +68,7 @@ function initSourceText(): void {
6768
*/
6869
function initAst(): void {
6970
if (sourceText === null) initSourceText();
70-
71-
// `preserveParens` argument is `false`, to match ESLint.
72-
// ESLint does not include `ParenthesizedExpression` nodes in its AST.
73-
ast = deserializeProgramOnly(buffer, sourceText, sourceByteLen, false);
71+
ast = deserializeProgramOnly(buffer, sourceText, sourceByteLen);
7472
}
7573

7674
/**

crates/oxc_ast/src/serialize/js.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ impl ESTree for AssignmentTargetPropertyIdentifierInit<'_> {
449449

450450
/// Converter for [`ParenthesizedExpression`].
451451
///
452-
/// In raw transfer, do not produce a `ParenthesizedExpression` node in AST if `preserveParens` is false.
452+
/// In raw transfer, do not produce a `ParenthesizedExpression` node in AST if `PRESERVE_PARENS` is false.
453453
///
454454
/// Not useful in `oxc-parser`, as can use parser option `preserve_parens`.
455455
/// Required for `oxlint` plugins where we run parser with `preserve_parens` set to `true`,
@@ -459,7 +459,7 @@ impl ESTree for AssignmentTargetPropertyIdentifierInit<'_> {
459459
#[ast_meta]
460460
#[estree(raw_deser = "
461461
let node = DESER[Expression](POS_OFFSET.expression);
462-
if (preserveParens) {
462+
if (PRESERVE_PARENS) {
463463
let start, end;
464464
node = {
465465
type: 'ParenthesizedExpression',

crates/oxc_ast/src/serialize/ts.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ impl ESTree for TSFunctionTypeParams<'_, '_> {
427427

428428
/// Converter for [`TSParenthesizedType`].
429429
///
430-
/// In raw transfer, do not produce a `TSParenthesizedType` node in AST if `preserveParens` is false.
430+
/// In raw transfer, do not produce a `TSParenthesizedType` node in AST if `PRESERVE_PARENS` is false.
431431
///
432432
/// Not useful in `oxc-parser`, as can use parser option `preserve_parens`.
433433
/// Required for `oxlint` plugins where we run parser with `preserve_parens` set to `true`,
@@ -437,7 +437,7 @@ impl ESTree for TSFunctionTypeParams<'_, '_> {
437437
#[ast_meta]
438438
#[estree(raw_deser = "
439439
let node = DESER[TSType](POS_OFFSET.type_annotation);
440-
if (preserveParens) {
440+
if (PRESERVE_PARENS) {
441441
let start, end;
442442
node = {
443443
type: 'TSParenthesizedType',

napi/parser/generated/deserialize/js.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
// Auto-generated code, DO NOT EDIT DIRECTLY!
22
// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`.
33

4-
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen, preserveParens;
4+
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen;
55
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }),
66
decodeStr = textDecoder.decode.bind(textDecoder),
77
{ fromCodePoint } = String;
88

9-
export function deserialize(buffer, sourceText, sourceByteLen, preserveParens) {
10-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeRawTransferData);
9+
export function deserialize(buffer, sourceText, sourceByteLen) {
10+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData);
1111
}
1212

13-
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen, preserveParens) {
14-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeProgram);
13+
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) {
14+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram);
1515
}
1616

17-
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, preserveParensInput, deserialize) {
17+
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) {
1818
uint8 = buffer;
1919
uint32 = buffer.uint32;
2020
float64 = buffer.float64;
2121
sourceText = sourceTextInput;
2222
sourceByteLen = sourceByteLenInput;
2323
sourceIsAscii = sourceText.length === sourceByteLen;
24-
preserveParens = preserveParensInput;
2524
let data = deserialize(uint32[536870902]);
2625
uint8 =
2726
uint32 =
@@ -989,12 +988,12 @@ function deserializeChainElement(pos) {
989988

990989
function deserializeParenthesizedExpression(pos) {
991990
let node = deserializeExpression(pos + 8);
992-
preserveParens && (node = {
991+
node = {
993992
type: 'ParenthesizedExpression',
994993
expression: node,
995994
start: deserializeU32(pos),
996995
end: deserializeU32(pos + 4),
997-
});
996+
};
998997
return node;
999998
}
1000999

@@ -2791,12 +2790,12 @@ function deserializeTSIntersectionType(pos) {
27912790

27922791
function deserializeTSParenthesizedType(pos) {
27932792
let node = deserializeTSType(pos + 8);
2794-
preserveParens && (node = {
2793+
node = {
27952794
type: 'TSParenthesizedType',
27962795
typeAnnotation: node,
27972796
start: deserializeU32(pos),
27982797
end: deserializeU32(pos + 4),
2799-
});
2798+
};
28002799
return node;
28012800
}
28022801

napi/parser/generated/deserialize/js_range.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
// Auto-generated code, DO NOT EDIT DIRECTLY!
22
// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`.
33

4-
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen, preserveParens;
4+
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen;
55
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }),
66
decodeStr = textDecoder.decode.bind(textDecoder),
77
{ fromCodePoint } = String;
88

9-
export function deserialize(buffer, sourceText, sourceByteLen, preserveParens) {
10-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeRawTransferData);
9+
export function deserialize(buffer, sourceText, sourceByteLen) {
10+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData);
1111
}
1212

13-
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen, preserveParens) {
14-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeProgram);
13+
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) {
14+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram);
1515
}
1616

17-
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, preserveParensInput, deserialize) {
17+
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) {
1818
uint8 = buffer;
1919
uint32 = buffer.uint32;
2020
float64 = buffer.float64;
2121
sourceText = sourceTextInput;
2222
sourceByteLen = sourceByteLenInput;
2323
sourceIsAscii = sourceText.length === sourceByteLen;
24-
preserveParens = preserveParensInput;
2524
let data = deserialize(uint32[536870902]);
2625
uint8 =
2726
uint32 =
@@ -1025,7 +1024,7 @@ function deserializeChainElement(pos) {
10251024

10261025
function deserializeParenthesizedExpression(pos) {
10271026
let node = deserializeExpression(pos + 8);
1028-
if (preserveParens) {
1027+
{
10291028
let start, end;
10301029
node = {
10311030
type: 'ParenthesizedExpression',
@@ -2918,7 +2917,7 @@ function deserializeTSIntersectionType(pos) {
29182917

29192918
function deserializeTSParenthesizedType(pos) {
29202919
let node = deserializeTSType(pos + 8);
2921-
if (preserveParens) {
2920+
{
29222921
let start, end;
29232922
node = {
29242923
type: 'TSParenthesizedType',

napi/parser/generated/deserialize/ts.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
// Auto-generated code, DO NOT EDIT DIRECTLY!
22
// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`.
33

4-
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen, preserveParens;
4+
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen;
55
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }),
66
decodeStr = textDecoder.decode.bind(textDecoder),
77
{ fromCodePoint } = String;
88

9-
export function deserialize(buffer, sourceText, sourceByteLen, preserveParens) {
10-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeRawTransferData);
9+
export function deserialize(buffer, sourceText, sourceByteLen) {
10+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData);
1111
}
1212

13-
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen, preserveParens) {
14-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeProgram);
13+
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) {
14+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram);
1515
}
1616

17-
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, preserveParensInput, deserialize) {
17+
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) {
1818
uint8 = buffer;
1919
uint32 = buffer.uint32;
2020
float64 = buffer.float64;
2121
sourceText = sourceTextInput;
2222
sourceByteLen = sourceByteLenInput;
2323
sourceIsAscii = sourceText.length === sourceByteLen;
24-
preserveParens = preserveParensInput;
2524
let data = deserialize(uint32[536870902]);
2625
uint8 =
2726
uint32 =
@@ -1033,12 +1032,12 @@ function deserializeChainElement(pos) {
10331032

10341033
function deserializeParenthesizedExpression(pos) {
10351034
let node = deserializeExpression(pos + 8);
1036-
preserveParens && (node = {
1035+
node = {
10371036
type: 'ParenthesizedExpression',
10381037
expression: node,
10391038
start: deserializeU32(pos),
10401039
end: deserializeU32(pos + 4),
1041-
});
1040+
};
10421041
return node;
10431042
}
10441043

@@ -2915,12 +2914,12 @@ function deserializeTSIntersectionType(pos) {
29152914

29162915
function deserializeTSParenthesizedType(pos) {
29172916
let node = deserializeTSType(pos + 8);
2918-
preserveParens && (node = {
2917+
node = {
29192918
type: 'TSParenthesizedType',
29202919
typeAnnotation: node,
29212920
start: deserializeU32(pos),
29222921
end: deserializeU32(pos + 4),
2923-
});
2922+
};
29242923
return node;
29252924
}
29262925

napi/parser/generated/deserialize/ts_range.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
// Auto-generated code, DO NOT EDIT DIRECTLY!
22
// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`.
33

4-
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen, preserveParens;
4+
let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen;
55
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }),
66
decodeStr = textDecoder.decode.bind(textDecoder),
77
{ fromCodePoint } = String;
88

9-
export function deserialize(buffer, sourceText, sourceByteLen, preserveParens) {
10-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeRawTransferData);
9+
export function deserialize(buffer, sourceText, sourceByteLen) {
10+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData);
1111
}
1212

13-
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen, preserveParens) {
14-
return deserializeWith(buffer, sourceText, sourceByteLen, preserveParens, deserializeProgram);
13+
export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) {
14+
return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram);
1515
}
1616

17-
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, preserveParensInput, deserialize) {
17+
function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) {
1818
uint8 = buffer;
1919
uint32 = buffer.uint32;
2020
float64 = buffer.float64;
2121
sourceText = sourceTextInput;
2222
sourceByteLen = sourceByteLenInput;
2323
sourceIsAscii = sourceText.length === sourceByteLen;
24-
preserveParens = preserveParensInput;
2524
let data = deserialize(uint32[536870902]);
2625
uint8 =
2726
uint32 =
@@ -1069,7 +1068,7 @@ function deserializeChainElement(pos) {
10691068

10701069
function deserializeParenthesizedExpression(pos) {
10711070
let node = deserializeExpression(pos + 8);
1072-
if (preserveParens) {
1071+
{
10731072
let start, end;
10741073
node = {
10751074
type: 'ParenthesizedExpression',
@@ -3046,7 +3045,7 @@ function deserializeTSIntersectionType(pos) {
30463045

30473046
function deserializeTSParenthesizedType(pos) {
30483047
let node = deserializeTSType(pos + 8);
3049-
if (preserveParens) {
3048+
{
30503049
let start, end;
30513050
node = {
30523051
type: 'TSParenthesizedType',

0 commit comments

Comments
 (0)