From 7e4d04fadf1bfb5e1ca7c2fc9c43d13173cfc4a0 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Sun, 5 Oct 2025 00:32:09 +0000 Subject: [PATCH] feat(napi/parser): add option to add `parent` prop to AST nodes with raw transfer (#14344) Add an option to `oxc-parser` to add `parent` to all AST nodes. This option is only available with raw transfer (not really feasible with JSON transfer, as JSON doesn't support circular references). This is really for the purposes of JS plugins in Oxlint, so have not included the new deserializers which add `parent` in the `oxc-parser` NPM package, to avoid bloating download size. But it's ideal home is in `napi/parser` so can add it to the conformance tests. `parent` is correct for all nodes in all Test262 and TypeScript test cases. --- .github/generated/ast_changes_watch_list.yml | 4 + .github/workflows/ci.yml | 2 +- crates/oxc_ast/src/serialize/js.rs | 99 +- crates/oxc_ast/src/serialize/jsx.rs | 4 +- crates/oxc_ast/src/serialize/literal.rs | 2 +- crates/oxc_ast/src/serialize/mod.rs | 41 +- crates/oxc_ast/src/serialize/ts.rs | 189 +- napi/parser/generated/deserialize/js.js | 3187 +++++--- .../parser/generated/deserialize/js_parent.js | 6597 +++++++++++++++ napi/parser/generated/deserialize/js_range.js | 3503 ++++---- .../generated/deserialize/js_range_parent.js | 6809 ++++++++++++++++ napi/parser/generated/deserialize/ts.js | 3517 ++++---- .../parser/generated/deserialize/ts_parent.js | 6879 ++++++++++++++++ napi/parser/generated/deserialize/ts_range.js | 3837 +++++---- .../deserialize/ts_range_no_parens.js | 3845 +++++---- .../generated/deserialize/ts_range_parent.js | 7098 +++++++++++++++++ napi/parser/src-js/raw-transfer/common.js | 4 +- napi/parser/src-js/raw-transfer/eager.js | 25 +- napi/parser/src-js/raw-transfer/lazy.js | 3 +- napi/parser/test/parse-raw-common.js | 5 +- napi/parser/test/parse-raw-worker.js | 111 +- napi/parser/test/parse-raw.test.ts | 113 +- napi/parser/vitest.config.ts | 5 +- npm/oxc-types/types.d.ts | 181 + .../ast_tools/src/generators/raw_transfer.rs | 89 +- tasks/ast_tools/src/generators/typescript.rs | 20 +- 26 files changed, 38686 insertions(+), 7483 deletions(-) create mode 100644 napi/parser/generated/deserialize/js_parent.js create mode 100644 napi/parser/generated/deserialize/js_range_parent.js create mode 100644 napi/parser/generated/deserialize/ts_parent.js create mode 100644 napi/parser/generated/deserialize/ts_range_parent.js diff --git a/.github/generated/ast_changes_watch_list.yml b/.github/generated/ast_changes_watch_list.yml index 37e1d61b4bfe6..ac9dab68f3c33 100644 --- a/.github/generated/ast_changes_watch_list.yml +++ b/.github/generated/ast_changes_watch_list.yml @@ -68,10 +68,14 @@ src: - 'crates/oxc_traverse/src/generated/scopes_collector.rs' - 'napi/parser/generated/constants.js' - 'napi/parser/generated/deserialize/js.js' + - 'napi/parser/generated/deserialize/js_parent.js' - 'napi/parser/generated/deserialize/js_range.js' + - 'napi/parser/generated/deserialize/js_range_parent.js' - 'napi/parser/generated/deserialize/ts.js' + - 'napi/parser/generated/deserialize/ts_parent.js' - 'napi/parser/generated/deserialize/ts_range.js' - 'napi/parser/generated/deserialize/ts_range_no_parens.js' + - 'napi/parser/generated/deserialize/ts_range_parent.js' - 'napi/parser/generated/lazy/constructors.js' - 'napi/parser/generated/lazy/types.js' - 'napi/parser/generated/lazy/walk.js' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 428ccd1bfc357..1dd9e7787aa7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -196,7 +196,7 @@ jobs: - if: steps.filter.outputs.src == 'true' name: Run tests in workspace env: - RUN_RAW_TESTS: "true" + RUN_RAW_RANGE_TESTS: "true" run: | rustup target add wasm32-wasip1-threads pnpm run build-test diff --git a/crates/oxc_ast/src/serialize/js.rs b/crates/oxc_ast/src/serialize/js.rs index f4c02b2761b51..db9ea5b6353e6 100644 --- a/crates/oxc_ast/src/serialize/js.rs +++ b/crates/oxc_ast/src/serialize/js.rs @@ -20,8 +20,11 @@ use super::{EmptyArray, Null}; #[estree(raw_deser = " const pattern = DESER[BindingPatternKind](POS_OFFSET.kind); if (IS_TS) { + const previousParent = parent; + parent = pattern; pattern.optional = DESER[bool](POS_OFFSET.optional); pattern.typeAnnotation = DESER[Option>](POS_OFFSET.type_annotation); + if (PARENT) parent = previousParent; } pattern ")] @@ -119,22 +122,31 @@ impl ESTree for CatchParameterConverter<'_, '_> { const params = DESER[Vec](POS_OFFSET.items); if (uint32[(POS_OFFSET.rest) >> 2] !== 0 && uint32[(POS_OFFSET.rest + 4) >> 2] !== 0) { pos = uint32[(POS_OFFSET.rest) >> 2]; + let start, end; - params.push({ + const previousParent = parent; + const rest = parent = { type: 'RestElement', ...(IS_TS && { decorators: [] }), - argument: DESER[BindingPatternKind]( POS_OFFSET.argument.kind ), + argument: null, ...(IS_TS && { optional: DESER[bool]( POS_OFFSET.argument.optional ), - typeAnnotation: DESER[Option>]( - POS_OFFSET.argument.type_annotation - ), + typeAnnotation: null, value: null, }), start: start = DESER[u32]( POS_OFFSET.span.start ), end: end = DESER[u32]( POS_OFFSET.span.end ), ...(RANGE && { range: [start, end] }), - }); + ...(PARENT && { parent }), + }; + rest.argument = DESER[BindingPatternKind]( POS_OFFSET.argument.kind ); + if (IS_TS) { + rest.typeAnnotation = DESER[Option>]( + POS_OFFSET.argument.type_annotation + ); + } + params.push(rest); + if (PARENT) parent = previousParent; } params " @@ -187,27 +199,32 @@ impl ESTree for FormalParametersRest<'_, '_> { if (IS_TS) { const accessibility = DESER[Option](POS_OFFSET.accessibility), readonly = DESER[bool](POS_OFFSET.readonly), - override = DESER[bool](POS_OFFSET.override); + override = DESER[bool](POS_OFFSET.override), + previousParent = parent; if (accessibility === null && !readonly && !override) { - param = DESER[BindingPatternKind](POS_OFFSET.pattern.kind); + param = parent = DESER[BindingPatternKind](POS_OFFSET.pattern.kind); param.decorators = DESER[Vec](POS_OFFSET.decorators); param.optional = DESER[bool](POS_OFFSET.pattern.optional); param.typeAnnotation = DESER[Option>](POS_OFFSET.pattern.type_annotation); } else { let start, end; - param = { + param = parent = { type: 'TSParameterProperty', accessibility, - decorators: DESER[Vec](POS_OFFSET.decorators), + decorators: null, override, - parameter: DESER[BindingPattern](POS_OFFSET.pattern), + parameter: null, readonly, static: false, start: start = DESER[u32]( POS_OFFSET.span.start ), end: end = DESER[u32]( POS_OFFSET.span.end ), ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), }; + param.decorators = DESER[Vec](POS_OFFSET.decorators); + param.parameter = DESER[BindingPattern](POS_OFFSET.pattern); } + if (PARENT) parent = previousParent; } else { param = DESER[BindingPatternKind](POS_OFFSET.pattern.kind); } @@ -384,7 +401,11 @@ impl ESTree for ExportAllDeclarationWithClause<'_, '_> { ts_type = "FunctionBody | Expression", raw_deser = " let body = DESER[Box](POS_OFFSET.body); - THIS.expression ? body.body[0].expression : body + if (THIS.expression === true) { + body = body.body[0].expression; + if (PARENT) body.parent = parent; + } + body " )] pub struct ArrowFunctionExpressionBody<'a>(pub &'a ArrowFunctionExpression<'a>); @@ -405,23 +426,31 @@ impl ESTree for ArrowFunctionExpressionBody<'_> { #[estree( ts_type = "IdentifierReference | AssignmentTargetWithDefault", raw_deser = " - const init = DESER[Option](POS_OFFSET.init), - keyCopy = { ...THIS.key }, - value = init === null - ? keyCopy - : { - type: 'AssignmentPattern', - ...(IS_TS && { decorators: [] }), - left: keyCopy, - right: init, - ...(IS_TS && { - optional: false, - typeAnnotation: null, - }), - start: THIS.start, - end: THIS.end, - ...(RANGE && { range: [THIS.start, THIS.end] }), - }; + const init = DESER[Option](POS_OFFSET.init); + let value = { ...THIS.key }; + if (init !== null) { + const left = value; + const previousParent = parent; + value = parent = { + type: 'AssignmentPattern', + ...(IS_TS && { decorators: [] }), + left, + right: init, + ...(IS_TS && { + optional: false, + typeAnnotation: null, + }), + start: THIS.start, + end: THIS.end, + ...(RANGE && { range: [THIS.start, THIS.end] }), + ...(PARENT && { parent }), + }; + if (PARENT) { + left.parent = value; + init.parent = value; + parent = previousParent; + } + } value " )] @@ -458,16 +487,22 @@ impl ESTree for AssignmentTargetPropertyIdentifierInit<'_> { /// ESTree implementation is unchanged from the auto-generated version. #[ast_meta] #[estree(raw_deser = " - let node = DESER[Expression](POS_OFFSET.expression); + let node; if (PRESERVE_PARENS) { let start, end; - node = { + const previousParent = parent; + node = parent = { type: 'ParenthesizedExpression', - expression: node, + expression: null, start: start = DESER[u32]( POS_OFFSET.span.start ), end: end = DESER[u32]( POS_OFFSET.span.end ), ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), }; + node.expression = DESER[Expression](POS_OFFSET.expression); + if (PARENT) parent = previousParent; + } else { + node = DESER[Expression](POS_OFFSET.expression); } node ")] diff --git a/crates/oxc_ast/src/serialize/jsx.rs b/crates/oxc_ast/src/serialize/jsx.rs index b7c0905edbc94..bc5e6fbe6dc03 100644 --- a/crates/oxc_ast/src/serialize/jsx.rs +++ b/crates/oxc_ast/src/serialize/jsx.rs @@ -56,7 +56,7 @@ impl ESTree for JSXOpeningElementSelfClosing<'_, '_> { ts_type = "JSXIdentifier", raw_deser = " const ident = DESER[Box](POS); - { type: 'JSXIdentifier', name: ident.name, start: ident.start, end: ident.end, ...(RANGE && { range: ident.range }) } + { type: 'JSXIdentifier', name: ident.name, start: ident.start, end: ident.end, ...(RANGE && { range: ident.range }), ...(PARENT && { parent }) } " )] pub struct JSXElementIdentifierReference<'a, 'b>(pub &'b IdentifierReference<'a>); @@ -75,7 +75,7 @@ impl ESTree for JSXElementIdentifierReference<'_, '_> { ts_type = "JSXIdentifier", raw_deser = " const thisExpr = DESER[Box](POS); - { type: 'JSXIdentifier', name: 'this', start: thisExpr.start, end: thisExpr.end, ...(RANGE && { range: thisExpr.range }) } + { type: 'JSXIdentifier', name: 'this', start: thisExpr.start, end: thisExpr.end, ...(RANGE && { range: thisExpr.range }), ...(PARENT && { parent }) } " )] pub struct JSXElementThisExpression<'b>(pub &'b ThisExpression); diff --git a/crates/oxc_ast/src/serialize/literal.rs b/crates/oxc_ast/src/serialize/literal.rs index 7a51030ee98e2..3356a754ba5ff 100644 --- a/crates/oxc_ast/src/serialize/literal.rs +++ b/crates/oxc_ast/src/serialize/literal.rs @@ -202,7 +202,7 @@ impl ESTree for RegExpFlagsConverter<'_> { value.cooked = value.cooked .replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16))); } - { type: 'TemplateElement', value, tail, start, end, ...(RANGE && { range: [start, end] }) } + { type: 'TemplateElement', value, tail, start, end, ...(RANGE && { range: [start, end] }), ...(PARENT && { parent }) } "#)] pub struct TemplateElementConverter<'a, 'b>(pub &'b TemplateElement<'a>); diff --git a/crates/oxc_ast/src/serialize/mod.rs b/crates/oxc_ast/src/serialize/mod.rs index 1a437960fc683..0a63c12e1a686 100644 --- a/crates/oxc_ast/src/serialize/mod.rs +++ b/crates/oxc_ast/src/serialize/mod.rs @@ -121,13 +121,27 @@ impl Program<'_> { /// `Program` span start is 0 (not 5). #[ast_meta] #[estree(raw_deser = " - const body = DESER[Vec](POS_OFFSET.directives); - body.push(...DESER[Vec](POS_OFFSET.body)); + const start = IS_TS ? 0 : DESER[u32](POS_OFFSET.span.start), + end = DESER[u32](POS_OFFSET.span.end); + + const program = parent = { + type: 'Program', + body: null, + sourceType: DESER[ModuleKind](POS_OFFSET.source_type.module_kind), + hashbang: null, + start, + end, + ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent: null }), + }; - const end = DESER[u32](POS_OFFSET.span.end); + program.hashbang = DESER[Option](POS_OFFSET.hashbang); + + const body = program.body = DESER[Vec](POS_OFFSET.directives); + body.push(...DESER[Vec](POS_OFFSET.body)); - let start; if (IS_TS) { + let start; if (body.length > 0) { const first = body[0]; start = first.start; @@ -144,19 +158,16 @@ impl Program<'_> { } else { start = end; } - } else { - start = DESER[u32](POS_OFFSET.span.start); + + if (RANGE) { + program.start = program.range[0] = start; + } else { + program.start = start; + } } - const program = { - type: 'Program', - body, - sourceType: DESER[ModuleKind](POS_OFFSET.source_type.module_kind), - hashbang: DESER[Option](POS_OFFSET.hashbang), - start, - end, - ...(RANGE && { range: [start, end] }), - }; + if (PARENT) parent = null; + program ")] pub struct ProgramConverter<'a, 'b>(pub &'b Program<'a>); diff --git a/crates/oxc_ast/src/serialize/ts.rs b/crates/oxc_ast/src/serialize/ts.rs index 5d38997a9ed4e..4bbbdf3862fca 100644 --- a/crates/oxc_ast/src/serialize/ts.rs +++ b/crates/oxc_ast/src/serialize/ts.rs @@ -53,63 +53,101 @@ impl ESTree for ExpressionStatementDirective<'_, '_> { start = DESER[u32](POS_OFFSET.span.start), end = DESER[u32](POS_OFFSET.span.end), declare = DESER[bool](POS_OFFSET.declare); - let id = DESER[TSModuleDeclarationName](POS_OFFSET.id), - body = DESER[Option](POS_OFFSET.body); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - let start, end; - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: start = id.start, - end: end = innerId.end, - ...(RANGE && { range: [start, end] }), - }; + let node; + const previousParent = parent; + + let body = DESER[Option](POS_OFFSET.body); + if (body === null) { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + // No `body` field + kind, + declare, + global, + start, + end, + ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), + }; + node.id = DESER[TSModuleDeclarationName](POS_OFFSET.id); + } else { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + body, + kind, + declare, + global, + start, + end, + ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), + }; + + const id = DESER[TSModuleDeclarationName](POS_OFFSET.id); + + if (body.type === 'TSModuleBlock') { + node.id = id; + if (PARENT) body.parent = node; } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - while (true) { - if (RANGE) { - innerId.start = innerId.range[0] = id.start; - } else { - innerId.start = id.start; + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + const outerId = node.id = parent = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent: node }), + }; + if (PARENT) id.parent = innerId.parent = outerId; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + if (PARENT) innerId.parent = node; + + const { start } = id; + while (true) { + if (RANGE) { + innerId.start = innerId.range[0] = start; + } else { + innerId.start = start; + } + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; } - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; + + let end; + const right = innerId.left; + const left = innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent: innerId }), + }; + if (PARENT) id.parent = right.parent = left; } - let start, end; - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: start = id.start, - end: end = innerId.left.end, - ...(RANGE && { range: [start, end] }), - }; - id = body.id; + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + if (PARENT) body.parent = node; + } else { + body = null; + } } - body = Object.hasOwn(body, 'body') ? body.body : null; } - // Skip `body` field if `null` - const node = body === null - ? { - type: 'TSModuleDeclaration', - id, kind, declare, global, - start, end, - ...(RANGE && { range: [start, end] }) - } - : { - type: 'TSModuleDeclaration', - id, body, kind, declare, global, - start, end, - ...(RANGE && { range: [start, end] }) - }; + if (PARENT) parent = previousParent; + node ")] pub struct TSModuleDeclarationConverter<'a, 'b>(pub &'b TSModuleDeclaration<'a>); @@ -252,8 +290,10 @@ impl ESTree for TSMappedTypeOptional<'_, '_> { #[estree( ts_type = "TSTypeParameter['name']", raw_deser = " - const typeParameter = DESER[Box](POS_OFFSET.type_parameter); - typeParameter.name + const typeParameter = DESER[Box](POS_OFFSET.type_parameter), + key = typeParameter.name; + if (PARENT) key.parent = parent; + key " )] pub struct TSMappedTypeKey<'a, 'b>(pub &'b TSMappedType<'a>); @@ -269,7 +309,14 @@ impl ESTree for TSMappedTypeKey<'_, '_> { /// NOTE: Variable `typeParameter` in `raw_deser` is shared between `key` and `constraint` serializers. /// They will be concatenated in the generated code. #[ast_meta] -#[estree(ts_type = "TSTypeParameter['constraint']", raw_deser = "typeParameter.constraint")] +#[estree( + ts_type = "TSTypeParameter['constraint']", + raw_deser = " + const { constraint } = typeParameter; + if (PARENT && constraint !== null) constraint.parent = parent; + constraint + " +)] pub struct TSMappedTypeConstraint<'a, 'b>(pub &'b TSMappedType<'a>); impl ESTree for TSMappedTypeConstraint<'_, '_> { @@ -292,31 +339,43 @@ impl ESTree for TSMappedTypeConstraint<'_, '_> { let expression = DESER[TSTypeName](POS_OFFSET.expression); if (expression.type === 'TSQualifiedName') { let object = expression.left; + const { right } = expression; let start, end; - let parent = expression = { + let previous = expression = { type: 'MemberExpression', object, - property: expression.right, + property: right, optional: false, computed: false, start: start = expression.start, end: end = expression.end, ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), }; - while (object.type === 'TSQualifiedName') { - const { left } = object; - let start, end; - parent = parent.object = { + if (PARENT) right.parent = previous; + + while (true) { + if (object.type !== 'TSQualifiedName') { + if (PARENT) object.parent = previous; + break; + } + + const { left, right } = object; + previous = previous.object = { type: 'MemberExpression', object: left, - property: object.right, + property: right, optional: false, computed: false, start: start = object.start, end: end = object.end, ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent: previous }), }; + + if (PARENT) right.parent = previous; + object = left; } } @@ -436,16 +495,22 @@ impl ESTree for TSFunctionTypeParams<'_, '_> { /// ESTree implementation is unchanged from the auto-generated version. #[ast_meta] #[estree(raw_deser = " - let node = DESER[TSType](POS_OFFSET.type_annotation); + let node; if (PRESERVE_PARENS) { let start, end; - node = { + const previousParent = parent; + node = parent = { type: 'TSParenthesizedType', - typeAnnotation: node, + typeAnnotation: null, start: start = DESER[u32]( POS_OFFSET.span.start ), end: end = DESER[u32]( POS_OFFSET.span.end ), ...(RANGE && { range: [start, end] }), + ...(PARENT && { parent }), }; + node.typeAnnotation = DESER[TSType](POS_OFFSET.type_annotation); + if (PARENT) parent = previousParent; + } else { + node = DESER[TSType](POS_OFFSET.type_annotation); } node ")] diff --git a/napi/parser/generated/deserialize/js.js b/napi/parser/generated/deserialize/js.js index 0967c18d3e487..376899359cea5 100644 --- a/napi/parser/generated/deserialize/js.js +++ b/napi/parser/generated/deserialize/js.js @@ -31,18 +31,19 @@ function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserializ } function deserializeProgram(pos) { - let body = deserializeVecDirective(pos + 72); - body.push(...deserializeVecStatement(pos + 96)); - let end = deserializeU32(pos + 4), start; - start = deserializeU32(pos); - return { - type: 'Program', - body, - sourceType: deserializeModuleKind(pos + 125), - hashbang: deserializeOptionHashbang(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + program = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start, + end, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + (program.body = deserializeVecDirective(pos + 72)).push(...deserializeVecStatement(pos + 96)); + return program; } function deserializeExpression(pos) { @@ -188,13 +189,16 @@ function deserializeThisExpression(pos) { } function deserializeArrayExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ArrayExpression', - elements: deserializeVecArrayExpressionElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ArrayExpression', + elements: null, + start, + end, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + return node; } function deserializeArrayExpressionElement(pos) { @@ -299,13 +303,16 @@ function deserializeElision(pos) { } function deserializeObjectExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ObjectExpression', - properties: deserializeVecObjectPropertyKind(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ObjectExpression', + properties: null, + start, + end, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + return node; } function deserializeObjectPropertyKind(pos) { @@ -320,18 +327,22 @@ function deserializeObjectPropertyKind(pos) { } function deserializeObjectProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: deserializePropertyKind(pos + 40), - key: deserializePropertyKey(pos + 8), - value: deserializeExpression(pos + 24), - method: deserializeBool(pos + 41), - shorthand: deserializeBool(pos + 42), - computed: deserializeBool(pos + 43), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + start, + end, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + return node; } function deserializePropertyKey(pos) { @@ -445,25 +456,33 @@ function deserializePropertyKind(pos) { } function deserializeTemplateLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TemplateLiteral', - quasis: deserializeVecTemplateElement(pos + 8), - expressions: deserializeVecExpression(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + return node; } function deserializeTaggedTemplateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TaggedTemplateExpression', - tag: deserializeExpression(pos + 8), - quasi: deserializeTemplateLiteral(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TaggedTemplateExpression', + tag: null, + quasi: null, + start, + end, + }; + node.tag = deserializeExpression(pos + 8); + node.quasi = deserializeTemplateLiteral(pos + 32); + return node; } function deserializeTemplateElement(pos) { @@ -490,86 +509,116 @@ function deserializeTemplateElementValue(pos) { } function deserializeComputedMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeExpression(pos + 24), - optional: deserializeBool(pos + 40), - computed: true, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + return node; } function deserializeStaticMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeIdentifierName(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + return node; } function deserializePrivateFieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializePrivateIdentifier(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + return node; } function deserializeCallExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CallExpression', - callee: deserializeExpression(pos + 8), - arguments: deserializeVecArgument(pos + 32), - optional: deserializeBool(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CallExpression', + callee: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeNewExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'NewExpression', - callee: deserializeExpression(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'NewExpression', + callee: null, + arguments: null, + start, + end, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeMetaProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MetaProperty', - meta: deserializeIdentifierName(pos + 8), - property: deserializeIdentifierName(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + return node; } function deserializeSpreadElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SpreadElement', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SpreadElement', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeArgument(pos) { @@ -668,87 +717,116 @@ function deserializeArgument(pos) { } function deserializeUpdateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UpdateExpression', - operator: deserializeUpdateOperator(pos + 24), - prefix: deserializeBool(pos + 25), - argument: deserializeSimpleAssignmentTarget(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + return node; } function deserializeUnaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UnaryExpression', - operator: deserializeUnaryOperator(pos + 24), - argument: deserializeExpression(pos + 8), - prefix: true, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + return node; } function deserializeBinaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializeExpression(pos + 8), - operator: deserializeBinaryOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializePrivateInExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializePrivateIdentifier(pos + 8), - operator: 'in', - right: deserializeExpression(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + return node; } function deserializeLogicalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LogicalExpression', - left: deserializeExpression(pos + 8), - operator: deserializeLogicalOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeConditionalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ConditionalExpression', - test: deserializeExpression(pos + 8), - consequent: deserializeExpression(pos + 24), - alternate: deserializeExpression(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + return node; } function deserializeAssignmentExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentExpression', - operator: deserializeAssignmentOperator(pos + 40), - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTarget(pos) { @@ -804,39 +882,46 @@ function deserializeSimpleAssignmentTarget(pos) { function deserializeArrayAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + elements: null, + start, + end, + }, elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - elements, - start, - end, - }; + node.elements = elements; + return node; } function deserializeObjectAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + properties: null, + start, + end, + }, properties = deserializeVecAssignmentTargetProperty(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - properties, - start, - end, - }; + node.properties = properties; + return node; } function deserializeAssignmentTargetRest(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - argument: deserializeAssignmentTarget(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + argument: null, + start, + end, + }; + node.argument = deserializeAssignmentTarget(pos + 8); + return node; } function deserializeAssignmentTargetMaybeDefault(pos) { @@ -869,18 +954,22 @@ function deserializeAssignmentTargetMaybeDefault(pos) { } function deserializeAssignmentTargetWithDefault(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - }; -} - -function deserializeAssignmentTargetProperty(pos) { - switch (uint8[pos]) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; +} + +function deserializeAssignmentTargetProperty(pos) { + switch (uint8[pos]) { case 0: return deserializeBoxAssignmentTargetPropertyIdentifier(pos + 8); case 1: @@ -891,53 +980,71 @@ function deserializeAssignmentTargetProperty(pos) { } function deserializeAssignmentTargetPropertyIdentifier(pos) { - let key = deserializeIdentifierReference(pos + 8), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), - init = deserializeOptionExpression(pos + 40), - keyCopy = { ...key }; - return { - type: 'Property', - kind: 'init', - key, - value: init === null ? keyCopy : { - type: 'AssignmentPattern', - left: keyCopy, - right: init, + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, start, end, }, - method: false, - shorthand: true, - computed: false, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + init !== null && (value = { + type: 'AssignmentPattern', + left: value, + right: init, start, end, - }; + }); + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + return node; } function deserializeAssignmentTargetPropertyProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeAssignmentTargetMaybeDefault(pos + 24), - method: false, - shorthand: false, - computed: deserializeBool(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + start, + end, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + return node; } function deserializeSequenceExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SequenceExpression', - expressions: deserializeVecExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SequenceExpression', + expressions: null, + start, + end, + }; + node.expressions = deserializeVecExpression(pos + 8); + return node; } function deserializeSuper(pos) { @@ -950,23 +1057,29 @@ function deserializeSuper(pos) { } function deserializeAwaitExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AwaitExpression', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AwaitExpression', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeChainExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ChainExpression', - expression: deserializeChainElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ChainExpression', + expression: null, + start, + end, + }; + node.expression = deserializeChainElement(pos + 8); + return node; } function deserializeChainElement(pos) { @@ -987,13 +1100,14 @@ function deserializeChainElement(pos) { } function deserializeParenthesizedExpression(pos) { - let node = deserializeExpression(pos + 8); + let node; node = { type: 'ParenthesizedExpression', - expression: node, + expression: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), }; + node.expression = deserializeExpression(pos + 8); return node; } @@ -1069,14 +1183,17 @@ function deserializeStatement(pos) { } function deserializeDirective(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeStringLiteral(pos + 8), - directive: deserializeStr(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeHashbang(pos) { @@ -1090,13 +1207,16 @@ function deserializeHashbang(pos) { } function deserializeBlockStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BlockStatement', - body: deserializeVecStatement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeDeclaration(pos) { @@ -1123,14 +1243,17 @@ function deserializeDeclaration(pos) { } function deserializeVariableDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclaration', - kind: deserializeVariableDeclarationKind(pos + 32), - declarations: deserializeVecVariableDeclarator(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + start, + end, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + return node; } function deserializeVariableDeclarationKind(pos) { @@ -1151,14 +1274,18 @@ function deserializeVariableDeclarationKind(pos) { } function deserializeVariableDeclarator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclarator', - id: deserializeBindingPattern(pos + 8), - init: deserializeOptionExpression(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclarator', + id: null, + init: null, + start, + end, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + return node; } function deserializeEmptyStatement(pos) { @@ -1171,60 +1298,82 @@ function deserializeEmptyStatement(pos) { } function deserializeExpressionStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeIfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'IfStatement', - test: deserializeExpression(pos + 8), - consequent: deserializeStatement(pos + 24), - alternate: deserializeOptionStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + return node; } function deserializeDoWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'DoWhileStatement', - body: deserializeStatement(pos + 8), - test: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + return node; } function deserializeWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WhileStatement', - test: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeForStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForStatement', - init: deserializeOptionForStatementInit(pos + 8), - test: deserializeOptionExpression(pos + 24), - update: deserializeOptionExpression(pos + 40), - body: deserializeStatement(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + return node; } function deserializeForStatementInit(pos) { @@ -1323,15 +1472,20 @@ function deserializeForStatementInit(pos) { } function deserializeForInStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForInStatement', - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeForStatementLeft(pos) { @@ -1364,123 +1518,165 @@ function deserializeForStatementLeft(pos) { } function deserializeForOfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForOfStatement', - await: deserializeBool(pos + 60), - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeContinueStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ContinueStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ContinueStatement', + label: null, + start, + end, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeBreakStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BreakStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BreakStatement', + label: null, + start, + end, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeReturnStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ReturnStatement', - argument: deserializeOptionExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ReturnStatement', + argument: null, + start, + end, + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeWithStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WithStatement', - object: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeSwitchStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchStatement', - discriminant: deserializeExpression(pos + 8), - cases: deserializeVecSwitchCase(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + return node; } function deserializeSwitchCase(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchCase', - test: deserializeOptionExpression(pos + 8), - consequent: deserializeVecStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + return node; } function deserializeLabeledStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LabeledStatement', - label: deserializeLabelIdentifier(pos + 8), - body: deserializeStatement(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + return node; } function deserializeThrowStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ThrowStatement', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ThrowStatement', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeTryStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TryStatement', - block: deserializeBoxBlockStatement(pos + 8), - handler: deserializeOptionBoxCatchClause(pos + 16), - finalizer: deserializeOptionBoxBlockStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + return node; } function deserializeCatchClause(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CatchClause', - param: deserializeOptionCatchParameter(pos + 8), - body: deserializeBoxBlockStatement(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + return node; } function deserializeCatchParameter(pos) { @@ -1516,82 +1712,106 @@ function deserializeBindingPatternKind(pos) { } function deserializeAssignmentPattern(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - left: deserializeBindingPattern(pos + 8), - right: deserializeExpression(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + }; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + return node; } function deserializeObjectPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + properties: null, + start, + end, + }, properties = deserializeVecBindingProperty(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - properties, - start, - end, - }; + node.properties = properties; + return node; } function deserializeBindingProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeBindingPattern(pos + 24), - method: false, - shorthand: deserializeBool(pos + 56), - computed: deserializeBool(pos + 57), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + start, + end, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + return node; } function deserializeArrayPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + elements: null, + start, + end, + }, elements = deserializeVecOptionBindingPattern(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - elements, - start, - end, - }; + node.elements = elements; + return node; } function deserializeBindingRestElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - argument: deserializeBindingPattern(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + argument: null, + start, + end, + }; + node.argument = deserializeBindingPattern(pos + 8); + return node; } function deserializeFunction(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), params = deserializeBoxFormalParameters(pos + 56); - return { - type: deserializeFunctionType(pos + 84), - id: deserializeOptionBindingIdentifier(pos + 8), - generator: deserializeBool(pos + 85), - async: deserializeBool(pos + 86), - params, - body: deserializeOptionBoxFunctionBody(pos + 72), - expression: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + params: null, + body: null, + expression: null, + start, + end, + }, + params = deserializeBoxFormalParameters(pos + 56); + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.params = params; + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + return node; } function deserializeFunctionType(pos) { @@ -1613,12 +1833,14 @@ function deserializeFormalParameters(pos) { let params = deserializeVecFormalParameter(pos + 8); if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { pos = uint32[pos + 32 >> 2]; - params.push({ + let rest = { type: 'RestElement', - argument: deserializeBindingPatternKind(pos + 8), + argument: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), - }); + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + params.push(rest); } return params; } @@ -1630,56 +1852,75 @@ function deserializeFormalParameter(pos) { } function deserializeFunctionBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'BlockStatement', - body, - start, - end, - }; + node.body = body; + return node; } function deserializeArrowFunctionExpression(pos) { let expression = deserializeBool(pos + 44), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + params: null, + body: null, + id: null, + generator: null, + start, + end, + }, body = deserializeBoxFunctionBody(pos + 32); - return { - type: 'ArrowFunctionExpression', - expression, - async: deserializeBool(pos + 45), - params: deserializeBoxFormalParameters(pos + 16), - body: expression ? body.body[0].expression : body, - id: null, - generator: false, - start, - end, - }; + expression === true && (body = body.body[0].expression); + node.params = deserializeBoxFormalParameters(pos + 16); + node.body = body; + node.id = null; + node.generator = false; + return node; } function deserializeYieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'YieldExpression', - delegate: deserializeBool(pos + 24), - argument: deserializeOptionExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeClass(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeClassType(pos + 132), - decorators: deserializeVecDecorator(pos + 8), - id: deserializeOptionBindingIdentifier(pos + 32), - superClass: deserializeOptionExpression(pos + 72), - body: deserializeBoxClassBody(pos + 120), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + superClass: null, + body: null, + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.superClass = deserializeOptionExpression(pos + 72); + node.body = deserializeBoxClassBody(pos + 120); + return node; } function deserializeClassType(pos) { @@ -1694,13 +1935,16 @@ function deserializeClassType(pos) { } function deserializeClassBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ClassBody', - body: deserializeVecClassElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ClassBody', + body: null, + start, + end, + }; + node.body = deserializeVecClassElement(pos + 8); + return node; } function deserializeClassElement(pos) { @@ -1721,18 +1965,23 @@ function deserializeClassElement(pos) { } function deserializeMethodDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeMethodDefinitionType(pos + 56), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeBoxFunction(pos + 48), - kind: deserializeMethodDefinitionKind(pos + 57), - computed: deserializeBool(pos + 58), - static: deserializeBool(pos + 59), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + return node; } function deserializeMethodDefinitionType(pos) { @@ -1747,17 +1996,22 @@ function deserializeMethodDefinitionType(pos) { } function deserializePropertyDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializePropertyDefinitionType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializePropertyDefinitionType(pos) { @@ -1797,13 +2051,16 @@ function deserializePrivateIdentifier(pos) { } function deserializeStaticBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'StaticBlock', - body: deserializeVecStatement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'StaticBlock', + body: null, + start, + end, + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeAccessorPropertyType(pos) { @@ -1818,46 +2075,59 @@ function deserializeAccessorPropertyType(pos) { } function deserializeAccessorProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeAccessorPropertyType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializeImportExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportExpression', - source: deserializeExpression(pos + 8), - options: deserializeOptionExpression(pos + 24), - phase: deserializeOptionImportPhase(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + return node; } function deserializeImportDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + start, + end, + }, specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); specifiers === null && (specifiers = []); let withClause = deserializeOptionBoxWithClause(pos + 80); - return { - type: 'ImportDeclaration', - specifiers, - source: deserializeStringLiteral(pos + 32), - phase: deserializeOptionImportPhase(pos + 88), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - }; + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeImportPhase(pos) { @@ -1885,34 +2155,44 @@ function deserializeImportDeclarationSpecifier(pos) { } function deserializeImportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportSpecifier', - imported: deserializeModuleExportName(pos + 8), - local: deserializeBindingIdentifier(pos + 64), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportSpecifier', + imported: null, + local: null, + start, + end, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + return node; } function deserializeImportDefaultSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportDefaultSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeImportNamespaceSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportNamespaceSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeWithClause(pos) { @@ -1920,16 +2200,20 @@ function deserializeWithClause(pos) { } function deserializeImportAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportAttribute', - key: deserializeImportAttributeKey(pos + 8), - value: deserializeStringLiteral(pos + 64), - start, - end, - }; -} - + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + return node; +} + function deserializeImportAttributeKey(pos) { switch (uint8[pos]) { case 0: @@ -1942,51 +2226,69 @@ function deserializeImportAttributeKey(pos) { } function deserializeExportNamedDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), withClause = deserializeOptionBoxWithClause(pos + 96); - return { - type: 'ExportNamedDeclaration', - declaration: deserializeOptionDeclaration(pos + 8), - specifiers: deserializeVecExportSpecifier(pos + 24), - source: deserializeOptionStringLiteral(pos + 48), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + attributes: null, + start, + end, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportDefaultDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportDefaultDeclaration', - declaration: deserializeExportDefaultDeclarationKind(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportDefaultDeclaration', + declaration: null, + start, + end, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + return node; } function deserializeExportAllDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + start, + end, + }, withClause = deserializeOptionBoxWithClause(pos + 112); - return { - type: 'ExportAllDeclaration', - exported: deserializeOptionModuleExportName(pos + 8), - source: deserializeStringLiteral(pos + 64), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - }; + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportSpecifier', - local: deserializeModuleExportName(pos + 8), - exported: deserializeModuleExportName(pos + 64), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportSpecifier', + local: null, + exported: null, + start, + end, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + return node; } function deserializeExportDefaultDeclarationKind(pos) { @@ -2102,36 +2404,48 @@ function deserializeModuleExportName(pos) { } function deserializeV8IntrinsicExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'V8IntrinsicExpression', - name: deserializeIdentifierName(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeBooleanLiteral(pos) { - let value = deserializeBool(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value, - raw: start === 0 && end === 0 ? null : value + '', - start, - end, - }; + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value, + raw: null, + start, + end, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + return node; } function deserializeNullLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value: null, - raw: start === 0 && end === 0 ? null : 'null', - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: null, + start, + end, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + return node; } function deserializeNumericLiteral(pos) { @@ -2146,43 +2460,58 @@ function deserializeNumericLiteral(pos) { } function deserializeStringLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), value = deserializeStr(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + }, + value = deserializeStr(pos + 8); deserializeBool(pos + 40) && (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 24), - start, - end, - }; + node.value = value; + return node; } function deserializeBigIntLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), bigint = deserializeStr(pos + 8); - return { - type: 'Literal', - value: BigInt(bigint), - raw: deserializeOptionStr(pos + 24), - bigint, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + return node; } function deserializeRegExpLiteral(pos) { - let regex = deserializeRegExp(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4), value = null; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + }, + regex = deserializeRegExp(pos + 8), + value = null; try { value = new RegExp(regex.pattern, regex.flags); } catch {} - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 40), - regex, - start, - end, - }; + node.value = value; + node.regex = regex; + return node; } function deserializeRegExp(pos) { @@ -2207,64 +2536,85 @@ function deserializeRegExpFlags(pos) { } function deserializeJSXElement(pos) { - let closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), openingElement = deserializeBoxJSXOpeningElement(pos + 8); closingElement === null && (openingElement.selfClosing = true); - return { - type: 'JSXElement', - openingElement, - children: deserializeVecJSXChild(pos + 16), - closingElement, - start, - end, - }; + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + return node; } function deserializeJSXOpeningElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningElement', - name: deserializeJSXElementName(pos + 8), - attributes: deserializeVecJSXAttributeItem(pos + 32), - selfClosing: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningElement', + name: null, + attributes: null, + selfClosing: null, + start, + end, + }; + node.name = deserializeJSXElementName(pos + 8); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + return node; } function deserializeJSXClosingElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXClosingElement', - name: deserializeJSXElementName(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXClosingElement', + name: null, + start, + end, + }; + node.name = deserializeJSXElementName(pos + 8); + return node; } function deserializeJSXFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXFragment', - openingFragment: deserializeJSXOpeningFragment(pos + 8), - children: deserializeVecJSXChild(pos + 16), - closingFragment: deserializeJSXClosingFragment(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + return node; } function deserializeJSXOpeningFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningFragment', - attributes: [], - selfClosing: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningFragment', + attributes: null, + selfClosing: null, + start, + end, + }; + node.attributes = []; + node.selfClosing = false; + return node; } function deserializeJSXClosingFragment(pos) { @@ -2306,25 +2656,33 @@ function deserializeJSXElementName(pos) { } function deserializeJSXNamespacedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXNamespacedName', - namespace: deserializeJSXIdentifier(pos + 8), - name: deserializeJSXIdentifier(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + return node; } function deserializeJSXMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXMemberExpression', - object: deserializeJSXMemberExpressionObject(pos + 8), - property: deserializeJSXIdentifier(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + return node; } function deserializeJSXMemberExpressionObject(pos) { @@ -2353,13 +2711,16 @@ function deserializeJSXMemberExpressionObject(pos) { } function deserializeJSXExpressionContainer(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXExpressionContainer', - expression: deserializeJSXExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + }; + node.expression = deserializeJSXExpression(pos + 8); + return node; } function deserializeJSXExpression(pos) { @@ -2478,24 +2839,31 @@ function deserializeJSXAttributeItem(pos) { } function deserializeJSXAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXAttribute', - name: deserializeJSXAttributeName(pos + 8), - value: deserializeOptionJSXAttributeValue(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + return node; } function deserializeJSXSpreadAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadAttribute', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeJSXAttributeName(pos) { @@ -2552,13 +2920,16 @@ function deserializeJSXChild(pos) { } function deserializeJSXSpreadChild(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadChild', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeJSXText(pos) { @@ -2573,51 +2944,69 @@ function deserializeJSXText(pos) { } function deserializeTSThisParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: 'this', - optional: false, - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 16), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + return node; } function deserializeTSEnumDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumDeclaration', - id: deserializeBindingIdentifier(pos + 8), - body: deserializeTSEnumBody(pos + 40), - const: deserializeBool(pos + 76), - declare: deserializeBool(pos + 77), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + return node; } function deserializeTSEnumBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumBody', - members: deserializeVecTSEnumMember(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumBody', + members: null, + start, + end, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + return node; } function deserializeTSEnumMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumMember', - id: deserializeTSEnumMemberName(pos + 8), - initializer: deserializeOptionExpression(pos + 24), - computed: deserializeU8(pos + 8) > 1, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + return node; } function deserializeTSEnumMemberName(pos) { @@ -2636,23 +3025,29 @@ function deserializeTSEnumMemberName(pos) { } function deserializeTSTypeAnnotation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAnnotation', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSLiteralType', - literal: deserializeTSLiteral(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSLiteralType', + literal: null, + start, + end, + }; + node.literal = deserializeTSLiteral(pos + 8); + return node; } function deserializeTSLiteral(pos) { @@ -2756,58 +3151,74 @@ function deserializeTSType(pos) { } function deserializeTSConditionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConditionalType', - checkType: deserializeTSType(pos + 8), - extendsType: deserializeTSType(pos + 24), - trueType: deserializeTSType(pos + 40), - falseType: deserializeTSType(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + return node; } function deserializeTSUnionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSUnionType', - types: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSUnionType', + types: null, + start, + end, + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSIntersectionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIntersectionType', - types: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIntersectionType', + types: null, + start, + end, + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSParenthesizedType(pos) { - let node = deserializeTSType(pos + 8); + let node; node = { type: 'TSParenthesizedType', - typeAnnotation: node, + typeAnnotation: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), }; + node.typeAnnotation = deserializeTSType(pos + 8); return node; } function deserializeTSTypeOperator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeOperator', - operator: deserializeTSTypeOperatorOperator(pos + 24), - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperatorOperator(pos) { @@ -2824,66 +3235,86 @@ function deserializeTSTypeOperatorOperator(pos) { } function deserializeTSArrayType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSArrayType', - elementType: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSArrayType', + elementType: null, + start, + end, + }; + node.elementType = deserializeTSType(pos + 8); + return node; } function deserializeTSIndexedAccessType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexedAccessType', - objectType: deserializeTSType(pos + 8), - indexType: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + return node; } function deserializeTSTupleType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTupleType', - elementTypes: deserializeVecTSTupleElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + return node; } function deserializeTSNamedTupleMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamedTupleMember', - label: deserializeIdentifierName(pos + 8), - elementType: deserializeTSTupleElement(pos + 32), - optional: deserializeBool(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + return node; } function deserializeTSOptionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSOptionalType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSRestType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSRestType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTupleElement(pos) { @@ -3098,14 +3529,18 @@ function deserializeTSBigIntKeyword(pos) { } function deserializeTSTypeReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeReference', - typeName: deserializeTSTypeName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeName(pos) { @@ -3122,104 +3557,139 @@ function deserializeTSTypeName(pos) { } function deserializeTSQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSTypeName(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSTypeParameterInstantiation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterInstantiation', - params: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + }; + node.params = deserializeVecTSType(pos + 8); + return node; } function deserializeTSTypeParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameter', - name: deserializeBindingIdentifier(pos + 8), - constraint: deserializeOptionTSType(pos + 40), - default: deserializeOptionTSType(pos + 56), - in: deserializeBool(pos + 72), - out: deserializeBool(pos + 73), - const: deserializeBool(pos + 74), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + return node; } function deserializeTSTypeParameterDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterDeclaration', - params: deserializeVecTSTypeParameter(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeAliasDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAliasDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - typeAnnotation: deserializeTSType(pos + 48), - declare: deserializeBool(pos + 68), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + return node; } function deserializeTSInterfaceDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - extends: deserializeVecTSInterfaceHeritage(pos + 48), - body: deserializeBoxTSInterfaceBody(pos + 72), - declare: deserializeBool(pos + 84), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + return node; } function deserializeTSInterfaceBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceBody', - body: deserializeVecTSSignature(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceBody', + body: null, + start, + end, + }; + node.body = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSPropertySignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSPropertySignature', - computed: deserializeBool(pos + 32), - optional: deserializeBool(pos + 33), - readonly: deserializeBool(pos + 34), - key: deserializePropertyKey(pos + 8), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - accessibility: null, - static: false, - start, - end, - }; -} - + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + return node; +} + function deserializeTSSignature(pos) { switch (uint8[pos]) { case 0: @@ -3238,33 +3708,42 @@ function deserializeTSSignature(pos) { } function deserializeTSIndexSignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexSignature', - parameters: deserializeVecTSIndexSignatureName(pos + 8), - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 32), - readonly: deserializeBool(pos + 40), - static: deserializeBool(pos + 41), - accessibility: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + return node; } function deserializeTSCallSignatureDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSCallSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 32), - start, - end, - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSMethodSignatureKind(pos) { @@ -3283,72 +3762,98 @@ function deserializeTSMethodSignatureKind(pos) { function deserializeTSMethodSignature(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 40), thisParam = deserializeOptionBoxTSThisParameter(pos + 32); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSMethodSignature', - key: deserializePropertyKey(pos + 8), - computed: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - kind: deserializeTSMethodSignatureKind(pos + 62), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 24), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 48), - accessibility: null, - readonly: false, - static: false, - start, - end, - }; + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + return node; } function deserializeTSConstructSignatureDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSIndexSignatureName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSInterfaceHeritage(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceHeritage', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypePredicate(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypePredicate', - parameterName: deserializeTSTypePredicateName(pos + 8), - asserts: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSTypePredicateName(pos) { @@ -3368,51 +3873,23 @@ function deserializeTSModuleDeclaration(pos) { start = deserializeU32(pos), end = deserializeU32(pos + 4), declare = deserializeBool(pos + 85), - id = deserializeTSModuleDeclarationName(pos + 8), + node, body = deserializeOptionTSModuleDeclarationBody(pos + 64); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: id.start, - end: innerId.end, - }; - } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - for (;;) { - innerId.start = id.start; - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; - } - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: id.start, - end: innerId.left.end, - }; - id = body.id; - } - body = Object.hasOwn(body, 'body') ? body.body : null; - } - return body === null - ? { + if (body === null) { + node = { type: 'TSModuleDeclaration', - id, + id: null, kind, declare, global, start, end, - } - : { + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = { type: 'TSModuleDeclaration', - id, + id: null, body, kind, declare, @@ -3420,6 +3897,44 @@ function deserializeTSModuleDeclaration(pos) { start, end, }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') node.id = id; + else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + node.id = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: id.start, + end: innerId.end, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + let { start } = id; + for (;;) { + innerId.start = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let right = innerId.left; + innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: right.end, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + } else body = null; + } + } + return node; } function deserializeTSModuleDeclarationKind(pos) { @@ -3458,45 +3973,59 @@ function deserializeTSModuleDeclarationBody(pos) { } function deserializeTSModuleBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSModuleBlock', + body: null, + start, + end, + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'TSModuleBlock', - body, - start, - end, - }; + node.body = body; + return node; } function deserializeTSTypeLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeLiteral', - members: deserializeVecTSSignature(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeLiteral', + members: null, + start, + end, + }; + node.members = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSInferType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInferType', - typeParameter: deserializeBoxTSTypeParameter(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInferType', + typeParameter: null, + start, + end, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeQuery(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeQuery', - exprName: deserializeTSTypeQueryExprName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeQueryExprName(pos) { @@ -3515,16 +4044,22 @@ function deserializeTSTypeQueryExprName(pos) { } function deserializeTSImportType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportType', - argument: deserializeTSType(pos + 8), - options: deserializeOptionBoxObjectExpression(pos + 24), - qualifier: deserializeOptionTSImportTypeQualifier(pos + 32), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + return node; } function deserializeTSImportTypeQualifier(pos) { @@ -3539,62 +4074,83 @@ function deserializeTSImportTypeQualifier(pos) { } function deserializeTSImportTypeQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSImportTypeQualifier(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSFunctionType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSFunctionType', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeBoxTSTypeAnnotation(pos + 32), - start, - end, - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSConstructorType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructorType', - abstract: deserializeBool(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSMappedType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + }, typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name, + { constraint } = typeParameter, optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); optional === null && (optional = false); - return { - type: 'TSMappedType', - key: typeParameter.name, - constraint: typeParameter.constraint, - nameType: deserializeOptionTSType(pos + 16), - typeAnnotation: deserializeOptionTSType(pos + 32), - optional, - readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), - start, - end, - }; + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + return node; } function deserializeTSMappedTypeModifierOperator(pos) { @@ -3611,59 +4167,79 @@ function deserializeTSMappedTypeModifierOperator(pos) { } function deserializeTSTemplateLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTemplateLiteralType', - quasis: deserializeVecTemplateElement(pos + 8), - types: deserializeVecTSType(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + return node; } function deserializeTSAsExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSAsExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSSatisfiesExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSSatisfiesExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSTypeAssertion(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAssertion', - typeAnnotation: deserializeTSType(pos + 8), - expression: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + return node; } function deserializeTSImportEqualsDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportEqualsDeclaration', - id: deserializeBindingIdentifier(pos + 8), - moduleReference: deserializeTSModuleReference(pos + 40), - importKind: deserializeImportOrExportKind(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + return node; } function deserializeTSModuleReference(pos) { @@ -3682,64 +4258,83 @@ function deserializeTSModuleReference(pos) { } function deserializeTSExternalModuleReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExternalModuleReference', - expression: deserializeStringLiteral(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeTSNonNullExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNonNullExpression', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeDecorator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Decorator', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Decorator', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSExportAssignment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExportAssignment', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExportAssignment', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSNamespaceExportDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamespaceExportDeclaration', - id: deserializeIdentifierName(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + }; + node.id = deserializeIdentifierName(pos + 8); + return node; } function deserializeTSInstantiationExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInstantiationExpression', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeImportOrExportKind(pos) { @@ -3754,25 +4349,31 @@ function deserializeImportOrExportKind(pos) { } function deserializeJSDocNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocNonNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNonNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocUnknownType(pos) { @@ -3799,13 +4400,15 @@ function deserializeComment(pos) { let type = deserializeCommentKind(pos + 12), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type, + value: null, + start, + end, + }, endCut = type === 'Line' ? 0 : 2; - return { - type, - value: sourceText.slice(start + 2, end - endCut), - start, - end, - }; + node.value = sourceText.slice(start + 2, end - endCut); + return node; } function deserializeNameSpan(pos) { diff --git a/napi/parser/generated/deserialize/js_parent.js b/napi/parser/generated/deserialize/js_parent.js new file mode 100644 index 0000000000000..ff96044c1d1c9 --- /dev/null +++ b/napi/parser/generated/deserialize/js_parent.js @@ -0,0 +1,6597 @@ +// Auto-generated code, DO NOT EDIT DIRECTLY! +// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`. + +let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen; +const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }), + decodeStr = textDecoder.decode.bind(textDecoder), + { fromCodePoint } = String; +let parent = null; + +export function deserialize(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData); +} + +export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram); +} + +function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) { + uint8 = buffer; + uint32 = buffer.uint32; + float64 = buffer.float64; + sourceText = sourceTextInput; + sourceByteLen = sourceByteLenInput; + sourceIsAscii = sourceText.length === sourceByteLen; + let data = deserialize(uint32[536870902]); + uint8 = + uint32 = + float64 = + sourceText = + void 0; + return data; +} + +function deserializeProgram(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + program = parent = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start, + end, + parent: null, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + (program.body = deserializeVecDirective(pos + 72)).push(...deserializeVecStatement(pos + 96)); + parent = null; + return program; +} + +function deserializeExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Expression`); + } +} + +function deserializeIdentifierName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; + parent = previousParent; + return node; +} + +function deserializeIdentifierReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; + parent = previousParent; + return node; +} + +function deserializeBindingIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; + parent = previousParent; + return node; +} + +function deserializeLabelIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; + parent = previousParent; + return node; +} + +function deserializeThisExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'ThisExpression', + start, + end, + parent, + }; +} + +function deserializeArrayExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayExpression', + elements: null, + start, + end, + parent, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArrayExpressionElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + case 65: + return deserializeElision(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ArrayExpressionElement`); + } +} + +function deserializeElision(pos) { + return null; +} + +function deserializeObjectExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectExpression', + properties: null, + start, + end, + parent, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeObjectPropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxObjectProperty(pos + 8); + case 1: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ObjectPropertyKind`); + } +} + +function deserializeObjectProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + start, + end, + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePropertyKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxIdentifierName(pos + 8); + case 65: + return deserializeBoxPrivateIdentifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKey`); + } +} + +function deserializePropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return 'init'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKind`); + } +} + +function deserializeTemplateLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTaggedTemplateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TaggedTemplateExpression', + tag: null, + quasi: null, + start, + end, + parent, + }; + node.tag = deserializeExpression(pos + 8); + node.quasi = deserializeTemplateLiteral(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTemplateElement(pos) { + let tail = deserializeBool(pos + 40), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + value = deserializeTemplateElementValue(pos + 8); + value.cooked !== null && deserializeBool(pos + 41) && + (value.cooked = value.cooked.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + return { + type: 'TemplateElement', + value, + tail, + start, + end, + parent, + }; +} + +function deserializeTemplateElementValue(pos) { + return { + raw: deserializeStr(pos), + cooked: deserializeOptionStr(pos + 16), + }; +} + +function deserializeComputedMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + parent = previousParent; + return node; +} + +function deserializeStaticMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializePrivateFieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeCallExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CallExpression', + callee: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeNewExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'NewExpression', + callee: null, + arguments: null, + start, + end, + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeMetaProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + parent, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + parent = previousParent; + return node; +} + +function deserializeSpreadElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SpreadElement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArgument(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Argument`); + } +} + +function deserializeUpdateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + parent, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeUnaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + parent = previousParent; + return node; +} + +function deserializeBinaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePrivateInExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + parent, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeLogicalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeConditionalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeAssignmentExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTarget`); + } +} + +function deserializeSimpleAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for SimpleAssignmentTarget`); + } +} + +function deserializeArrayAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + elements: null, + start, + end, + parent, + }, + elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && elements.push(rest); + node.elements = elements; + parent = previousParent; + return node; +} + +function deserializeObjectAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + properties: null, + start, + end, + parent, + }, + properties = deserializeVecAssignmentTargetProperty(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && properties.push(rest); + node.properties = properties; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetRest(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetMaybeDefault(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxAssignmentTargetWithDefault(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetMaybeDefault`); + } +} + +function deserializeAssignmentTargetWithDefault(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetProperty(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxAssignmentTargetPropertyIdentifier(pos + 8); + case 1: + return deserializeBoxAssignmentTargetPropertyProperty(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetProperty`); + } +} + +function deserializeAssignmentTargetPropertyIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + start, + end, + parent, + }, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + if (init !== null) { + let left = value, previousParent = parent; + value = parent = { + type: 'AssignmentPattern', + left, + right: init, + start, + end, + parent, + }; + left.parent = value; + init.parent = value; + parent = previousParent; + } + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetPropertyProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + start, + end, + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + parent = previousParent; + return node; +} + +function deserializeSequenceExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SequenceExpression', + expressions: null, + start, + end, + parent, + }; + node.expressions = deserializeVecExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeSuper(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Super', + start, + end, + parent, + }; +} + +function deserializeAwaitExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AwaitExpression', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ChainExpression', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeChainElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxCallExpression(pos + 8); + case 1: + return deserializeBoxTSNonNullExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ChainElement`); + } +} + +function deserializeParenthesizedExpression(pos) { + let node; + { + let previousParent = parent; + node = parent = { + type: 'ParenthesizedExpression', + expression: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeStatement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBlockStatement(pos + 8); + case 1: + return deserializeBoxBreakStatement(pos + 8); + case 2: + return deserializeBoxContinueStatement(pos + 8); + case 3: + return deserializeBoxDebuggerStatement(pos + 8); + case 4: + return deserializeBoxDoWhileStatement(pos + 8); + case 5: + return deserializeBoxEmptyStatement(pos + 8); + case 6: + return deserializeBoxExpressionStatement(pos + 8); + case 7: + return deserializeBoxForInStatement(pos + 8); + case 8: + return deserializeBoxForOfStatement(pos + 8); + case 9: + return deserializeBoxForStatement(pos + 8); + case 10: + return deserializeBoxIfStatement(pos + 8); + case 11: + return deserializeBoxLabeledStatement(pos + 8); + case 12: + return deserializeBoxReturnStatement(pos + 8); + case 13: + return deserializeBoxSwitchStatement(pos + 8); + case 14: + return deserializeBoxThrowStatement(pos + 8); + case 15: + return deserializeBoxTryStatement(pos + 8); + case 16: + return deserializeBoxWhileStatement(pos + 8); + case 17: + return deserializeBoxWithStatement(pos + 8); + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + case 64: + return deserializeBoxImportDeclaration(pos + 8); + case 65: + return deserializeBoxExportAllDeclaration(pos + 8); + case 66: + return deserializeBoxExportDefaultDeclaration(pos + 8); + case 67: + return deserializeBoxExportNamedDeclaration(pos + 8); + case 68: + return deserializeBoxTSExportAssignment(pos + 8); + case 69: + return deserializeBoxTSNamespaceExportDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Statement`); + } +} + +function deserializeDirective(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeHashbang(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Hashbang', + value: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeBlockStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDeclaration(pos) { + switch (uint8[pos]) { + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Declaration`); + } +} + +function deserializeVariableDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + start, + end, + parent, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + parent = previousParent; + return node; +} + +function deserializeVariableDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'var'; + case 1: + return 'let'; + case 2: + return 'const'; + case 3: + return 'using'; + case 4: + return 'await using'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for VariableDeclarationKind`); + } +} + +function deserializeVariableDeclarator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclarator', + id: null, + init: null, + start, + end, + parent, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeEmptyStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'EmptyStatement', + start, + end, + parent, + }; +} + +function deserializeExpressionStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeIfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeDoWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + parent, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeForStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + parent, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + parent = previousParent; + return node; +} + +function deserializeForStatementInit(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxVariableDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementInit`); + } +} + +function deserializeForInStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeForStatementLeft(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxVariableDeclaration(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementLeft`); + } +} + +function deserializeForOfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeContinueStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ContinueStatement', + label: null, + start, + end, + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeBreakStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BreakStatement', + label: null, + start, + end, + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeReturnStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ReturnStatement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + parent, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchCase(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + parent, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeLabeledStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + parent, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeThrowStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ThrowStatement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTryStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + parent, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeCatchClause(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + parent, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + parent = previousParent; + return node; +} + +function deserializeCatchParameter(pos) { + return deserializeBindingPattern(pos + 8); +} + +function deserializeDebuggerStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'DebuggerStatement', + start, + end, + parent, + }; +} + +function deserializeBindingPattern(pos) { + return deserializeBindingPatternKind(pos); +} + +function deserializeBindingPatternKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBindingIdentifier(pos + 8); + case 1: + return deserializeBoxObjectPattern(pos + 8); + case 2: + return deserializeBoxArrayPattern(pos + 8); + case 3: + return deserializeBoxAssignmentPattern(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BindingPatternKind`); + } +} + +function deserializeAssignmentPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeObjectPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + properties: null, + start, + end, + parent, + }, + properties = deserializeVecBindingProperty(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && properties.push(rest); + node.properties = properties; + parent = previousParent; + return node; +} + +function deserializeBindingProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + start, + end, + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + parent = previousParent; + return node; +} + +function deserializeArrayPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + elements: null, + start, + end, + parent, + }, + elements = deserializeVecOptionBindingPattern(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && elements.push(rest); + node.elements = elements; + parent = previousParent; + return node; +} + +function deserializeBindingRestElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeBindingPattern(pos + 8); + parent = previousParent; + return node; +} + +function deserializeFunction(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + params: null, + body: null, + expression: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 56); + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.params = params; + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + parent = previousParent; + return node; +} + +function deserializeFunctionType(pos) { + switch (uint8[pos]) { + case 0: + return 'FunctionDeclaration'; + case 1: + return 'FunctionExpression'; + case 2: + return 'TSDeclareFunction'; + case 3: + return 'TSEmptyBodyFunctionExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for FunctionType`); + } +} + +function deserializeFormalParameters(pos) { + let params = deserializeVecFormalParameter(pos + 8); + if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { + pos = uint32[pos + 32 >> 2]; + let previousParent = parent, + rest = parent = { + type: 'RestElement', + argument: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + params.push(rest); + parent = previousParent; + } + return params; +} + +function deserializeFormalParameter(pos) { + let param; + param = deserializeBindingPatternKind(pos + 32); + return param; +} + +function deserializeFunctionBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeArrowFunctionExpression(pos) { + let expression = deserializeBool(pos + 44), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + params: null, + body: null, + id: null, + generator: null, + start, + end, + parent, + }, + body = deserializeBoxFunctionBody(pos + 32); + if (expression === true) { + body = body.body[0].expression; + body.parent = parent; + } + node.params = deserializeBoxFormalParameters(pos + 16); + node.body = body; + node.id = null; + node.generator = false; + parent = previousParent; + return node; +} + +function deserializeYieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClass(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + superClass: null, + body: null, + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.superClass = deserializeOptionExpression(pos + 72); + node.body = deserializeBoxClassBody(pos + 120); + parent = previousParent; + return node; +} + +function deserializeClassType(pos) { + switch (uint8[pos]) { + case 0: + return 'ClassDeclaration'; + case 1: + return 'ClassExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassType`); + } +} + +function deserializeClassBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ClassBody', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecClassElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClassElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStaticBlock(pos + 8); + case 1: + return deserializeBoxMethodDefinition(pos + 8); + case 2: + return deserializeBoxPropertyDefinition(pos + 8); + case 3: + return deserializeBoxAccessorProperty(pos + 8); + case 4: + return deserializeBoxTSIndexSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassElement`); + } +} + +function deserializeMethodDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + parent = previousParent; + return node; +} + +function deserializeMethodDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'MethodDefinition'; + case 1: + return 'TSAbstractMethodDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionType`); + } +} + +function deserializePropertyDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializePropertyDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'PropertyDefinition'; + case 1: + return 'TSAbstractPropertyDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyDefinitionType`); + } +} + +function deserializeMethodDefinitionKind(pos) { + switch (uint8[pos]) { + case 0: + return 'constructor'; + case 1: + return 'method'; + case 2: + return 'get'; + case 3: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionKind`); + } +} + +function deserializePrivateIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'PrivateIdentifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeStaticBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'StaticBlock', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAccessorPropertyType(pos) { + switch (uint8[pos]) { + case 0: + return 'AccessorProperty'; + case 1: + return 'TSAbstractAccessorProperty'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AccessorPropertyType`); + } +} + +function deserializeAccessorProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializeImportExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + parent, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + start, + end, + parent, + }, + specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); + specifiers === null && (specifiers = []); + let withClause = deserializeOptionBoxWithClause(pos + 80); + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeImportPhase(pos) { + switch (uint8[pos]) { + case 0: + return 'source'; + case 1: + return 'defer'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportPhase`); + } +} + +function deserializeImportDeclarationSpecifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxImportSpecifier(pos + 8); + case 1: + return deserializeBoxImportDefaultSpecifier(pos + 8); + case 2: + return deserializeBoxImportNamespaceSpecifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportDeclarationSpecifier`); + } +} + +function deserializeImportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportSpecifier', + imported: null, + local: null, + start, + end, + parent, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportDefaultSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeImportNamespaceSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithClause(pos) { + return { attributes: deserializeVecImportAttribute(pos + 8) }; +} + +function deserializeImportAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + parent, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportAttributeKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportAttributeKey`); + } +} + +function deserializeExportNamedDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + attributes: null, + start, + end, + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportDefaultDeclaration', + declaration: null, + start, + end, + parent, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeExportAllDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + start, + end, + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 112); + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportSpecifier', + local: null, + exported: null, + start, + end, + parent, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxFunction(pos + 8); + case 65: + return deserializeBoxClass(pos + 8); + case 66: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportDefaultDeclarationKind`); + } +} + +function deserializeModuleExportName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeIdentifierReference(pos + 8); + case 2: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleExportName`); + } +} + +function deserializeV8IntrinsicExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + parent, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeBooleanLiteral(pos) { + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value, + raw: null, + start, + end, + parent, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + parent = previousParent; + return node; +} + +function deserializeNullLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: null, + start, + end, + parent, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + parent = previousParent; + return node; +} + +function deserializeNumericLiteral(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Literal', + value: deserializeF64(pos + 8), + raw: deserializeOptionStr(pos + 16), + start, + end, + parent, + }; +} + +function deserializeStringLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + parent, + }, + value = deserializeStr(pos + 8); + deserializeBool(pos + 40) && + (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + node.value = value; + parent = previousParent; + return node; +} + +function deserializeBigIntLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + parent, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + parent = previousParent; + return node; +} + +function deserializeRegExpLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + parent, + }, + regex = deserializeRegExp(pos + 8), + value = null; + try { + value = new RegExp(regex.pattern, regex.flags); + } catch {} + node.value = value; + node.regex = regex; + parent = previousParent; + return node; +} + +function deserializeRegExp(pos) { + return { + pattern: deserializeStr(pos), + flags: deserializeRegExpFlags(pos + 24), + }; +} + +function deserializeRegExpFlags(pos) { + let flagBits = deserializeU8(pos), flags = ''; + // Alphabetical order + flagBits & 64 && (flags += 'd'); + flagBits & 1 && (flags += 'g'); + flagBits & 2 && (flags += 'i'); + flagBits & 4 && (flags += 'm'); + flagBits & 8 && (flags += 's'); + flagBits & 16 && (flags += 'u'); + flagBits & 128 && (flags += 'v'); + flagBits & 32 && (flags += 'y'); + return flags; +} + +function deserializeJSXElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + parent, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), + openingElement = deserializeBoxJSXOpeningElement(pos + 8); + closingElement === null && (openingElement.selfClosing = true); + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + parent = previousParent; + return node; +} + +function deserializeJSXOpeningElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningElement', + name: null, + attributes: null, + selfClosing: null, + start, + end, + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXClosingElement', + name: null, + start, + end, + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + parent, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + parent = previousParent; + return node; +} + +function deserializeJSXOpeningFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningFragment', + attributes: null, + selfClosing: null, + start, + end, + parent, + }; + node.attributes = []; + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingFragment(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXClosingFragment', + start, + end, + parent, + }; +} + +function deserializeJSXElementName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + parent, + }; + case 2: + return deserializeBoxJSXNamespacedName(pos + 8); + case 3: + return deserializeBoxJSXMemberExpression(pos + 8); + case 4: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXElementName`); + } +} + +function deserializeJSXNamespacedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + parent, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + parent, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpressionObject(pos) { + switch (uint8[pos]) { + case 0: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + parent, + }; + case 1: + return deserializeBoxJSXMemberExpression(pos + 8); + case 2: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXMemberExpressionObject`); + } +} + +function deserializeJSXExpressionContainer(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeJSXExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeJSXEmptyExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXExpression`); + } +} + +function deserializeJSXEmptyExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXEmptyExpression', + start, + end, + parent, + }; +} + +function deserializeJSXAttributeItem(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXAttribute(pos + 8); + case 1: + return deserializeBoxJSXSpreadAttribute(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeItem`); + } +} + +function deserializeJSXAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + parent, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXSpreadAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXAttributeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + return deserializeBoxJSXNamespacedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeName`); + } +} + +function deserializeJSXAttributeValue(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStringLiteral(pos + 8); + case 1: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 2: + return deserializeBoxJSXElement(pos + 8); + case 3: + return deserializeBoxJSXFragment(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeValue`); + } +} + +function deserializeJSXIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXIdentifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeJSXChild(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXText(pos + 8); + case 1: + return deserializeBoxJSXElement(pos + 8); + case 2: + return deserializeBoxJSXFragment(pos + 8); + case 3: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 4: + return deserializeBoxJSXSpreadChild(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXChild`); + } +} + +function deserializeJSXSpreadChild(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXText(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXText', + value: deserializeStr(pos + 8), + raw: deserializeOptionStr(pos + 24), + start, + end, + parent, + }; +} + +function deserializeTSThisParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + return node; +} + +function deserializeTSEnumDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSEnumBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumBody', + members: null, + start, + end, + parent, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSEnumMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + parent, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + parent = previousParent; + return node; +} + +function deserializeTSEnumMemberName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxStringLiteral(pos + 8); + case 2: + return deserializeBoxStringLiteral(pos + 8); + case 3: + return deserializeBoxTemplateLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSEnumMemberName`); + } +} + +function deserializeTSTypeAnnotation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSLiteralType', + literal: null, + start, + end, + parent, + }; + node.literal = deserializeTSLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteral(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNumericLiteral(pos + 8); + case 2: + return deserializeBoxBigIntLiteral(pos + 8); + case 3: + return deserializeBoxStringLiteral(pos + 8); + case 4: + return deserializeBoxTemplateLiteral(pos + 8); + case 5: + return deserializeBoxUnaryExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSLiteral`); + } +} + +function deserializeTSType(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSType`); + } +} + +function deserializeTSConditionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + parent, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSUnionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSUnionType', + types: null, + start, + end, + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIntersectionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIntersectionType', + types: null, + start, + end, + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSParenthesizedType(pos) { + let node; + { + let previousParent = parent; + node = parent = { + type: 'TSParenthesizedType', + typeAnnotation: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeTSTypeOperator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeOperatorOperator(pos) { + switch (uint8[pos]) { + case 0: + return 'keyof'; + case 1: + return 'unique'; + case 2: + return 'readonly'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeOperatorOperator`); + } +} + +function deserializeTSArrayType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSArrayType', + elementType: null, + start, + end, + parent, + }; + node.elementType = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIndexedAccessType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + parent, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTupleType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + parent, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamedTupleMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + parent, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSOptionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSRestType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTupleElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + case 64: + return deserializeBoxTSOptionalType(pos + 8); + case 65: + return deserializeBoxTSRestType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTupleElement`); + } +} + +function deserializeTSAnyKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSAnyKeyword', + start, + end, + parent, + }; +} + +function deserializeTSStringKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSStringKeyword', + start, + end, + parent, + }; +} + +function deserializeTSBooleanKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBooleanKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNumberKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNumberKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNeverKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNeverKeyword', + start, + end, + parent, + }; +} + +function deserializeTSIntrinsicKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSIntrinsicKeyword', + start, + end, + parent, + }; +} + +function deserializeTSUnknownKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUnknownKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNullKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNullKeyword', + start, + end, + parent, + }; +} + +function deserializeTSUndefinedKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUndefinedKeyword', + start, + end, + parent, + }; +} + +function deserializeTSVoidKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSVoidKeyword', + start, + end, + parent, + }; +} + +function deserializeTSSymbolKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSSymbolKeyword', + start, + end, + parent, + }; +} + +function deserializeTSThisType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSThisType', + start, + end, + parent, + }; +} + +function deserializeTSObjectKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSObjectKeyword', + start, + end, + parent, + }; +} + +function deserializeTSBigIntKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBigIntKeyword', + start, + end, + parent, + }; +} + +function deserializeTSTypeReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + parent, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeName`); + } +} + +function deserializeTSQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterInstantiation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + parent, + }; + node.params = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + parent, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + parent, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeAliasDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceBody', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSPropertySignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSSignature(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSIndexSignature(pos + 8); + case 1: + return deserializeBoxTSPropertySignature(pos + 8); + case 2: + return deserializeBoxTSCallSignatureDeclaration(pos + 8); + case 3: + return deserializeBoxTSConstructSignatureDeclaration(pos + 8); + case 4: + return deserializeBoxTSMethodSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSSignature`); + } +} + +function deserializeTSIndexSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + parent, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + parent = previousParent; + return node; +} + +function deserializeTSCallSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSMethodSignatureKind(pos) { + switch (uint8[pos]) { + case 0: + return 'method'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMethodSignatureKind`); + } +} + +function deserializeTSMethodSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 40), + thisParam = deserializeOptionBoxTSThisParameter(pos + 32); + thisParam !== null && params.unshift(thisParam); + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSConstructSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSIndexSignatureName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceHeritage(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicate(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + parent, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicateName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeTSThisType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypePredicateName`); + } +} + +function deserializeTSModuleDeclaration(pos) { + let kind = deserializeTSModuleDeclarationKind(pos + 84), + global = kind === 'global', + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + declare = deserializeBool(pos + 85), + node, + previousParent = parent, + body = deserializeOptionTSModuleDeclarationBody(pos + 64); + if (body === null) { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + kind, + declare, + global, + start, + end, + parent, + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + body, + kind, + declare, + global, + start, + end, + parent, + }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') { + node.id = id; + body.parent = node; + } else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + id.parent = + innerId.parent = + node.id = + parent = + { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: id.start, + end: innerId.end, + parent: node, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + innerId.parent = node; + let { start } = id; + for (;;) { + innerId.start = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let right = innerId.left; + id.parent = right.parent = innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: right.end, + parent: innerId, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + body.parent = node; + } else body = null; + } + } + parent = previousParent; + return node; +} + +function deserializeTSModuleDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'global'; + case 1: + return 'module'; + case 2: + return 'namespace'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationKind`); + } +} + +function deserializeTSModuleDeclarationName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBindingIdentifier(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationName`); + } +} + +function deserializeTSModuleDeclarationBody(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 1: + return deserializeBoxTSModuleBlock(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationBody`); + } +} + +function deserializeTSModuleBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSModuleBlock', + body: null, + start, + end, + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeTSTypeLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeLiteral', + members: null, + start, + end, + parent, + }; + node.members = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInferType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInferType', + typeParameter: null, + start, + end, + parent, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeQuery(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + parent, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeQueryExprName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSImportType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeQueryExprName`); + } +} + +function deserializeTSImportType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + parent, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSImportTypeQualifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxTSImportTypeQualifiedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSImportTypeQualifier`); + } +} + +function deserializeTSImportTypeQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSFunctionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSConstructorType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSMappedType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + parent, + }, + typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name; + key.parent = parent; + let { constraint } = typeParameter; + constraint !== null && (constraint.parent = parent); + let optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); + optional === null && (optional = false); + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + parent = previousParent; + return node; +} + +function deserializeTSMappedTypeModifierOperator(pos) { + switch (uint8[pos]) { + case 0: + return true; + case 1: + return '+'; + case 2: + return '-'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMappedTypeModifierOperator`); + } +} + +function deserializeTSTemplateLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSAsExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSSatisfiesExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeAssertion(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSImportEqualsDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSModuleReference(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSExternalModuleReference(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleReference`); + } +} + +function deserializeTSExternalModuleReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNonNullExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDecorator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Decorator', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSExportAssignment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExportAssignment', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamespaceExportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + parent, + }; + node.id = deserializeIdentifierName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInstantiationExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportOrExportKind(pos) { + switch (uint8[pos]) { + case 0: + return 'value'; + case 1: + return 'type'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportOrExportKind`); + } +} + +function deserializeJSDocNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocNonNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocUnknownType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSJSDocUnknownType', + start, + end, + parent, + }; +} + +function deserializeCommentKind(pos) { + switch (uint8[pos]) { + case 0: + return 'Line'; + case 1: + return 'Block'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for CommentKind`); + } +} + +function deserializeComment(pos) { + let type = deserializeCommentKind(pos + 12), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type, + value: null, + start, + end, + parent, + }, + endCut = type === 'Line' ? 0 : 2; + node.value = sourceText.slice(start + 2, end - endCut); + parent = previousParent; + return node; +} + +function deserializeNameSpan(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + value: deserializeStr(pos + 8), + start, + end, + }; +} + +function deserializeImportEntry(pos) { + return { + importName: deserializeImportImportName(pos + 32), + localName: deserializeNameSpan(pos + 64), + isType: deserializeBool(pos + 88), + }; +} + +function deserializeImportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + return { + kind: 'NamespaceObject', + name: null, + start: null, + end: null, + }; + case 2: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportImportName`); + } +} + +function deserializeExportEntry(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeOptionNameSpan(pos + 16), + importName: deserializeExportImportName(pos + 40), + exportName: deserializeExportExportName(pos + 72), + localName: deserializeExportLocalName(pos + 104), + isType: deserializeBool(pos + 136), + start, + end, + }; +} + +function deserializeExportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + return { + kind: 'All', + name: null, + start: null, + end: null, + }; + case 2: + return { + kind: 'AllButDefault', + name: null, + start: null, + end: null, + }; + case 3: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportImportName`); + } +} + +function deserializeExportExportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportExportName`); + } +} + +function deserializeExportLocalName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Default', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportLocalName`); + } +} + +function deserializeDynamicImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeSpan(pos + 8), + start, + end, + }; +} + +function deserializeAssignmentOperator(pos) { + switch (uint8[pos]) { + case 0: + return '='; + case 1: + return '+='; + case 2: + return '-='; + case 3: + return '*='; + case 4: + return '/='; + case 5: + return '%='; + case 6: + return '**='; + case 7: + return '<<='; + case 8: + return '>>='; + case 9: + return '>>>='; + case 10: + return '|='; + case 11: + return '^='; + case 12: + return '&='; + case 13: + return '||='; + case 14: + return '&&='; + case 15: + return '??='; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentOperator`); + } +} + +function deserializeBinaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '=='; + case 1: + return '!='; + case 2: + return '==='; + case 3: + return '!=='; + case 4: + return '<'; + case 5: + return '<='; + case 6: + return '>'; + case 7: + return '>='; + case 8: + return '+'; + case 9: + return '-'; + case 10: + return '*'; + case 11: + return '/'; + case 12: + return '%'; + case 13: + return '**'; + case 14: + return '<<'; + case 15: + return '>>'; + case 16: + return '>>>'; + case 17: + return '|'; + case 18: + return '^'; + case 19: + return '&'; + case 20: + return 'in'; + case 21: + return 'instanceof'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BinaryOperator`); + } +} + +function deserializeLogicalOperator(pos) { + switch (uint8[pos]) { + case 0: + return '||'; + case 1: + return '&&'; + case 2: + return '??'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for LogicalOperator`); + } +} + +function deserializeUnaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '+'; + case 1: + return '-'; + case 2: + return '!'; + case 3: + return '~'; + case 4: + return 'typeof'; + case 5: + return 'void'; + case 6: + return 'delete'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UnaryOperator`); + } +} + +function deserializeUpdateOperator(pos) { + switch (uint8[pos]) { + case 0: + return '++'; + case 1: + return '--'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UpdateOperator`); + } +} + +function deserializeSpan(pos) { + return { + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + }; +} + +function deserializeModuleKind(pos) { + switch (uint8[pos]) { + case 0: + return 'script'; + case 1: + return 'module'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleKind`); + } +} + +function deserializeRawTransferData(pos) { + return { + program: deserializeProgram(pos), + comments: deserializeVecComment(pos + 128), + module: deserializeEcmaScriptModule(pos + 152), + errors: deserializeVecError(pos + 256), + }; +} + +function deserializeError(pos) { + return { + severity: deserializeErrorSeverity(pos + 72), + message: deserializeStr(pos), + labels: deserializeVecErrorLabel(pos + 16), + helpMessage: deserializeOptionStr(pos + 40), + codeframe: deserializeStr(pos + 56), + }; +} + +function deserializeErrorSeverity(pos) { + switch (uint8[pos]) { + case 0: + return 'Error'; + case 1: + return 'Warning'; + case 2: + return 'Advice'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ErrorSeverity`); + } +} + +function deserializeErrorLabel(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + message: deserializeOptionStr(pos + 8), + start, + end, + }; +} + +function deserializeEcmaScriptModule(pos) { + return { + hasModuleSyntax: deserializeBool(pos + 96), + staticImports: deserializeVecStaticImport(pos), + staticExports: deserializeVecStaticExport(pos + 24), + dynamicImports: deserializeVecDynamicImport(pos + 48), + importMetas: deserializeVecSpan(pos + 72), + }; +} + +function deserializeStaticImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeNameSpan(pos + 8), + entries: deserializeVecImportEntry(pos + 32), + start, + end, + }; +} + +function deserializeStaticExport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + entries: deserializeVecExportEntry(pos + 8), + start, + end, + }; +} + +function deserializeU32(pos) { + return uint32[pos >> 2]; +} + +function deserializeU8(pos) { + return uint8[pos]; +} + +function deserializeStr(pos) { + let pos32 = pos >> 2, len = uint32[pos32 + 2]; + if (len === 0) return ''; + pos = uint32[pos32]; + if (sourceIsAscii && pos < sourceByteLen) return sourceText.substr(pos, len); + // Longer strings use `TextDecoder` + // TODO: Find best switch-over point + let end = pos + len; + if (len > 50) return decodeStr(uint8.subarray(pos, end)); + // Shorter strings decode by hand to avoid native call + let out = '', c; + do { + c = uint8[pos++]; + if (c < 128) out += fromCodePoint(c); + else { + out += decodeStr(uint8.subarray(pos - 1, end)); + break; + } + } while (pos < end); + return out; +} + +function deserializeVecComment(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeComment(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionHashbang(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeHashbang(pos); +} + +function deserializeVecDirective(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeDirective(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecStatement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeStatement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxBooleanLiteral(pos) { + return deserializeBooleanLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNullLiteral(pos) { + return deserializeNullLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNumericLiteral(pos) { + return deserializeNumericLiteral(uint32[pos >> 2]); +} + +function deserializeBoxBigIntLiteral(pos) { + return deserializeBigIntLiteral(uint32[pos >> 2]); +} + +function deserializeBoxRegExpLiteral(pos) { + return deserializeRegExpLiteral(uint32[pos >> 2]); +} + +function deserializeBoxStringLiteral(pos) { + return deserializeStringLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTemplateLiteral(pos) { + return deserializeTemplateLiteral(uint32[pos >> 2]); +} + +function deserializeBoxIdentifierReference(pos) { + return deserializeIdentifierReference(uint32[pos >> 2]); +} + +function deserializeBoxMetaProperty(pos) { + return deserializeMetaProperty(uint32[pos >> 2]); +} + +function deserializeBoxSuper(pos) { + return deserializeSuper(uint32[pos >> 2]); +} + +function deserializeBoxArrayExpression(pos) { + return deserializeArrayExpression(uint32[pos >> 2]); +} + +function deserializeBoxArrowFunctionExpression(pos) { + return deserializeArrowFunctionExpression(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentExpression(pos) { + return deserializeAssignmentExpression(uint32[pos >> 2]); +} + +function deserializeBoxAwaitExpression(pos) { + return deserializeAwaitExpression(uint32[pos >> 2]); +} + +function deserializeBoxBinaryExpression(pos) { + return deserializeBinaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxCallExpression(pos) { + return deserializeCallExpression(uint32[pos >> 2]); +} + +function deserializeBoxChainExpression(pos) { + return deserializeChainExpression(uint32[pos >> 2]); +} + +function deserializeBoxClass(pos) { + return deserializeClass(uint32[pos >> 2]); +} + +function deserializeBoxConditionalExpression(pos) { + return deserializeConditionalExpression(uint32[pos >> 2]); +} + +function deserializeBoxFunction(pos) { + return deserializeFunction(uint32[pos >> 2]); +} + +function deserializeBoxImportExpression(pos) { + return deserializeImportExpression(uint32[pos >> 2]); +} + +function deserializeBoxLogicalExpression(pos) { + return deserializeLogicalExpression(uint32[pos >> 2]); +} + +function deserializeBoxNewExpression(pos) { + return deserializeNewExpression(uint32[pos >> 2]); +} + +function deserializeBoxObjectExpression(pos) { + return deserializeObjectExpression(uint32[pos >> 2]); +} + +function deserializeBoxParenthesizedExpression(pos) { + return deserializeParenthesizedExpression(uint32[pos >> 2]); +} + +function deserializeBoxSequenceExpression(pos) { + return deserializeSequenceExpression(uint32[pos >> 2]); +} + +function deserializeBoxTaggedTemplateExpression(pos) { + return deserializeTaggedTemplateExpression(uint32[pos >> 2]); +} + +function deserializeBoxThisExpression(pos) { + return deserializeThisExpression(uint32[pos >> 2]); +} + +function deserializeBoxUnaryExpression(pos) { + return deserializeUnaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxUpdateExpression(pos) { + return deserializeUpdateExpression(uint32[pos >> 2]); +} + +function deserializeBoxYieldExpression(pos) { + return deserializeYieldExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateInExpression(pos) { + return deserializePrivateInExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXElement(pos) { + return deserializeJSXElement(uint32[pos >> 2]); +} + +function deserializeBoxJSXFragment(pos) { + return deserializeJSXFragment(uint32[pos >> 2]); +} + +function deserializeBoxTSAsExpression(pos) { + return deserializeTSAsExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSSatisfiesExpression(pos) { + return deserializeTSSatisfiesExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAssertion(pos) { + return deserializeTSTypeAssertion(uint32[pos >> 2]); +} + +function deserializeBoxTSNonNullExpression(pos) { + return deserializeTSNonNullExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSInstantiationExpression(pos) { + return deserializeTSInstantiationExpression(uint32[pos >> 2]); +} + +function deserializeBoxV8IntrinsicExpression(pos) { + return deserializeV8IntrinsicExpression(uint32[pos >> 2]); +} + +function deserializeVecArrayExpressionElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArrayExpressionElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxSpreadElement(pos) { + return deserializeSpreadElement(uint32[pos >> 2]); +} + +function deserializeVecObjectPropertyKind(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeObjectPropertyKind(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxObjectProperty(pos) { + return deserializeObjectProperty(uint32[pos >> 2]); +} + +function deserializeBool(pos) { + return uint8[pos] === 1; +} + +function deserializeBoxIdentifierName(pos) { + return deserializeIdentifierName(uint32[pos >> 2]); +} + +function deserializeBoxPrivateIdentifier(pos) { + return deserializePrivateIdentifier(uint32[pos >> 2]); +} + +function deserializeVecTemplateElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeTemplateElement(pos)); + pos += 48; + } + return arr; +} + +function deserializeVecExpression(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeExpression(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSTypeParameterInstantiation(pos) { + return deserializeTSTypeParameterInstantiation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterInstantiation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterInstantiation(pos); +} + +function deserializeOptionStr(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeStr(pos); +} + +function deserializeBoxComputedMemberExpression(pos) { + return deserializeComputedMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxStaticMemberExpression(pos) { + return deserializeStaticMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateFieldExpression(pos) { + return deserializePrivateFieldExpression(uint32[pos >> 2]); +} + +function deserializeVecArgument(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArgument(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxArrayAssignmentTarget(pos) { + return deserializeArrayAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeBoxObjectAssignmentTarget(pos) { + return deserializeObjectAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeOptionAssignmentTargetMaybeDefault(pos) { + if (uint8[pos] === 51) return null; + return deserializeAssignmentTargetMaybeDefault(pos); +} + +function deserializeVecOptionAssignmentTargetMaybeDefault(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeOptionAssignmentTargetMaybeDefault(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetRest(pos) { + return deserializeAssignmentTargetRest(uint32[pos >> 2]); +} + +function deserializeOptionBoxAssignmentTargetRest(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxAssignmentTargetRest(pos); +} + +function deserializeVecAssignmentTargetProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeAssignmentTargetProperty(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetWithDefault(pos) { + return deserializeAssignmentTargetWithDefault(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyIdentifier(pos) { + return deserializeAssignmentTargetPropertyIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyProperty(pos) { + return deserializeAssignmentTargetPropertyProperty(uint32[pos >> 2]); +} + +function deserializeOptionExpression(pos) { + if (uint8[pos] === 51) return null; + return deserializeExpression(pos); +} + +function deserializeBoxBlockStatement(pos) { + return deserializeBlockStatement(uint32[pos >> 2]); +} + +function deserializeBoxBreakStatement(pos) { + return deserializeBreakStatement(uint32[pos >> 2]); +} + +function deserializeBoxContinueStatement(pos) { + return deserializeContinueStatement(uint32[pos >> 2]); +} + +function deserializeBoxDebuggerStatement(pos) { + return deserializeDebuggerStatement(uint32[pos >> 2]); +} + +function deserializeBoxDoWhileStatement(pos) { + return deserializeDoWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxEmptyStatement(pos) { + return deserializeEmptyStatement(uint32[pos >> 2]); +} + +function deserializeBoxExpressionStatement(pos) { + return deserializeExpressionStatement(uint32[pos >> 2]); +} + +function deserializeBoxForInStatement(pos) { + return deserializeForInStatement(uint32[pos >> 2]); +} + +function deserializeBoxForOfStatement(pos) { + return deserializeForOfStatement(uint32[pos >> 2]); +} + +function deserializeBoxForStatement(pos) { + return deserializeForStatement(uint32[pos >> 2]); +} + +function deserializeBoxIfStatement(pos) { + return deserializeIfStatement(uint32[pos >> 2]); +} + +function deserializeBoxLabeledStatement(pos) { + return deserializeLabeledStatement(uint32[pos >> 2]); +} + +function deserializeBoxReturnStatement(pos) { + return deserializeReturnStatement(uint32[pos >> 2]); +} + +function deserializeBoxSwitchStatement(pos) { + return deserializeSwitchStatement(uint32[pos >> 2]); +} + +function deserializeBoxThrowStatement(pos) { + return deserializeThrowStatement(uint32[pos >> 2]); +} + +function deserializeBoxTryStatement(pos) { + return deserializeTryStatement(uint32[pos >> 2]); +} + +function deserializeBoxWhileStatement(pos) { + return deserializeWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxWithStatement(pos) { + return deserializeWithStatement(uint32[pos >> 2]); +} + +function deserializeBoxVariableDeclaration(pos) { + return deserializeVariableDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAliasDeclaration(pos) { + return deserializeTSTypeAliasDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSInterfaceDeclaration(pos) { + return deserializeTSInterfaceDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSEnumDeclaration(pos) { + return deserializeTSEnumDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSModuleDeclaration(pos) { + return deserializeTSModuleDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSImportEqualsDeclaration(pos) { + return deserializeTSImportEqualsDeclaration(uint32[pos >> 2]); +} + +function deserializeVecVariableDeclarator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeVariableDeclarator(pos)); + pos += 64; + } + return arr; +} + +function deserializeOptionStatement(pos) { + if (uint8[pos] === 70) return null; + return deserializeStatement(pos); +} + +function deserializeOptionForStatementInit(pos) { + if (uint8[pos] === 65) return null; + return deserializeForStatementInit(pos); +} + +function deserializeOptionLabelIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeLabelIdentifier(pos); +} + +function deserializeVecSwitchCase(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeSwitchCase(pos)); + pos += 48; + } + return arr; +} + +function deserializeBoxCatchClause(pos) { + return deserializeCatchClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxCatchClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxCatchClause(pos); +} + +function deserializeOptionBoxBlockStatement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBlockStatement(pos); +} + +function deserializeOptionCatchParameter(pos) { + if (uint8[pos + 32] === 2) return null; + return deserializeCatchParameter(pos); +} + +function deserializeBoxTSTypeAnnotation(pos) { + return deserializeTSTypeAnnotation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeAnnotation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeAnnotation(pos); +} + +function deserializeBoxBindingIdentifier(pos) { + return deserializeBindingIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxObjectPattern(pos) { + return deserializeObjectPattern(uint32[pos >> 2]); +} + +function deserializeBoxArrayPattern(pos) { + return deserializeArrayPattern(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentPattern(pos) { + return deserializeAssignmentPattern(uint32[pos >> 2]); +} + +function deserializeVecBindingProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeBindingProperty(pos)); + pos += 64; + } + return arr; +} + +function deserializeBoxBindingRestElement(pos) { + return deserializeBindingRestElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxBindingRestElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBindingRestElement(pos); +} + +function deserializeOptionBindingPattern(pos) { + if (uint8[pos + 24] === 2) return null; + return deserializeBindingPattern(pos); +} + +function deserializeVecOptionBindingPattern(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeOptionBindingPattern(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionBindingIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeBindingIdentifier(pos); +} + +function deserializeBoxTSTypeParameterDeclaration(pos) { + return deserializeTSTypeParameterDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterDeclaration(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterDeclaration(pos); +} + +function deserializeBoxTSThisParameter(pos) { + return deserializeTSThisParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSThisParameter(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSThisParameter(pos); +} + +function deserializeBoxFormalParameters(pos) { + return deserializeFormalParameters(uint32[pos >> 2]); +} + +function deserializeBoxFunctionBody(pos) { + return deserializeFunctionBody(uint32[pos >> 2]); +} + +function deserializeOptionBoxFunctionBody(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxFunctionBody(pos); +} + +function deserializeVecFormalParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeFormalParameter(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecDecorator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeDecorator(pos)); + pos += 24; + } + return arr; +} + +function deserializeBoxClassBody(pos) { + return deserializeClassBody(uint32[pos >> 2]); +} + +function deserializeVecClassElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeClassElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxStaticBlock(pos) { + return deserializeStaticBlock(uint32[pos >> 2]); +} + +function deserializeBoxMethodDefinition(pos) { + return deserializeMethodDefinition(uint32[pos >> 2]); +} + +function deserializeBoxPropertyDefinition(pos) { + return deserializePropertyDefinition(uint32[pos >> 2]); +} + +function deserializeBoxAccessorProperty(pos) { + return deserializeAccessorProperty(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexSignature(pos) { + return deserializeTSIndexSignature(uint32[pos >> 2]); +} + +function deserializeBoxImportDeclaration(pos) { + return deserializeImportDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportAllDeclaration(pos) { + return deserializeExportAllDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportDefaultDeclaration(pos) { + return deserializeExportDefaultDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportNamedDeclaration(pos) { + return deserializeExportNamedDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSExportAssignment(pos) { + return deserializeTSExportAssignment(uint32[pos >> 2]); +} + +function deserializeBoxTSNamespaceExportDeclaration(pos) { + return deserializeTSNamespaceExportDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionImportPhase(pos) { + if (uint8[pos] === 2) return null; + return deserializeImportPhase(pos); +} + +function deserializeVecImportDeclarationSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeImportDeclarationSpecifier(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionVecImportDeclarationSpecifier(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeVecImportDeclarationSpecifier(pos); +} + +function deserializeBoxWithClause(pos) { + return deserializeWithClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxWithClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxWithClause(pos); +} + +function deserializeBoxImportSpecifier(pos) { + return deserializeImportSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportDefaultSpecifier(pos) { + return deserializeImportDefaultSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportNamespaceSpecifier(pos) { + return deserializeImportNamespaceSpecifier(uint32[pos >> 2]); +} + +function deserializeVecImportAttribute(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 112; + for (; pos !== endPos;) { + arr.push(deserializeImportAttribute(pos)); + pos += 112; + } + return arr; +} + +function deserializeOptionDeclaration(pos) { + if (uint8[pos] === 31) return null; + return deserializeDeclaration(pos); +} + +function deserializeVecExportSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 128; + for (; pos !== endPos;) { + arr.push(deserializeExportSpecifier(pos)); + pos += 128; + } + return arr; +} + +function deserializeOptionStringLiteral(pos) { + if (uint8[pos + 40] === 2) return null; + return deserializeStringLiteral(pos); +} + +function deserializeOptionModuleExportName(pos) { + if (uint8[pos] === 3) return null; + return deserializeModuleExportName(pos); +} + +function deserializeF64(pos) { + return float64[pos >> 3]; +} + +function deserializeBoxJSXOpeningElement(pos) { + return deserializeJSXOpeningElement(uint32[pos >> 2]); +} + +function deserializeVecJSXChild(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXChild(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXClosingElement(pos) { + return deserializeJSXClosingElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxJSXClosingElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxJSXClosingElement(pos); +} + +function deserializeVecJSXAttributeItem(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXAttributeItem(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXIdentifier(pos) { + return deserializeJSXIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxJSXNamespacedName(pos) { + return deserializeJSXNamespacedName(uint32[pos >> 2]); +} + +function deserializeBoxJSXMemberExpression(pos) { + return deserializeJSXMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXAttribute(pos) { + return deserializeJSXAttribute(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadAttribute(pos) { + return deserializeJSXSpreadAttribute(uint32[pos >> 2]); +} + +function deserializeOptionJSXAttributeValue(pos) { + if (uint8[pos] === 4) return null; + return deserializeJSXAttributeValue(pos); +} + +function deserializeBoxJSXExpressionContainer(pos) { + return deserializeJSXExpressionContainer(uint32[pos >> 2]); +} + +function deserializeBoxJSXText(pos) { + return deserializeJSXText(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadChild(pos) { + return deserializeJSXSpreadChild(uint32[pos >> 2]); +} + +function deserializeVecTSEnumMember(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 40; + for (; pos !== endPos;) { + arr.push(deserializeTSEnumMember(pos)); + pos += 40; + } + return arr; +} + +function deserializeBoxTSAnyKeyword(pos) { + return deserializeTSAnyKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBigIntKeyword(pos) { + return deserializeTSBigIntKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBooleanKeyword(pos) { + return deserializeTSBooleanKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSIntrinsicKeyword(pos) { + return deserializeTSIntrinsicKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNeverKeyword(pos) { + return deserializeTSNeverKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNullKeyword(pos) { + return deserializeTSNullKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNumberKeyword(pos) { + return deserializeTSNumberKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSObjectKeyword(pos) { + return deserializeTSObjectKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSStringKeyword(pos) { + return deserializeTSStringKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSSymbolKeyword(pos) { + return deserializeTSSymbolKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUndefinedKeyword(pos) { + return deserializeTSUndefinedKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUnknownKeyword(pos) { + return deserializeTSUnknownKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSVoidKeyword(pos) { + return deserializeTSVoidKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSArrayType(pos) { + return deserializeTSArrayType(uint32[pos >> 2]); +} + +function deserializeBoxTSConditionalType(pos) { + return deserializeTSConditionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructorType(pos) { + return deserializeTSConstructorType(uint32[pos >> 2]); +} + +function deserializeBoxTSFunctionType(pos) { + return deserializeTSFunctionType(uint32[pos >> 2]); +} + +function deserializeBoxTSImportType(pos) { + return deserializeTSImportType(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexedAccessType(pos) { + return deserializeTSIndexedAccessType(uint32[pos >> 2]); +} + +function deserializeBoxTSInferType(pos) { + return deserializeTSInferType(uint32[pos >> 2]); +} + +function deserializeBoxTSIntersectionType(pos) { + return deserializeTSIntersectionType(uint32[pos >> 2]); +} + +function deserializeBoxTSLiteralType(pos) { + return deserializeTSLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSMappedType(pos) { + return deserializeTSMappedType(uint32[pos >> 2]); +} + +function deserializeBoxTSNamedTupleMember(pos) { + return deserializeTSNamedTupleMember(uint32[pos >> 2]); +} + +function deserializeBoxTSTemplateLiteralType(pos) { + return deserializeTSTemplateLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSThisType(pos) { + return deserializeTSThisType(uint32[pos >> 2]); +} + +function deserializeBoxTSTupleType(pos) { + return deserializeTSTupleType(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeLiteral(pos) { + return deserializeTSTypeLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeOperator(pos) { + return deserializeTSTypeOperator(uint32[pos >> 2]); +} + +function deserializeBoxTSTypePredicate(pos) { + return deserializeTSTypePredicate(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeQuery(pos) { + return deserializeTSTypeQuery(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeReference(pos) { + return deserializeTSTypeReference(uint32[pos >> 2]); +} + +function deserializeBoxTSUnionType(pos) { + return deserializeTSUnionType(uint32[pos >> 2]); +} + +function deserializeBoxTSParenthesizedType(pos) { + return deserializeTSParenthesizedType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNullableType(pos) { + return deserializeJSDocNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNonNullableType(pos) { + return deserializeJSDocNonNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocUnknownType(pos) { + return deserializeJSDocUnknownType(uint32[pos >> 2]); +} + +function deserializeVecTSType(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSType(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecTSTupleElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSTupleElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSOptionalType(pos) { + return deserializeTSOptionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSRestType(pos) { + return deserializeTSRestType(uint32[pos >> 2]); +} + +function deserializeBoxTSQualifiedName(pos) { + return deserializeTSQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSType(pos) { + if (uint8[pos] === 38) return null; + return deserializeTSType(pos); +} + +function deserializeVecTSTypeParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeTSTypeParameter(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecTSInterfaceHeritage(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSInterfaceHeritage(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxTSInterfaceBody(pos) { + return deserializeTSInterfaceBody(uint32[pos >> 2]); +} + +function deserializeVecTSSignature(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSSignature(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSPropertySignature(pos) { + return deserializeTSPropertySignature(uint32[pos >> 2]); +} + +function deserializeBoxTSCallSignatureDeclaration(pos) { + return deserializeTSCallSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructSignatureDeclaration(pos) { + return deserializeTSConstructSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSMethodSignature(pos) { + return deserializeTSMethodSignature(uint32[pos >> 2]); +} + +function deserializeVecTSIndexSignatureName(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSIndexSignatureName(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionTSModuleDeclarationBody(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSModuleDeclarationBody(pos); +} + +function deserializeBoxTSModuleBlock(pos) { + return deserializeTSModuleBlock(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeParameter(pos) { + return deserializeTSTypeParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxObjectExpression(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxObjectExpression(pos); +} + +function deserializeOptionTSImportTypeQualifier(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSImportTypeQualifier(pos); +} + +function deserializeBoxTSImportTypeQualifiedName(pos) { + return deserializeTSImportTypeQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSMappedTypeModifierOperator(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSMappedTypeModifierOperator(pos); +} + +function deserializeBoxTSExternalModuleReference(pos) { + return deserializeTSExternalModuleReference(uint32[pos >> 2]); +} + +function deserializeOptionNameSpan(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + +function deserializeVecError(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeError(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecErrorLabel(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeErrorLabel(pos)); + pos += 24; + } + return arr; +} + +function deserializeVecStaticImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 56; + for (; pos !== endPos;) { + arr.push(deserializeStaticImport(pos)); + pos += 56; + } + return arr; +} + +function deserializeVecStaticExport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeStaticExport(pos)); + pos += 32; + } + return arr; +} + +function deserializeVecDynamicImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeDynamicImport(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecSpan(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 8; + for (; pos !== endPos;) { + arr.push(deserializeSpan(pos)); + pos += 8; + } + return arr; +} + +function deserializeVecImportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 96; + for (; pos !== endPos;) { + arr.push(deserializeImportEntry(pos)); + pos += 96; + } + return arr; +} + +function deserializeVecExportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 144; + for (; pos !== endPos;) { + arr.push(deserializeExportEntry(pos)); + pos += 144; + } + return arr; +} diff --git a/napi/parser/generated/deserialize/js_range.js b/napi/parser/generated/deserialize/js_range.js index e6be5f879f949..a0ef0eeadf974 100644 --- a/napi/parser/generated/deserialize/js_range.js +++ b/napi/parser/generated/deserialize/js_range.js @@ -31,19 +31,20 @@ function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserializ } function deserializeProgram(pos) { - let body = deserializeVecDirective(pos + 72); - body.push(...deserializeVecStatement(pos + 96)); - let end = deserializeU32(pos + 4), start; - start = deserializeU32(pos); - return { - type: 'Program', - body, - sourceType: deserializeModuleKind(pos + 125), - hashbang: deserializeOptionHashbang(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + program = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start, + end, + range: [start, end], + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + (program.body = deserializeVecDirective(pos + 72)).push(...deserializeVecStatement(pos + 96)); + return program; } function deserializeExpression(pos) { @@ -194,14 +195,17 @@ function deserializeThisExpression(pos) { } function deserializeArrayExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ArrayExpression', - elements: deserializeVecArrayExpressionElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ArrayExpression', + elements: null, + start, + end, + range: [start, end], + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + return node; } function deserializeArrayExpressionElement(pos) { @@ -306,14 +310,17 @@ function deserializeElision(pos) { } function deserializeObjectExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ObjectExpression', - properties: deserializeVecObjectPropertyKind(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ObjectExpression', + properties: null, + start, + end, + range: [start, end], + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + return node; } function deserializeObjectPropertyKind(pos) { @@ -328,19 +335,23 @@ function deserializeObjectPropertyKind(pos) { } function deserializeObjectProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: deserializePropertyKind(pos + 40), - key: deserializePropertyKey(pos + 8), - value: deserializeExpression(pos + 24), - method: deserializeBool(pos + 41), - shorthand: deserializeBool(pos + 42), - computed: deserializeBool(pos + 43), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + return node; } function deserializePropertyKey(pos) { @@ -454,27 +465,35 @@ function deserializePropertyKind(pos) { } function deserializeTemplateLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TemplateLiteral', - quasis: deserializeVecTemplateElement(pos + 8), - expressions: deserializeVecExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + return node; } function deserializeTaggedTemplateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TaggedTemplateExpression', - tag: deserializeExpression(pos + 8), - quasi: deserializeTemplateLiteral(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TaggedTemplateExpression', + tag: null, + quasi: null, + start, + end, + range: [start, end], + }; + node.tag = deserializeExpression(pos + 8); + node.quasi = deserializeTemplateLiteral(pos + 32); + return node; } function deserializeTemplateElement(pos) { @@ -502,93 +521,123 @@ function deserializeTemplateElementValue(pos) { } function deserializeComputedMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeExpression(pos + 24), - optional: deserializeBool(pos + 40), - computed: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + return node; } function deserializeStaticMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeIdentifierName(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + return node; } function deserializePrivateFieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializePrivateIdentifier(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + return node; } function deserializeCallExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CallExpression', - callee: deserializeExpression(pos + 8), - arguments: deserializeVecArgument(pos + 32), - optional: deserializeBool(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CallExpression', + callee: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeNewExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'NewExpression', - callee: deserializeExpression(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'NewExpression', + callee: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeMetaProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MetaProperty', - meta: deserializeIdentifierName(pos + 8), - property: deserializeIdentifierName(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + range: [start, end], + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + return node; } function deserializeSpreadElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SpreadElement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SpreadElement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeArgument(pos) { @@ -687,94 +736,123 @@ function deserializeArgument(pos) { } function deserializeUpdateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UpdateExpression', - operator: deserializeUpdateOperator(pos + 24), - prefix: deserializeBool(pos + 25), - argument: deserializeSimpleAssignmentTarget(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + return node; } function deserializeUnaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UnaryExpression', - operator: deserializeUnaryOperator(pos + 24), - argument: deserializeExpression(pos + 8), - prefix: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + return node; } function deserializeBinaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializeExpression(pos + 8), - operator: deserializeBinaryOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializePrivateInExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializePrivateIdentifier(pos + 8), - operator: 'in', - right: deserializeExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + return node; } function deserializeLogicalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LogicalExpression', - left: deserializeExpression(pos + 8), - operator: deserializeLogicalOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeConditionalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ConditionalExpression', - test: deserializeExpression(pos + 8), - consequent: deserializeExpression(pos + 24), - alternate: deserializeExpression(pos + 40), - start, - end, - range: [start, end], - }; -} + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + return node; +} function deserializeAssignmentExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentExpression', - operator: deserializeAssignmentOperator(pos + 40), - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTarget(pos) { @@ -830,42 +908,49 @@ function deserializeSimpleAssignmentTarget(pos) { function deserializeArrayAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + elements: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - elements, - start, - end, - range: [start, end], - }; + node.elements = elements; + return node; } function deserializeObjectAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + properties: null, + start, + end, + range: [start, end], + }, properties = deserializeVecAssignmentTargetProperty(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - properties, - start, - end, - range: [start, end], - }; + node.properties = properties; + return node; } function deserializeAssignmentTargetRest(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - argument: deserializeAssignmentTarget(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeAssignmentTarget(pos + 8); + return node; } function deserializeAssignmentTargetMaybeDefault(pos) { @@ -898,15 +983,19 @@ function deserializeAssignmentTargetMaybeDefault(pos) { } function deserializeAssignmentTargetWithDefault(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTargetProperty(pos) { @@ -921,57 +1010,75 @@ function deserializeAssignmentTargetProperty(pos) { } function deserializeAssignmentTargetPropertyIdentifier(pos) { - let key = deserializeIdentifierReference(pos + 8), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), - init = deserializeOptionExpression(pos + 40), - keyCopy = { ...key }; - return { - type: 'Property', - kind: 'init', - key, - value: init === null ? keyCopy : { - type: 'AssignmentPattern', - left: keyCopy, - right: init, + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, start, end, range: [start, end], }, - method: false, - shorthand: true, - computed: false, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + init !== null && (value = { + type: 'AssignmentPattern', + left: value, + right: init, start, end, range: [start, end], - }; + }); + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + return node; } function deserializeAssignmentTargetPropertyProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeAssignmentTargetMaybeDefault(pos + 24), - method: false, - shorthand: false, - computed: deserializeBool(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + return node; } function deserializeSequenceExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SequenceExpression', - expressions: deserializeVecExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SequenceExpression', + expressions: null, + start, + end, + range: [start, end], + }; + node.expressions = deserializeVecExpression(pos + 8); + return node; } function deserializeSuper(pos) { @@ -985,25 +1092,31 @@ function deserializeSuper(pos) { } function deserializeAwaitExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AwaitExpression', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AwaitExpression', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeChainExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ChainExpression', - expression: deserializeChainElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ChainExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeChainElement(pos + 8); + return node; } function deserializeChainElement(pos) { @@ -1024,16 +1137,17 @@ function deserializeChainElement(pos) { } function deserializeParenthesizedExpression(pos) { - let node = deserializeExpression(pos + 8); + let node; { let start, end; node = { type: 'ParenthesizedExpression', - expression: node, + expression: null, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + node.expression = deserializeExpression(pos + 8); } return node; } @@ -1110,15 +1224,18 @@ function deserializeStatement(pos) { } function deserializeDirective(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeStringLiteral(pos + 8), - directive: deserializeStr(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeHashbang(pos) { @@ -1133,14 +1250,17 @@ function deserializeHashbang(pos) { } function deserializeBlockStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BlockStatement', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeDeclaration(pos) { @@ -1167,15 +1287,18 @@ function deserializeDeclaration(pos) { } function deserializeVariableDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclaration', - kind: deserializeVariableDeclarationKind(pos + 32), - declarations: deserializeVecVariableDeclarator(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + start, + end, + range: [start, end], + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + return node; } function deserializeVariableDeclarationKind(pos) { @@ -1196,15 +1319,19 @@ function deserializeVariableDeclarationKind(pos) { } function deserializeVariableDeclarator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclarator', - id: deserializeBindingPattern(pos + 8), - init: deserializeOptionExpression(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclarator', + id: null, + init: null, + start, + end, + range: [start, end], + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + return node; } function deserializeEmptyStatement(pos) { @@ -1218,65 +1345,87 @@ function deserializeEmptyStatement(pos) { } function deserializeExpressionStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeIfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'IfStatement', - test: deserializeExpression(pos + 8), - consequent: deserializeStatement(pos + 24), - alternate: deserializeOptionStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + return node; } function deserializeDoWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'DoWhileStatement', - body: deserializeStatement(pos + 8), - test: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + range: [start, end], + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + return node; } function deserializeWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WhileStatement', - test: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeForStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForStatement', - init: deserializeOptionForStatementInit(pos + 8), - test: deserializeOptionExpression(pos + 24), - update: deserializeOptionExpression(pos + 40), - body: deserializeStatement(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + range: [start, end], + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + return node; } function deserializeForStatementInit(pos) { @@ -1375,16 +1524,21 @@ function deserializeForStatementInit(pos) { } function deserializeForInStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForInStatement', - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeForStatementLeft(pos) { @@ -1417,134 +1571,176 @@ function deserializeForStatementLeft(pos) { } function deserializeForOfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForOfStatement', - await: deserializeBool(pos + 60), - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeContinueStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ContinueStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ContinueStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeBreakStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BreakStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BreakStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeReturnStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ReturnStatement', - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ReturnStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeWithStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WithStatement', - object: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeSwitchStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchStatement', - discriminant: deserializeExpression(pos + 8), - cases: deserializeVecSwitchCase(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + range: [start, end], + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + return node; } function deserializeSwitchCase(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchCase', - test: deserializeOptionExpression(pos + 8), - consequent: deserializeVecStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + range: [start, end], + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + return node; } function deserializeLabeledStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LabeledStatement', - label: deserializeLabelIdentifier(pos + 8), - body: deserializeStatement(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + range: [start, end], + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + return node; } function deserializeThrowStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ThrowStatement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ThrowStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeTryStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TryStatement', - block: deserializeBoxBlockStatement(pos + 8), - handler: deserializeOptionBoxCatchClause(pos + 16), - finalizer: deserializeOptionBoxBlockStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + range: [start, end], + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + return node; } function deserializeCatchClause(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CatchClause', - param: deserializeOptionCatchParameter(pos + 8), - body: deserializeBoxBlockStatement(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + range: [start, end], + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + return node; } function deserializeCatchParameter(pos) { @@ -1581,92 +1777,116 @@ function deserializeBindingPatternKind(pos) { } function deserializeAssignmentPattern(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - left: deserializeBindingPattern(pos + 8), - right: deserializeExpression(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + return node; } function deserializeObjectPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + properties: null, + start, + end, + range: [start, end], + }, properties = deserializeVecBindingProperty(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - properties, - start, - end, - range: [start, end], - }; + node.properties = properties; + return node; } function deserializeBindingProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeBindingPattern(pos + 24), - method: false, - shorthand: deserializeBool(pos + 56), - computed: deserializeBool(pos + 57), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + return node; } function deserializeArrayPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + elements: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionBindingPattern(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - elements, - start, - end, - range: [start, end], - }; + node.elements = elements; + return node; } function deserializeBindingRestElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - argument: deserializeBindingPattern(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeBindingPattern(pos + 8); + return node; } function deserializeFunction(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), params = deserializeBoxFormalParameters(pos + 56); - return { - type: deserializeFunctionType(pos + 84), - id: deserializeOptionBindingIdentifier(pos + 8), - generator: deserializeBool(pos + 85), - async: deserializeBool(pos + 86), - params, - body: deserializeOptionBoxFunctionBody(pos + 72), - expression: false, - start, - end, - range: [start, end], - }; -} - -function deserializeFunctionType(pos) { - switch (uint8[pos]) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + params: null, + body: null, + expression: null, + start, + end, + range: [start, end], + }, + params = deserializeBoxFormalParameters(pos + 56); + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.params = params; + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + return node; +} + +function deserializeFunctionType(pos) { + switch (uint8[pos]) { case 0: return 'FunctionDeclaration'; case 1: @@ -1684,14 +1904,17 @@ function deserializeFormalParameters(pos) { let params = deserializeVecFormalParameter(pos + 8); if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { pos = uint32[pos + 32 >> 2]; - let start, end; - params.push({ - type: 'RestElement', - argument: deserializeBindingPatternKind(pos + 8), - start: start = deserializeU32(pos), - end: end = deserializeU32(pos + 4), - range: [start, end], - }); + let start, + end, + rest = { + type: 'RestElement', + argument: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + params.push(rest); } return params; } @@ -1703,60 +1926,79 @@ function deserializeFormalParameter(pos) { } function deserializeFunctionBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'BlockStatement', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeArrowFunctionExpression(pos) { let expression = deserializeBool(pos + 44), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + params: null, + body: null, + id: null, + generator: null, + start, + end, + range: [start, end], + }, body = deserializeBoxFunctionBody(pos + 32); - return { - type: 'ArrowFunctionExpression', - expression, - async: deserializeBool(pos + 45), - params: deserializeBoxFormalParameters(pos + 16), - body: expression ? body.body[0].expression : body, - id: null, - generator: false, - start, - end, - range: [start, end], - }; + expression === true && (body = body.body[0].expression); + node.params = deserializeBoxFormalParameters(pos + 16); + node.body = body; + node.id = null; + node.generator = false; + return node; } function deserializeYieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'YieldExpression', - delegate: deserializeBool(pos + 24), - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeClass(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeClassType(pos + 132), - decorators: deserializeVecDecorator(pos + 8), - id: deserializeOptionBindingIdentifier(pos + 32), - superClass: deserializeOptionExpression(pos + 72), - body: deserializeBoxClassBody(pos + 120), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + superClass: null, + body: null, + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.superClass = deserializeOptionExpression(pos + 72); + node.body = deserializeBoxClassBody(pos + 120); + return node; } function deserializeClassType(pos) { @@ -1771,14 +2013,17 @@ function deserializeClassType(pos) { } function deserializeClassBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ClassBody', - body: deserializeVecClassElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ClassBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecClassElement(pos + 8); + return node; } function deserializeClassElement(pos) { @@ -1799,19 +2044,24 @@ function deserializeClassElement(pos) { } function deserializeMethodDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeMethodDefinitionType(pos + 56), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeBoxFunction(pos + 48), - kind: deserializeMethodDefinitionKind(pos + 57), - computed: deserializeBool(pos + 58), - static: deserializeBool(pos + 59), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + return node; } function deserializeMethodDefinitionType(pos) { @@ -1826,18 +2076,23 @@ function deserializeMethodDefinitionType(pos) { } function deserializePropertyDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializePropertyDefinitionType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializePropertyDefinitionType(pos) { @@ -1878,14 +2133,17 @@ function deserializePrivateIdentifier(pos) { } function deserializeStaticBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'StaticBlock', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'StaticBlock', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeAccessorPropertyType(pos) { @@ -1900,49 +2158,62 @@ function deserializeAccessorPropertyType(pos) { } function deserializeAccessorProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeAccessorPropertyType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializeImportExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportExpression', - source: deserializeExpression(pos + 8), - options: deserializeOptionExpression(pos + 24), - phase: deserializeOptionImportPhase(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + range: [start, end], + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + return node; } function deserializeImportDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + start, + end, + range: [start, end], + }, specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); specifiers === null && (specifiers = []); let withClause = deserializeOptionBoxWithClause(pos + 80); - return { - type: 'ImportDeclaration', - specifiers, - source: deserializeStringLiteral(pos + 32), - phase: deserializeOptionImportPhase(pos + 88), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - range: [start, end], - }; + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeImportPhase(pos) { @@ -1970,37 +2241,47 @@ function deserializeImportDeclarationSpecifier(pos) { } function deserializeImportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportSpecifier', - imported: deserializeModuleExportName(pos + 8), - local: deserializeBindingIdentifier(pos + 64), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportSpecifier', + imported: null, + local: null, + start, + end, + range: [start, end], + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + return node; } function deserializeImportDefaultSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportDefaultSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeImportNamespaceSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportNamespaceSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeWithClause(pos) { @@ -2008,15 +2289,19 @@ function deserializeWithClause(pos) { } function deserializeImportAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportAttribute', - key: deserializeImportAttributeKey(pos + 8), - value: deserializeStringLiteral(pos + 64), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + range: [start, end], + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + return node; } function deserializeImportAttributeKey(pos) { @@ -2031,55 +2316,73 @@ function deserializeImportAttributeKey(pos) { } function deserializeExportNamedDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), withClause = deserializeOptionBoxWithClause(pos + 96); - return { - type: 'ExportNamedDeclaration', - declaration: deserializeOptionDeclaration(pos + 8), - specifiers: deserializeVecExportSpecifier(pos + 24), - source: deserializeOptionStringLiteral(pos + 48), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + attributes: null, + start, + end, + range: [start, end], + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportDefaultDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportDefaultDeclaration', - declaration: deserializeExportDefaultDeclarationKind(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportDefaultDeclaration', + declaration: null, + start, + end, + range: [start, end], + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + return node; } function deserializeExportAllDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + start, + end, + range: [start, end], + }, withClause = deserializeOptionBoxWithClause(pos + 112); - return { - type: 'ExportAllDeclaration', - exported: deserializeOptionModuleExportName(pos + 8), - source: deserializeStringLiteral(pos + 64), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - range: [start, end], - }; + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportSpecifier', - local: deserializeModuleExportName(pos + 8), - exported: deserializeModuleExportName(pos + 64), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportSpecifier', + local: null, + exported: null, + start, + end, + range: [start, end], + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + return node; } function deserializeExportDefaultDeclarationKind(pos) { @@ -2195,39 +2498,51 @@ function deserializeModuleExportName(pos) { } function deserializeV8IntrinsicExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'V8IntrinsicExpression', - name: deserializeIdentifierName(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeBooleanLiteral(pos) { - let value = deserializeBool(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value, - raw: start === 0 && end === 0 ? null : value + '', - start, - end, - range: [start, end], - }; + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value, + raw: null, + start, + end, + range: [start, end], + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + return node; } function deserializeNullLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value: null, - raw: start === 0 && end === 0 ? null : 'null', - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: null, + start, + end, + range: [start, end], + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + return node; } function deserializeNumericLiteral(pos) { @@ -2243,46 +2558,61 @@ function deserializeNumericLiteral(pos) { } function deserializeStringLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), value = deserializeStr(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + }, + value = deserializeStr(pos + 8); deserializeBool(pos + 40) && (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 24), - start, - end, - range: [start, end], - }; + node.value = value; + return node; } function deserializeBigIntLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), bigint = deserializeStr(pos + 8); - return { - type: 'Literal', - value: BigInt(bigint), - raw: deserializeOptionStr(pos + 24), - bigint, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + range: [start, end], + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + return node; } function deserializeRegExpLiteral(pos) { - let regex = deserializeRegExp(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4), value = null; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + range: [start, end], + }, + regex = deserializeRegExp(pos + 8), + value = null; try { value = new RegExp(regex.pattern, regex.flags); } catch {} - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 40), - regex, - start, - end, - range: [start, end], - }; + node.value = value; + node.regex = regex; + return node; } function deserializeRegExp(pos) { @@ -2307,69 +2637,90 @@ function deserializeRegExpFlags(pos) { } function deserializeJSXElement(pos) { - let closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + range: [start, end], + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), openingElement = deserializeBoxJSXOpeningElement(pos + 8); closingElement === null && (openingElement.selfClosing = true); - return { - type: 'JSXElement', - openingElement, - children: deserializeVecJSXChild(pos + 16), - closingElement, - start, - end, - range: [start, end], - }; + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + return node; } function deserializeJSXOpeningElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningElement', - name: deserializeJSXElementName(pos + 8), - attributes: deserializeVecJSXAttributeItem(pos + 32), - selfClosing: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningElement', + name: null, + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + return node; } function deserializeJSXClosingElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXClosingElement', - name: deserializeJSXElementName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXClosingElement', + name: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + return node; } function deserializeJSXFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXFragment', - openingFragment: deserializeJSXOpeningFragment(pos + 8), - children: deserializeVecJSXChild(pos + 16), - closingFragment: deserializeJSXClosingFragment(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + range: [start, end], + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + return node; } function deserializeJSXOpeningFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningFragment', - attributes: [], - selfClosing: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningFragment', + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + }; + node.attributes = []; + node.selfClosing = false; + return node; } function deserializeJSXClosingFragment(pos) { @@ -2414,27 +2765,35 @@ function deserializeJSXElementName(pos) { } function deserializeJSXNamespacedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXNamespacedName', - namespace: deserializeJSXIdentifier(pos + 8), - name: deserializeJSXIdentifier(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + range: [start, end], + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + return node; } function deserializeJSXMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXMemberExpression', - object: deserializeJSXMemberExpressionObject(pos + 8), - property: deserializeJSXIdentifier(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + range: [start, end], + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + return node; } function deserializeJSXMemberExpressionObject(pos) { @@ -2465,14 +2824,17 @@ function deserializeJSXMemberExpressionObject(pos) { } function deserializeJSXExpressionContainer(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXExpressionContainer', - expression: deserializeJSXExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeJSXExpression(pos + 8); + return node; } function deserializeJSXExpression(pos) { @@ -2592,26 +2954,33 @@ function deserializeJSXAttributeItem(pos) { } function deserializeJSXAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXAttribute', - name: deserializeJSXAttributeName(pos + 8), - value: deserializeOptionJSXAttributeValue(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + return node; } function deserializeJSXSpreadAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadAttribute', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeJSXAttributeName(pos) { @@ -2669,16 +3038,19 @@ function deserializeJSXChild(pos) { } function deserializeJSXSpreadChild(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadChild', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; -} - + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; +} + function deserializeJSXText(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4); return { @@ -2692,55 +3064,73 @@ function deserializeJSXText(pos) { } function deserializeTSThisParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: 'this', - optional: false, - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 16), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + return node; } function deserializeTSEnumDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumDeclaration', - id: deserializeBindingIdentifier(pos + 8), - body: deserializeTSEnumBody(pos + 40), - const: deserializeBool(pos + 76), - declare: deserializeBool(pos + 77), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + return node; } function deserializeTSEnumBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumBody', - members: deserializeVecTSEnumMember(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumBody', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSEnumMember(pos + 8); + return node; } function deserializeTSEnumMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumMember', - id: deserializeTSEnumMemberName(pos + 8), - initializer: deserializeOptionExpression(pos + 24), - computed: deserializeU8(pos + 8) > 1, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + range: [start, end], + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + return node; } function deserializeTSEnumMemberName(pos) { @@ -2759,25 +3149,31 @@ function deserializeTSEnumMemberName(pos) { } function deserializeTSTypeAnnotation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAnnotation', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSLiteralType', - literal: deserializeTSLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSLiteralType', + literal: null, + start, + end, + range: [start, end], + }; + node.literal = deserializeTSLiteral(pos + 8); + return node; } function deserializeTSLiteral(pos) { @@ -2881,66 +3277,82 @@ function deserializeTSType(pos) { } function deserializeTSConditionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConditionalType', - checkType: deserializeTSType(pos + 8), - extendsType: deserializeTSType(pos + 24), - trueType: deserializeTSType(pos + 40), - falseType: deserializeTSType(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + range: [start, end], + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + return node; } function deserializeTSUnionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSUnionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSUnionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSIntersectionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIntersectionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIntersectionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSParenthesizedType(pos) { - let node = deserializeTSType(pos + 8); + let node; { let start, end; node = { type: 'TSParenthesizedType', - typeAnnotation: node, + typeAnnotation: null, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + node.typeAnnotation = deserializeTSType(pos + 8); } return node; } function deserializeTSTypeOperator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeOperator', - operator: deserializeTSTypeOperatorOperator(pos + 24), - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperatorOperator(pos) { @@ -2957,72 +3369,92 @@ function deserializeTSTypeOperatorOperator(pos) { } function deserializeTSArrayType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSArrayType', - elementType: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSArrayType', + elementType: null, + start, + end, + range: [start, end], + }; + node.elementType = deserializeTSType(pos + 8); + return node; } function deserializeTSIndexedAccessType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexedAccessType', - objectType: deserializeTSType(pos + 8), - indexType: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + range: [start, end], + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + return node; } function deserializeTSTupleType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTupleType', - elementTypes: deserializeVecTSTupleElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + range: [start, end], + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + return node; } function deserializeTSNamedTupleMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamedTupleMember', - label: deserializeIdentifierName(pos + 8), - elementType: deserializeTSTupleElement(pos + 32), - optional: deserializeBool(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + range: [start, end], + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + return node; } function deserializeTSOptionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSOptionalType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSRestType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSRestType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTupleElement(pos) { @@ -3251,15 +3683,19 @@ function deserializeTSBigIntKeyword(pos) { } function deserializeTSTypeReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeReference', - typeName: deserializeTSTypeName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeName(pos) { @@ -3276,110 +3712,145 @@ function deserializeTSTypeName(pos) { } function deserializeTSQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSTypeName(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; -} + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; +} function deserializeTSTypeParameterInstantiation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterInstantiation', - params: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSType(pos + 8); + return node; } function deserializeTSTypeParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameter', - name: deserializeBindingIdentifier(pos + 8), - constraint: deserializeOptionTSType(pos + 40), - default: deserializeOptionTSType(pos + 56), - in: deserializeBool(pos + 72), - out: deserializeBool(pos + 73), - const: deserializeBool(pos + 74), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + range: [start, end], + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + return node; } function deserializeTSTypeParameterDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterDeclaration', - params: deserializeVecTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeAliasDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAliasDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - typeAnnotation: deserializeTSType(pos + 48), - declare: deserializeBool(pos + 68), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + return node; } function deserializeTSInterfaceDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - extends: deserializeVecTSInterfaceHeritage(pos + 48), - body: deserializeBoxTSInterfaceBody(pos + 72), - declare: deserializeBool(pos + 84), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + return node; } function deserializeTSInterfaceBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceBody', - body: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSPropertySignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSPropertySignature', - computed: deserializeBool(pos + 32), - optional: deserializeBool(pos + 33), - readonly: deserializeBool(pos + 34), - key: deserializePropertyKey(pos + 8), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - accessibility: null, - static: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + return node; } function deserializeTSSignature(pos) { @@ -3400,35 +3871,44 @@ function deserializeTSSignature(pos) { } function deserializeTSIndexSignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexSignature', - parameters: deserializeVecTSIndexSignatureName(pos + 8), - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 32), - readonly: deserializeBool(pos + 40), - static: deserializeBool(pos + 41), - accessibility: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + range: [start, end], + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + return node; } function deserializeTSCallSignatureDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSCallSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSMethodSignatureKind(pos) { @@ -3447,77 +3927,103 @@ function deserializeTSMethodSignatureKind(pos) { function deserializeTSMethodSignature(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 40), thisParam = deserializeOptionBoxTSThisParameter(pos + 32); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSMethodSignature', - key: deserializePropertyKey(pos + 8), - computed: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - kind: deserializeTSMethodSignatureKind(pos + 62), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 24), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 48), - accessibility: null, - readonly: false, - static: false, - start, - end, - range: [start, end], - }; + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + return node; } function deserializeTSConstructSignatureDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSIndexSignatureName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSInterfaceHeritage(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceHeritage', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypePredicate(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypePredicate', - parameterName: deserializeTSTypePredicateName(pos + 8), - asserts: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSTypePredicateName(pos) { @@ -3537,56 +4043,24 @@ function deserializeTSModuleDeclaration(pos) { start = deserializeU32(pos), end = deserializeU32(pos + 4), declare = deserializeBool(pos + 85), - id = deserializeTSModuleDeclarationName(pos + 8), + node, body = deserializeOptionTSModuleDeclarationBody(pos + 64); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - let start, end; - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: start = id.start, - end: end = innerId.end, - range: [start, end], - }; - } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - for (;;) { - innerId.start = innerId.range[0] = id.start; - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; - } - let start, end; - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: start = id.start, - end: end = innerId.left.end, - range: [start, end], - }; - id = body.id; - } - body = Object.hasOwn(body, 'body') ? body.body : null; - } - return body === null - ? { + if (body === null) { + node = { type: 'TSModuleDeclaration', - id, + id: null, kind, declare, global, start, end, range: [start, end], - } - : { + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = { type: 'TSModuleDeclaration', - id, + id: null, body, kind, declare, @@ -3595,6 +4069,47 @@ function deserializeTSModuleDeclaration(pos) { end, range: [start, end], }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') node.id = id; + else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + node.id = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + range: [start, end], + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + let { start } = id; + for (;;) { + innerId.start = innerId.range[0] = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let end, right = innerId.left; + innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + range: [start, end], + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + } else body = null; + } + } + return node; } function deserializeTSModuleDeclarationKind(pos) { @@ -3633,49 +4148,63 @@ function deserializeTSModuleDeclarationBody(pos) { } function deserializeTSModuleBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSModuleBlock', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'TSModuleBlock', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeTSTypeLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeLiteral', - members: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeLiteral', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSInferType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInferType', - typeParameter: deserializeBoxTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; -} - -function deserializeTSTypeQuery(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeQuery', - exprName: deserializeTSTypeQueryExprName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInferType', + typeParameter: null, + start, + end, + range: [start, end], + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + return node; +} + +function deserializeTSTypeQuery(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeQueryExprName(pos) { @@ -3694,17 +4223,23 @@ function deserializeTSTypeQueryExprName(pos) { } function deserializeTSImportType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportType', - argument: deserializeTSType(pos + 8), - options: deserializeOptionBoxObjectExpression(pos + 24), - qualifier: deserializeOptionTSImportTypeQualifier(pos + 32), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + return node; } function deserializeTSImportTypeQualifier(pos) { @@ -3719,66 +4254,87 @@ function deserializeTSImportTypeQualifier(pos) { } function deserializeTSImportTypeQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSImportTypeQualifier(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSFunctionType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSFunctionType', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSConstructorType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructorType', - abstract: deserializeBool(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSMappedType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + range: [start, end], + }, typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name, + { constraint } = typeParameter, optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); optional === null && (optional = false); - return { - type: 'TSMappedType', - key: typeParameter.name, - constraint: typeParameter.constraint, - nameType: deserializeOptionTSType(pos + 16), - typeAnnotation: deserializeOptionTSType(pos + 32), - optional, - readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), - start, - end, - range: [start, end], - }; + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + return node; } function deserializeTSMappedTypeModifierOperator(pos) { @@ -3795,64 +4351,84 @@ function deserializeTSMappedTypeModifierOperator(pos) { } function deserializeTSTemplateLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTemplateLiteralType', - quasis: deserializeVecTemplateElement(pos + 8), - types: deserializeVecTSType(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + return node; } function deserializeTSAsExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSAsExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSSatisfiesExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSSatisfiesExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSTypeAssertion(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAssertion', - typeAnnotation: deserializeTSType(pos + 8), - expression: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + return node; } function deserializeTSImportEqualsDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportEqualsDeclaration', - id: deserializeBindingIdentifier(pos + 8), - moduleReference: deserializeTSModuleReference(pos + 40), - importKind: deserializeImportOrExportKind(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + return node; } function deserializeTSModuleReference(pos) { @@ -3871,70 +4447,89 @@ function deserializeTSModuleReference(pos) { } function deserializeTSExternalModuleReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExternalModuleReference', - expression: deserializeStringLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeTSNonNullExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNonNullExpression', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeDecorator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Decorator', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Decorator', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSExportAssignment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExportAssignment', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExportAssignment', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSNamespaceExportDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamespaceExportDeclaration', - id: deserializeIdentifierName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + range: [start, end], + }; + node.id = deserializeIdentifierName(pos + 8); + return node; } function deserializeTSInstantiationExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInstantiationExpression', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeImportOrExportKind(pos) { @@ -3949,27 +4544,33 @@ function deserializeImportOrExportKind(pos) { } function deserializeJSDocNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocNonNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNonNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocUnknownType(pos) { @@ -3997,14 +4598,16 @@ function deserializeComment(pos) { let type = deserializeCommentKind(pos + 12), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type, + value: null, + start, + end, + range: [start, end], + }, endCut = type === 'Line' ? 0 : 2; - return { - type, - value: sourceText.slice(start + 2, end - endCut), - start, - end, - range: [start, end], - }; + node.value = sourceText.slice(start + 2, end - endCut); + return node; } function deserializeNameSpan(pos) { diff --git a/napi/parser/generated/deserialize/js_range_parent.js b/napi/parser/generated/deserialize/js_range_parent.js new file mode 100644 index 0000000000000..432e005800d37 --- /dev/null +++ b/napi/parser/generated/deserialize/js_range_parent.js @@ -0,0 +1,6809 @@ +// Auto-generated code, DO NOT EDIT DIRECTLY! +// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`. + +let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen; +const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }), + decodeStr = textDecoder.decode.bind(textDecoder), + { fromCodePoint } = String; +let parent = null; + +export function deserialize(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData); +} + +export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram); +} + +function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) { + uint8 = buffer; + uint32 = buffer.uint32; + float64 = buffer.float64; + sourceText = sourceTextInput; + sourceByteLen = sourceByteLenInput; + sourceIsAscii = sourceText.length === sourceByteLen; + let data = deserialize(uint32[536870902]); + uint8 = + uint32 = + float64 = + sourceText = + void 0; + return data; +} + +function deserializeProgram(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + program = parent = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start, + end, + range: [start, end], + parent: null, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + (program.body = deserializeVecDirective(pos + 72)).push(...deserializeVecStatement(pos + 96)); + parent = null; + return program; +} + +function deserializeExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Expression`); + } +} + +function deserializeIdentifierName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; + parent = previousParent; + return node; +} + +function deserializeIdentifierReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; + parent = previousParent; + return node; +} + +function deserializeBindingIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; + parent = previousParent; + return node; +} + +function deserializeLabelIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; + parent = previousParent; + return node; +} + +function deserializeThisExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'ThisExpression', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeArrayExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayExpression', + elements: null, + start, + end, + range: [start, end], + parent, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArrayExpressionElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + case 65: + return deserializeElision(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ArrayExpressionElement`); + } +} + +function deserializeElision(pos) { + return null; +} + +function deserializeObjectExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectExpression', + properties: null, + start, + end, + range: [start, end], + parent, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeObjectPropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxObjectProperty(pos + 8); + case 1: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ObjectPropertyKind`); + } +} + +function deserializeObjectProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + start, + end, + range: [start, end], + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePropertyKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxIdentifierName(pos + 8); + case 65: + return deserializeBoxPrivateIdentifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKey`); + } +} + +function deserializePropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return 'init'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKind`); + } +} + +function deserializeTemplateLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + range: [start, end], + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTaggedTemplateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TaggedTemplateExpression', + tag: null, + quasi: null, + start, + end, + range: [start, end], + parent, + }; + node.tag = deserializeExpression(pos + 8); + node.quasi = deserializeTemplateLiteral(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTemplateElement(pos) { + let tail = deserializeBool(pos + 40), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + value = deserializeTemplateElementValue(pos + 8); + value.cooked !== null && deserializeBool(pos + 41) && + (value.cooked = value.cooked.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + return { + type: 'TemplateElement', + value, + tail, + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTemplateElementValue(pos) { + return { + raw: deserializeStr(pos), + cooked: deserializeOptionStr(pos + 16), + }; +} + +function deserializeComputedMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + parent = previousParent; + return node; +} + +function deserializeStaticMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializePrivateFieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeCallExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CallExpression', + callee: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeNewExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'NewExpression', + callee: null, + arguments: null, + start, + end, + range: [start, end], + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeMetaProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + range: [start, end], + parent, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + parent = previousParent; + return node; +} + +function deserializeSpreadElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SpreadElement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArgument(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Argument`); + } +} + +function deserializeUpdateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeUnaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + parent = previousParent; + return node; +} + +function deserializeBinaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePrivateInExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeLogicalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeConditionalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeAssignmentExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTarget`); + } +} + +function deserializeSimpleAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for SimpleAssignmentTarget`); + } +} + +function deserializeArrayAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + elements: null, + start, + end, + range: [start, end], + parent, + }, + elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && elements.push(rest); + node.elements = elements; + parent = previousParent; + return node; +} + +function deserializeObjectAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + properties: null, + start, + end, + range: [start, end], + parent, + }, + properties = deserializeVecAssignmentTargetProperty(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && properties.push(rest); + node.properties = properties; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetRest(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetMaybeDefault(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxAssignmentTargetWithDefault(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetMaybeDefault`); + } +} + +function deserializeAssignmentTargetWithDefault(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetProperty(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxAssignmentTargetPropertyIdentifier(pos + 8); + case 1: + return deserializeBoxAssignmentTargetPropertyProperty(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetProperty`); + } +} + +function deserializeAssignmentTargetPropertyIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + start, + end, + range: [start, end], + parent, + }, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + if (init !== null) { + let left = value, previousParent = parent; + value = parent = { + type: 'AssignmentPattern', + left, + right: init, + start, + end, + range: [start, end], + parent, + }; + left.parent = value; + init.parent = value; + parent = previousParent; + } + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetPropertyProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + start, + end, + range: [start, end], + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + parent = previousParent; + return node; +} + +function deserializeSequenceExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SequenceExpression', + expressions: null, + start, + end, + range: [start, end], + parent, + }; + node.expressions = deserializeVecExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeSuper(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Super', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeAwaitExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AwaitExpression', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ChainExpression', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeChainElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxCallExpression(pos + 8); + case 1: + return deserializeBoxTSNonNullExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ChainElement`); + } +} + +function deserializeParenthesizedExpression(pos) { + let node; + { + let start, end, previousParent = parent; + node = parent = { + type: 'ParenthesizedExpression', + expression: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeStatement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBlockStatement(pos + 8); + case 1: + return deserializeBoxBreakStatement(pos + 8); + case 2: + return deserializeBoxContinueStatement(pos + 8); + case 3: + return deserializeBoxDebuggerStatement(pos + 8); + case 4: + return deserializeBoxDoWhileStatement(pos + 8); + case 5: + return deserializeBoxEmptyStatement(pos + 8); + case 6: + return deserializeBoxExpressionStatement(pos + 8); + case 7: + return deserializeBoxForInStatement(pos + 8); + case 8: + return deserializeBoxForOfStatement(pos + 8); + case 9: + return deserializeBoxForStatement(pos + 8); + case 10: + return deserializeBoxIfStatement(pos + 8); + case 11: + return deserializeBoxLabeledStatement(pos + 8); + case 12: + return deserializeBoxReturnStatement(pos + 8); + case 13: + return deserializeBoxSwitchStatement(pos + 8); + case 14: + return deserializeBoxThrowStatement(pos + 8); + case 15: + return deserializeBoxTryStatement(pos + 8); + case 16: + return deserializeBoxWhileStatement(pos + 8); + case 17: + return deserializeBoxWithStatement(pos + 8); + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + case 64: + return deserializeBoxImportDeclaration(pos + 8); + case 65: + return deserializeBoxExportAllDeclaration(pos + 8); + case 66: + return deserializeBoxExportDefaultDeclaration(pos + 8); + case 67: + return deserializeBoxExportNamedDeclaration(pos + 8); + case 68: + return deserializeBoxTSExportAssignment(pos + 8); + case 69: + return deserializeBoxTSNamespaceExportDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Statement`); + } +} + +function deserializeDirective(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeHashbang(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Hashbang', + value: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeBlockStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDeclaration(pos) { + switch (uint8[pos]) { + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Declaration`); + } +} + +function deserializeVariableDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + start, + end, + range: [start, end], + parent, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + parent = previousParent; + return node; +} + +function deserializeVariableDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'var'; + case 1: + return 'let'; + case 2: + return 'const'; + case 3: + return 'using'; + case 4: + return 'await using'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for VariableDeclarationKind`); + } +} + +function deserializeVariableDeclarator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclarator', + id: null, + init: null, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeEmptyStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'EmptyStatement', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeExpressionStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeIfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeDoWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeForStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + parent = previousParent; + return node; +} + +function deserializeForStatementInit(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxVariableDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementInit`); + } +} + +function deserializeForInStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeForStatementLeft(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxVariableDeclaration(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementLeft`); + } +} + +function deserializeForOfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeContinueStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ContinueStatement', + label: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeBreakStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BreakStatement', + label: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeReturnStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ReturnStatement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + range: [start, end], + parent, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchCase(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeLabeledStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeThrowStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ThrowStatement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTryStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + range: [start, end], + parent, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeCatchClause(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + parent = previousParent; + return node; +} + +function deserializeCatchParameter(pos) { + return deserializeBindingPattern(pos + 8); +} + +function deserializeDebuggerStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'DebuggerStatement', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeBindingPattern(pos) { + return deserializeBindingPatternKind(pos); +} + +function deserializeBindingPatternKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBindingIdentifier(pos + 8); + case 1: + return deserializeBoxObjectPattern(pos + 8); + case 2: + return deserializeBoxArrayPattern(pos + 8); + case 3: + return deserializeBoxAssignmentPattern(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BindingPatternKind`); + } +} + +function deserializeAssignmentPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeObjectPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + properties: null, + start, + end, + range: [start, end], + parent, + }, + properties = deserializeVecBindingProperty(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && properties.push(rest); + node.properties = properties; + parent = previousParent; + return node; +} + +function deserializeBindingProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + start, + end, + range: [start, end], + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + parent = previousParent; + return node; +} + +function deserializeArrayPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + elements: null, + start, + end, + range: [start, end], + parent, + }, + elements = deserializeVecOptionBindingPattern(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && elements.push(rest); + node.elements = elements; + parent = previousParent; + return node; +} + +function deserializeBindingRestElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeBindingPattern(pos + 8); + parent = previousParent; + return node; +} + +function deserializeFunction(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + params: null, + body: null, + expression: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 56); + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.params = params; + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + parent = previousParent; + return node; +} + +function deserializeFunctionType(pos) { + switch (uint8[pos]) { + case 0: + return 'FunctionDeclaration'; + case 1: + return 'FunctionExpression'; + case 2: + return 'TSDeclareFunction'; + case 3: + return 'TSEmptyBodyFunctionExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for FunctionType`); + } +} + +function deserializeFormalParameters(pos) { + let params = deserializeVecFormalParameter(pos + 8); + if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { + pos = uint32[pos + 32 >> 2]; + let start, + end, + previousParent = parent, + rest = parent = { + type: 'RestElement', + argument: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + params.push(rest); + parent = previousParent; + } + return params; +} + +function deserializeFormalParameter(pos) { + let param; + param = deserializeBindingPatternKind(pos + 32); + return param; +} + +function deserializeFunctionBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeArrowFunctionExpression(pos) { + let expression = deserializeBool(pos + 44), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + params: null, + body: null, + id: null, + generator: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeBoxFunctionBody(pos + 32); + if (expression === true) { + body = body.body[0].expression; + body.parent = parent; + } + node.params = deserializeBoxFormalParameters(pos + 16); + node.body = body; + node.id = null; + node.generator = false; + parent = previousParent; + return node; +} + +function deserializeYieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClass(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + superClass: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.superClass = deserializeOptionExpression(pos + 72); + node.body = deserializeBoxClassBody(pos + 120); + parent = previousParent; + return node; +} + +function deserializeClassType(pos) { + switch (uint8[pos]) { + case 0: + return 'ClassDeclaration'; + case 1: + return 'ClassExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassType`); + } +} + +function deserializeClassBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ClassBody', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecClassElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClassElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStaticBlock(pos + 8); + case 1: + return deserializeBoxMethodDefinition(pos + 8); + case 2: + return deserializeBoxPropertyDefinition(pos + 8); + case 3: + return deserializeBoxAccessorProperty(pos + 8); + case 4: + return deserializeBoxTSIndexSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassElement`); + } +} + +function deserializeMethodDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + parent = previousParent; + return node; +} + +function deserializeMethodDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'MethodDefinition'; + case 1: + return 'TSAbstractMethodDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionType`); + } +} + +function deserializePropertyDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializePropertyDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'PropertyDefinition'; + case 1: + return 'TSAbstractPropertyDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyDefinitionType`); + } +} + +function deserializeMethodDefinitionKind(pos) { + switch (uint8[pos]) { + case 0: + return 'constructor'; + case 1: + return 'method'; + case 2: + return 'get'; + case 3: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionKind`); + } +} + +function deserializePrivateIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'PrivateIdentifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeStaticBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'StaticBlock', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAccessorPropertyType(pos) { + switch (uint8[pos]) { + case 0: + return 'AccessorProperty'; + case 1: + return 'TSAbstractAccessorProperty'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AccessorPropertyType`); + } +} + +function deserializeAccessorProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializeImportExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + range: [start, end], + parent, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + start, + end, + range: [start, end], + parent, + }, + specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); + specifiers === null && (specifiers = []); + let withClause = deserializeOptionBoxWithClause(pos + 80); + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeImportPhase(pos) { + switch (uint8[pos]) { + case 0: + return 'source'; + case 1: + return 'defer'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportPhase`); + } +} + +function deserializeImportDeclarationSpecifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxImportSpecifier(pos + 8); + case 1: + return deserializeBoxImportDefaultSpecifier(pos + 8); + case 2: + return deserializeBoxImportNamespaceSpecifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportDeclarationSpecifier`); + } +} + +function deserializeImportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportSpecifier', + imported: null, + local: null, + start, + end, + range: [start, end], + parent, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportDefaultSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeImportNamespaceSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithClause(pos) { + return { attributes: deserializeVecImportAttribute(pos + 8) }; +} + +function deserializeImportAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportAttributeKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportAttributeKey`); + } +} + +function deserializeExportNamedDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + attributes: null, + start, + end, + range: [start, end], + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportDefaultDeclaration', + declaration: null, + start, + end, + range: [start, end], + parent, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeExportAllDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + start, + end, + range: [start, end], + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 112); + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportSpecifier', + local: null, + exported: null, + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxFunction(pos + 8); + case 65: + return deserializeBoxClass(pos + 8); + case 66: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportDefaultDeclarationKind`); + } +} + +function deserializeModuleExportName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeIdentifierReference(pos + 8); + case 2: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleExportName`); + } +} + +function deserializeV8IntrinsicExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeBooleanLiteral(pos) { + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value, + raw: null, + start, + end, + range: [start, end], + parent, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + parent = previousParent; + return node; +} + +function deserializeNullLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: null, + start, + end, + range: [start, end], + parent, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + parent = previousParent; + return node; +} + +function deserializeNumericLiteral(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Literal', + value: deserializeF64(pos + 8), + raw: deserializeOptionStr(pos + 16), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeStringLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + parent, + }, + value = deserializeStr(pos + 8); + deserializeBool(pos + 40) && + (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + node.value = value; + parent = previousParent; + return node; +} + +function deserializeBigIntLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + range: [start, end], + parent, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + parent = previousParent; + return node; +} + +function deserializeRegExpLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + range: [start, end], + parent, + }, + regex = deserializeRegExp(pos + 8), + value = null; + try { + value = new RegExp(regex.pattern, regex.flags); + } catch {} + node.value = value; + node.regex = regex; + parent = previousParent; + return node; +} + +function deserializeRegExp(pos) { + return { + pattern: deserializeStr(pos), + flags: deserializeRegExpFlags(pos + 24), + }; +} + +function deserializeRegExpFlags(pos) { + let flagBits = deserializeU8(pos), flags = ''; + // Alphabetical order + flagBits & 64 && (flags += 'd'); + flagBits & 1 && (flags += 'g'); + flagBits & 2 && (flags += 'i'); + flagBits & 4 && (flags += 'm'); + flagBits & 8 && (flags += 's'); + flagBits & 16 && (flags += 'u'); + flagBits & 128 && (flags += 'v'); + flagBits & 32 && (flags += 'y'); + return flags; +} + +function deserializeJSXElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + range: [start, end], + parent, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), + openingElement = deserializeBoxJSXOpeningElement(pos + 8); + closingElement === null && (openingElement.selfClosing = true); + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + parent = previousParent; + return node; +} + +function deserializeJSXOpeningElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningElement', + name: null, + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXClosingElement', + name: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + range: [start, end], + parent, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + parent = previousParent; + return node; +} + +function deserializeJSXOpeningFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningFragment', + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + parent, + }; + node.attributes = []; + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingFragment(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXClosingFragment', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXElementName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + range: ident.range, + parent, + }; + case 2: + return deserializeBoxJSXNamespacedName(pos + 8); + case 3: + return deserializeBoxJSXMemberExpression(pos + 8); + case 4: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + range: thisExpr.range, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXElementName`); + } +} + +function deserializeJSXNamespacedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + range: [start, end], + parent, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpressionObject(pos) { + switch (uint8[pos]) { + case 0: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + range: ident.range, + parent, + }; + case 1: + return deserializeBoxJSXMemberExpression(pos + 8); + case 2: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + range: thisExpr.range, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXMemberExpressionObject`); + } +} + +function deserializeJSXExpressionContainer(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeJSXExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeJSXEmptyExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXExpression`); + } +} + +function deserializeJSXEmptyExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXEmptyExpression', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXAttributeItem(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXAttribute(pos + 8); + case 1: + return deserializeBoxJSXSpreadAttribute(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeItem`); + } +} + +function deserializeJSXAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXSpreadAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXAttributeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + return deserializeBoxJSXNamespacedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeName`); + } +} + +function deserializeJSXAttributeValue(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStringLiteral(pos + 8); + case 1: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 2: + return deserializeBoxJSXElement(pos + 8); + case 3: + return deserializeBoxJSXFragment(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeValue`); + } +} + +function deserializeJSXIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXIdentifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXChild(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXText(pos + 8); + case 1: + return deserializeBoxJSXElement(pos + 8); + case 2: + return deserializeBoxJSXFragment(pos + 8); + case 3: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 4: + return deserializeBoxJSXSpreadChild(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXChild`); + } +} + +function deserializeJSXSpreadChild(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXText(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXText', + value: deserializeStr(pos + 8), + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSThisParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + return node; +} + +function deserializeTSEnumDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSEnumBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumBody', + members: null, + start, + end, + range: [start, end], + parent, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSEnumMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + parent = previousParent; + return node; +} + +function deserializeTSEnumMemberName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxStringLiteral(pos + 8); + case 2: + return deserializeBoxStringLiteral(pos + 8); + case 3: + return deserializeBoxTemplateLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSEnumMemberName`); + } +} + +function deserializeTSTypeAnnotation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSLiteralType', + literal: null, + start, + end, + range: [start, end], + parent, + }; + node.literal = deserializeTSLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteral(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNumericLiteral(pos + 8); + case 2: + return deserializeBoxBigIntLiteral(pos + 8); + case 3: + return deserializeBoxStringLiteral(pos + 8); + case 4: + return deserializeBoxTemplateLiteral(pos + 8); + case 5: + return deserializeBoxUnaryExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSLiteral`); + } +} + +function deserializeTSType(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSType`); + } +} + +function deserializeTSConditionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + range: [start, end], + parent, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSUnionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSUnionType', + types: null, + start, + end, + range: [start, end], + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIntersectionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIntersectionType', + types: null, + start, + end, + range: [start, end], + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSParenthesizedType(pos) { + let node; + { + let start, end, previousParent = parent; + node = parent = { + type: 'TSParenthesizedType', + typeAnnotation: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeTSTypeOperator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeOperatorOperator(pos) { + switch (uint8[pos]) { + case 0: + return 'keyof'; + case 1: + return 'unique'; + case 2: + return 'readonly'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeOperatorOperator`); + } +} + +function deserializeTSArrayType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSArrayType', + elementType: null, + start, + end, + range: [start, end], + parent, + }; + node.elementType = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIndexedAccessType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + range: [start, end], + parent, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTupleType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + range: [start, end], + parent, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamedTupleMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSOptionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSRestType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTupleElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + case 64: + return deserializeBoxTSOptionalType(pos + 8); + case 65: + return deserializeBoxTSRestType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTupleElement`); + } +} + +function deserializeTSAnyKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSAnyKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSStringKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSStringKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSBooleanKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBooleanKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNumberKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNumberKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNeverKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNeverKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSIntrinsicKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSIntrinsicKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSUnknownKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUnknownKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNullKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNullKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSUndefinedKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUndefinedKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSVoidKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSVoidKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSSymbolKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSSymbolKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSThisType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSThisType', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSObjectKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSObjectKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSBigIntKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBigIntKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSTypeReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeName`); + } +} + +function deserializeTSQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterInstantiation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + range: [start, end], + parent, + }; + node.params = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + range: [start, end], + parent, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeAliasDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceBody', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSPropertySignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + range: [start, end], + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSSignature(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSIndexSignature(pos + 8); + case 1: + return deserializeBoxTSPropertySignature(pos + 8); + case 2: + return deserializeBoxTSCallSignatureDeclaration(pos + 8); + case 3: + return deserializeBoxTSConstructSignatureDeclaration(pos + 8); + case 4: + return deserializeBoxTSMethodSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSSignature`); + } +} + +function deserializeTSIndexSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + range: [start, end], + parent, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + parent = previousParent; + return node; +} + +function deserializeTSCallSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSMethodSignatureKind(pos) { + switch (uint8[pos]) { + case 0: + return 'method'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMethodSignatureKind`); + } +} + +function deserializeTSMethodSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 40), + thisParam = deserializeOptionBoxTSThisParameter(pos + 32); + thisParam !== null && params.unshift(thisParam); + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSConstructSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSIndexSignatureName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceHeritage(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicate(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicateName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeTSThisType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypePredicateName`); + } +} + +function deserializeTSModuleDeclaration(pos) { + let kind = deserializeTSModuleDeclarationKind(pos + 84), + global = kind === 'global', + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + declare = deserializeBool(pos + 85), + node, + previousParent = parent, + body = deserializeOptionTSModuleDeclarationBody(pos + 64); + if (body === null) { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + kind, + declare, + global, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + body, + kind, + declare, + global, + start, + end, + range: [start, end], + parent, + }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') { + node.id = id; + body.parent = node; + } else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + id.parent = + innerId.parent = + node.id = + parent = + { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + range: [start, end], + parent: node, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + innerId.parent = node; + let { start } = id; + for (;;) { + innerId.start = innerId.range[0] = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let end, right = innerId.left; + id.parent = right.parent = innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + range: [start, end], + parent: innerId, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + body.parent = node; + } else body = null; + } + } + parent = previousParent; + return node; +} + +function deserializeTSModuleDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'global'; + case 1: + return 'module'; + case 2: + return 'namespace'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationKind`); + } +} + +function deserializeTSModuleDeclarationName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBindingIdentifier(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationName`); + } +} + +function deserializeTSModuleDeclarationBody(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 1: + return deserializeBoxTSModuleBlock(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationBody`); + } +} + +function deserializeTSModuleBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSModuleBlock', + body: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeTSTypeLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeLiteral', + members: null, + start, + end, + range: [start, end], + parent, + }; + node.members = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInferType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInferType', + typeParameter: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeQuery(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeQueryExprName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSImportType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeQueryExprName`); + } +} + +function deserializeTSImportType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSImportTypeQualifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxTSImportTypeQualifiedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSImportTypeQualifier`); + } +} + +function deserializeTSImportTypeQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSFunctionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSConstructorType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSMappedType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + range: [start, end], + parent, + }, + typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name; + key.parent = parent; + let { constraint } = typeParameter; + constraint !== null && (constraint.parent = parent); + let optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); + optional === null && (optional = false); + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + parent = previousParent; + return node; +} + +function deserializeTSMappedTypeModifierOperator(pos) { + switch (uint8[pos]) { + case 0: + return true; + case 1: + return '+'; + case 2: + return '-'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMappedTypeModifierOperator`); + } +} + +function deserializeTSTemplateLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + range: [start, end], + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSAsExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSSatisfiesExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeAssertion(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSImportEqualsDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSModuleReference(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSExternalModuleReference(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleReference`); + } +} + +function deserializeTSExternalModuleReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNonNullExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDecorator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Decorator', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSExportAssignment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExportAssignment', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamespaceExportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeIdentifierName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInstantiationExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportOrExportKind(pos) { + switch (uint8[pos]) { + case 0: + return 'value'; + case 1: + return 'type'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportOrExportKind`); + } +} + +function deserializeJSDocNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocNonNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocUnknownType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSJSDocUnknownType', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeCommentKind(pos) { + switch (uint8[pos]) { + case 0: + return 'Line'; + case 1: + return 'Block'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for CommentKind`); + } +} + +function deserializeComment(pos) { + let type = deserializeCommentKind(pos + 12), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type, + value: null, + start, + end, + range: [start, end], + parent, + }, + endCut = type === 'Line' ? 0 : 2; + node.value = sourceText.slice(start + 2, end - endCut); + parent = previousParent; + return node; +} + +function deserializeNameSpan(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + value: deserializeStr(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeImportEntry(pos) { + return { + importName: deserializeImportImportName(pos + 32), + localName: deserializeNameSpan(pos + 64), + isType: deserializeBool(pos + 88), + }; +} + +function deserializeImportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + return { + kind: 'NamespaceObject', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 2: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + range: [start, end], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportImportName`); + } +} + +function deserializeExportEntry(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeOptionNameSpan(pos + 16), + importName: deserializeExportImportName(pos + 40), + exportName: deserializeExportExportName(pos + 72), + localName: deserializeExportLocalName(pos + 104), + isType: deserializeBool(pos + 136), + start, + end, + range: [start, end], + }; +} + +function deserializeExportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + return { + kind: 'All', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 2: + return { + kind: 'AllButDefault', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 3: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportImportName`); + } +} + +function deserializeExportExportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + range: [start, end], + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportExportName`); + } +} + +function deserializeExportLocalName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Default', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportLocalName`); + } +} + +function deserializeDynamicImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeSpan(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeAssignmentOperator(pos) { + switch (uint8[pos]) { + case 0: + return '='; + case 1: + return '+='; + case 2: + return '-='; + case 3: + return '*='; + case 4: + return '/='; + case 5: + return '%='; + case 6: + return '**='; + case 7: + return '<<='; + case 8: + return '>>='; + case 9: + return '>>>='; + case 10: + return '|='; + case 11: + return '^='; + case 12: + return '&='; + case 13: + return '||='; + case 14: + return '&&='; + case 15: + return '??='; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentOperator`); + } +} + +function deserializeBinaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '=='; + case 1: + return '!='; + case 2: + return '==='; + case 3: + return '!=='; + case 4: + return '<'; + case 5: + return '<='; + case 6: + return '>'; + case 7: + return '>='; + case 8: + return '+'; + case 9: + return '-'; + case 10: + return '*'; + case 11: + return '/'; + case 12: + return '%'; + case 13: + return '**'; + case 14: + return '<<'; + case 15: + return '>>'; + case 16: + return '>>>'; + case 17: + return '|'; + case 18: + return '^'; + case 19: + return '&'; + case 20: + return 'in'; + case 21: + return 'instanceof'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BinaryOperator`); + } +} + +function deserializeLogicalOperator(pos) { + switch (uint8[pos]) { + case 0: + return '||'; + case 1: + return '&&'; + case 2: + return '??'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for LogicalOperator`); + } +} + +function deserializeUnaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '+'; + case 1: + return '-'; + case 2: + return '!'; + case 3: + return '~'; + case 4: + return 'typeof'; + case 5: + return 'void'; + case 6: + return 'delete'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UnaryOperator`); + } +} + +function deserializeUpdateOperator(pos) { + switch (uint8[pos]) { + case 0: + return '++'; + case 1: + return '--'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UpdateOperator`); + } +} + +function deserializeSpan(pos) { + return { + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + }; +} + +function deserializeModuleKind(pos) { + switch (uint8[pos]) { + case 0: + return 'script'; + case 1: + return 'module'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleKind`); + } +} + +function deserializeRawTransferData(pos) { + return { + program: deserializeProgram(pos), + comments: deserializeVecComment(pos + 128), + module: deserializeEcmaScriptModule(pos + 152), + errors: deserializeVecError(pos + 256), + }; +} + +function deserializeError(pos) { + return { + severity: deserializeErrorSeverity(pos + 72), + message: deserializeStr(pos), + labels: deserializeVecErrorLabel(pos + 16), + helpMessage: deserializeOptionStr(pos + 40), + codeframe: deserializeStr(pos + 56), + }; +} + +function deserializeErrorSeverity(pos) { + switch (uint8[pos]) { + case 0: + return 'Error'; + case 1: + return 'Warning'; + case 2: + return 'Advice'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ErrorSeverity`); + } +} + +function deserializeErrorLabel(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + message: deserializeOptionStr(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeEcmaScriptModule(pos) { + return { + hasModuleSyntax: deserializeBool(pos + 96), + staticImports: deserializeVecStaticImport(pos), + staticExports: deserializeVecStaticExport(pos + 24), + dynamicImports: deserializeVecDynamicImport(pos + 48), + importMetas: deserializeVecSpan(pos + 72), + }; +} + +function deserializeStaticImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeNameSpan(pos + 8), + entries: deserializeVecImportEntry(pos + 32), + start, + end, + range: [start, end], + }; +} + +function deserializeStaticExport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + entries: deserializeVecExportEntry(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeU32(pos) { + return uint32[pos >> 2]; +} + +function deserializeU8(pos) { + return uint8[pos]; +} + +function deserializeStr(pos) { + let pos32 = pos >> 2, len = uint32[pos32 + 2]; + if (len === 0) return ''; + pos = uint32[pos32]; + if (sourceIsAscii && pos < sourceByteLen) return sourceText.substr(pos, len); + // Longer strings use `TextDecoder` + // TODO: Find best switch-over point + let end = pos + len; + if (len > 50) return decodeStr(uint8.subarray(pos, end)); + // Shorter strings decode by hand to avoid native call + let out = '', c; + do { + c = uint8[pos++]; + if (c < 128) out += fromCodePoint(c); + else { + out += decodeStr(uint8.subarray(pos - 1, end)); + break; + } + } while (pos < end); + return out; +} + +function deserializeVecComment(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeComment(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionHashbang(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeHashbang(pos); +} + +function deserializeVecDirective(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeDirective(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecStatement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeStatement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxBooleanLiteral(pos) { + return deserializeBooleanLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNullLiteral(pos) { + return deserializeNullLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNumericLiteral(pos) { + return deserializeNumericLiteral(uint32[pos >> 2]); +} + +function deserializeBoxBigIntLiteral(pos) { + return deserializeBigIntLiteral(uint32[pos >> 2]); +} + +function deserializeBoxRegExpLiteral(pos) { + return deserializeRegExpLiteral(uint32[pos >> 2]); +} + +function deserializeBoxStringLiteral(pos) { + return deserializeStringLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTemplateLiteral(pos) { + return deserializeTemplateLiteral(uint32[pos >> 2]); +} + +function deserializeBoxIdentifierReference(pos) { + return deserializeIdentifierReference(uint32[pos >> 2]); +} + +function deserializeBoxMetaProperty(pos) { + return deserializeMetaProperty(uint32[pos >> 2]); +} + +function deserializeBoxSuper(pos) { + return deserializeSuper(uint32[pos >> 2]); +} + +function deserializeBoxArrayExpression(pos) { + return deserializeArrayExpression(uint32[pos >> 2]); +} + +function deserializeBoxArrowFunctionExpression(pos) { + return deserializeArrowFunctionExpression(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentExpression(pos) { + return deserializeAssignmentExpression(uint32[pos >> 2]); +} + +function deserializeBoxAwaitExpression(pos) { + return deserializeAwaitExpression(uint32[pos >> 2]); +} + +function deserializeBoxBinaryExpression(pos) { + return deserializeBinaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxCallExpression(pos) { + return deserializeCallExpression(uint32[pos >> 2]); +} + +function deserializeBoxChainExpression(pos) { + return deserializeChainExpression(uint32[pos >> 2]); +} + +function deserializeBoxClass(pos) { + return deserializeClass(uint32[pos >> 2]); +} + +function deserializeBoxConditionalExpression(pos) { + return deserializeConditionalExpression(uint32[pos >> 2]); +} + +function deserializeBoxFunction(pos) { + return deserializeFunction(uint32[pos >> 2]); +} + +function deserializeBoxImportExpression(pos) { + return deserializeImportExpression(uint32[pos >> 2]); +} + +function deserializeBoxLogicalExpression(pos) { + return deserializeLogicalExpression(uint32[pos >> 2]); +} + +function deserializeBoxNewExpression(pos) { + return deserializeNewExpression(uint32[pos >> 2]); +} + +function deserializeBoxObjectExpression(pos) { + return deserializeObjectExpression(uint32[pos >> 2]); +} + +function deserializeBoxParenthesizedExpression(pos) { + return deserializeParenthesizedExpression(uint32[pos >> 2]); +} + +function deserializeBoxSequenceExpression(pos) { + return deserializeSequenceExpression(uint32[pos >> 2]); +} + +function deserializeBoxTaggedTemplateExpression(pos) { + return deserializeTaggedTemplateExpression(uint32[pos >> 2]); +} + +function deserializeBoxThisExpression(pos) { + return deserializeThisExpression(uint32[pos >> 2]); +} + +function deserializeBoxUnaryExpression(pos) { + return deserializeUnaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxUpdateExpression(pos) { + return deserializeUpdateExpression(uint32[pos >> 2]); +} + +function deserializeBoxYieldExpression(pos) { + return deserializeYieldExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateInExpression(pos) { + return deserializePrivateInExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXElement(pos) { + return deserializeJSXElement(uint32[pos >> 2]); +} + +function deserializeBoxJSXFragment(pos) { + return deserializeJSXFragment(uint32[pos >> 2]); +} + +function deserializeBoxTSAsExpression(pos) { + return deserializeTSAsExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSSatisfiesExpression(pos) { + return deserializeTSSatisfiesExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAssertion(pos) { + return deserializeTSTypeAssertion(uint32[pos >> 2]); +} + +function deserializeBoxTSNonNullExpression(pos) { + return deserializeTSNonNullExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSInstantiationExpression(pos) { + return deserializeTSInstantiationExpression(uint32[pos >> 2]); +} + +function deserializeBoxV8IntrinsicExpression(pos) { + return deserializeV8IntrinsicExpression(uint32[pos >> 2]); +} + +function deserializeVecArrayExpressionElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArrayExpressionElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxSpreadElement(pos) { + return deserializeSpreadElement(uint32[pos >> 2]); +} + +function deserializeVecObjectPropertyKind(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeObjectPropertyKind(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxObjectProperty(pos) { + return deserializeObjectProperty(uint32[pos >> 2]); +} + +function deserializeBool(pos) { + return uint8[pos] === 1; +} + +function deserializeBoxIdentifierName(pos) { + return deserializeIdentifierName(uint32[pos >> 2]); +} + +function deserializeBoxPrivateIdentifier(pos) { + return deserializePrivateIdentifier(uint32[pos >> 2]); +} + +function deserializeVecTemplateElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeTemplateElement(pos)); + pos += 48; + } + return arr; +} + +function deserializeVecExpression(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeExpression(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSTypeParameterInstantiation(pos) { + return deserializeTSTypeParameterInstantiation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterInstantiation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterInstantiation(pos); +} + +function deserializeOptionStr(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeStr(pos); +} + +function deserializeBoxComputedMemberExpression(pos) { + return deserializeComputedMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxStaticMemberExpression(pos) { + return deserializeStaticMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateFieldExpression(pos) { + return deserializePrivateFieldExpression(uint32[pos >> 2]); +} + +function deserializeVecArgument(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArgument(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxArrayAssignmentTarget(pos) { + return deserializeArrayAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeBoxObjectAssignmentTarget(pos) { + return deserializeObjectAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeOptionAssignmentTargetMaybeDefault(pos) { + if (uint8[pos] === 51) return null; + return deserializeAssignmentTargetMaybeDefault(pos); +} + +function deserializeVecOptionAssignmentTargetMaybeDefault(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeOptionAssignmentTargetMaybeDefault(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetRest(pos) { + return deserializeAssignmentTargetRest(uint32[pos >> 2]); +} + +function deserializeOptionBoxAssignmentTargetRest(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxAssignmentTargetRest(pos); +} + +function deserializeVecAssignmentTargetProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeAssignmentTargetProperty(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetWithDefault(pos) { + return deserializeAssignmentTargetWithDefault(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyIdentifier(pos) { + return deserializeAssignmentTargetPropertyIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyProperty(pos) { + return deserializeAssignmentTargetPropertyProperty(uint32[pos >> 2]); +} + +function deserializeOptionExpression(pos) { + if (uint8[pos] === 51) return null; + return deserializeExpression(pos); +} + +function deserializeBoxBlockStatement(pos) { + return deserializeBlockStatement(uint32[pos >> 2]); +} + +function deserializeBoxBreakStatement(pos) { + return deserializeBreakStatement(uint32[pos >> 2]); +} + +function deserializeBoxContinueStatement(pos) { + return deserializeContinueStatement(uint32[pos >> 2]); +} + +function deserializeBoxDebuggerStatement(pos) { + return deserializeDebuggerStatement(uint32[pos >> 2]); +} + +function deserializeBoxDoWhileStatement(pos) { + return deserializeDoWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxEmptyStatement(pos) { + return deserializeEmptyStatement(uint32[pos >> 2]); +} + +function deserializeBoxExpressionStatement(pos) { + return deserializeExpressionStatement(uint32[pos >> 2]); +} + +function deserializeBoxForInStatement(pos) { + return deserializeForInStatement(uint32[pos >> 2]); +} + +function deserializeBoxForOfStatement(pos) { + return deserializeForOfStatement(uint32[pos >> 2]); +} + +function deserializeBoxForStatement(pos) { + return deserializeForStatement(uint32[pos >> 2]); +} + +function deserializeBoxIfStatement(pos) { + return deserializeIfStatement(uint32[pos >> 2]); +} + +function deserializeBoxLabeledStatement(pos) { + return deserializeLabeledStatement(uint32[pos >> 2]); +} + +function deserializeBoxReturnStatement(pos) { + return deserializeReturnStatement(uint32[pos >> 2]); +} + +function deserializeBoxSwitchStatement(pos) { + return deserializeSwitchStatement(uint32[pos >> 2]); +} + +function deserializeBoxThrowStatement(pos) { + return deserializeThrowStatement(uint32[pos >> 2]); +} + +function deserializeBoxTryStatement(pos) { + return deserializeTryStatement(uint32[pos >> 2]); +} + +function deserializeBoxWhileStatement(pos) { + return deserializeWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxWithStatement(pos) { + return deserializeWithStatement(uint32[pos >> 2]); +} + +function deserializeBoxVariableDeclaration(pos) { + return deserializeVariableDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAliasDeclaration(pos) { + return deserializeTSTypeAliasDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSInterfaceDeclaration(pos) { + return deserializeTSInterfaceDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSEnumDeclaration(pos) { + return deserializeTSEnumDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSModuleDeclaration(pos) { + return deserializeTSModuleDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSImportEqualsDeclaration(pos) { + return deserializeTSImportEqualsDeclaration(uint32[pos >> 2]); +} + +function deserializeVecVariableDeclarator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeVariableDeclarator(pos)); + pos += 64; + } + return arr; +} + +function deserializeOptionStatement(pos) { + if (uint8[pos] === 70) return null; + return deserializeStatement(pos); +} + +function deserializeOptionForStatementInit(pos) { + if (uint8[pos] === 65) return null; + return deserializeForStatementInit(pos); +} + +function deserializeOptionLabelIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeLabelIdentifier(pos); +} + +function deserializeVecSwitchCase(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeSwitchCase(pos)); + pos += 48; + } + return arr; +} + +function deserializeBoxCatchClause(pos) { + return deserializeCatchClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxCatchClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxCatchClause(pos); +} + +function deserializeOptionBoxBlockStatement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBlockStatement(pos); +} + +function deserializeOptionCatchParameter(pos) { + if (uint8[pos + 32] === 2) return null; + return deserializeCatchParameter(pos); +} + +function deserializeBoxTSTypeAnnotation(pos) { + return deserializeTSTypeAnnotation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeAnnotation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeAnnotation(pos); +} + +function deserializeBoxBindingIdentifier(pos) { + return deserializeBindingIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxObjectPattern(pos) { + return deserializeObjectPattern(uint32[pos >> 2]); +} + +function deserializeBoxArrayPattern(pos) { + return deserializeArrayPattern(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentPattern(pos) { + return deserializeAssignmentPattern(uint32[pos >> 2]); +} + +function deserializeVecBindingProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeBindingProperty(pos)); + pos += 64; + } + return arr; +} + +function deserializeBoxBindingRestElement(pos) { + return deserializeBindingRestElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxBindingRestElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBindingRestElement(pos); +} + +function deserializeOptionBindingPattern(pos) { + if (uint8[pos + 24] === 2) return null; + return deserializeBindingPattern(pos); +} + +function deserializeVecOptionBindingPattern(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeOptionBindingPattern(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionBindingIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeBindingIdentifier(pos); +} + +function deserializeBoxTSTypeParameterDeclaration(pos) { + return deserializeTSTypeParameterDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterDeclaration(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterDeclaration(pos); +} + +function deserializeBoxTSThisParameter(pos) { + return deserializeTSThisParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSThisParameter(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSThisParameter(pos); +} + +function deserializeBoxFormalParameters(pos) { + return deserializeFormalParameters(uint32[pos >> 2]); +} + +function deserializeBoxFunctionBody(pos) { + return deserializeFunctionBody(uint32[pos >> 2]); +} + +function deserializeOptionBoxFunctionBody(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxFunctionBody(pos); +} + +function deserializeVecFormalParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeFormalParameter(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecDecorator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeDecorator(pos)); + pos += 24; + } + return arr; +} + +function deserializeBoxClassBody(pos) { + return deserializeClassBody(uint32[pos >> 2]); +} + +function deserializeVecClassElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeClassElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxStaticBlock(pos) { + return deserializeStaticBlock(uint32[pos >> 2]); +} + +function deserializeBoxMethodDefinition(pos) { + return deserializeMethodDefinition(uint32[pos >> 2]); +} + +function deserializeBoxPropertyDefinition(pos) { + return deserializePropertyDefinition(uint32[pos >> 2]); +} + +function deserializeBoxAccessorProperty(pos) { + return deserializeAccessorProperty(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexSignature(pos) { + return deserializeTSIndexSignature(uint32[pos >> 2]); +} + +function deserializeBoxImportDeclaration(pos) { + return deserializeImportDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportAllDeclaration(pos) { + return deserializeExportAllDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportDefaultDeclaration(pos) { + return deserializeExportDefaultDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportNamedDeclaration(pos) { + return deserializeExportNamedDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSExportAssignment(pos) { + return deserializeTSExportAssignment(uint32[pos >> 2]); +} + +function deserializeBoxTSNamespaceExportDeclaration(pos) { + return deserializeTSNamespaceExportDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionImportPhase(pos) { + if (uint8[pos] === 2) return null; + return deserializeImportPhase(pos); +} + +function deserializeVecImportDeclarationSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeImportDeclarationSpecifier(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionVecImportDeclarationSpecifier(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeVecImportDeclarationSpecifier(pos); +} + +function deserializeBoxWithClause(pos) { + return deserializeWithClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxWithClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxWithClause(pos); +} + +function deserializeBoxImportSpecifier(pos) { + return deserializeImportSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportDefaultSpecifier(pos) { + return deserializeImportDefaultSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportNamespaceSpecifier(pos) { + return deserializeImportNamespaceSpecifier(uint32[pos >> 2]); +} + +function deserializeVecImportAttribute(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 112; + for (; pos !== endPos;) { + arr.push(deserializeImportAttribute(pos)); + pos += 112; + } + return arr; +} + +function deserializeOptionDeclaration(pos) { + if (uint8[pos] === 31) return null; + return deserializeDeclaration(pos); +} + +function deserializeVecExportSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 128; + for (; pos !== endPos;) { + arr.push(deserializeExportSpecifier(pos)); + pos += 128; + } + return arr; +} + +function deserializeOptionStringLiteral(pos) { + if (uint8[pos + 40] === 2) return null; + return deserializeStringLiteral(pos); +} + +function deserializeOptionModuleExportName(pos) { + if (uint8[pos] === 3) return null; + return deserializeModuleExportName(pos); +} + +function deserializeF64(pos) { + return float64[pos >> 3]; +} + +function deserializeBoxJSXOpeningElement(pos) { + return deserializeJSXOpeningElement(uint32[pos >> 2]); +} + +function deserializeVecJSXChild(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXChild(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXClosingElement(pos) { + return deserializeJSXClosingElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxJSXClosingElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxJSXClosingElement(pos); +} + +function deserializeVecJSXAttributeItem(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXAttributeItem(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXIdentifier(pos) { + return deserializeJSXIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxJSXNamespacedName(pos) { + return deserializeJSXNamespacedName(uint32[pos >> 2]); +} + +function deserializeBoxJSXMemberExpression(pos) { + return deserializeJSXMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXAttribute(pos) { + return deserializeJSXAttribute(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadAttribute(pos) { + return deserializeJSXSpreadAttribute(uint32[pos >> 2]); +} + +function deserializeOptionJSXAttributeValue(pos) { + if (uint8[pos] === 4) return null; + return deserializeJSXAttributeValue(pos); +} + +function deserializeBoxJSXExpressionContainer(pos) { + return deserializeJSXExpressionContainer(uint32[pos >> 2]); +} + +function deserializeBoxJSXText(pos) { + return deserializeJSXText(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadChild(pos) { + return deserializeJSXSpreadChild(uint32[pos >> 2]); +} + +function deserializeVecTSEnumMember(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 40; + for (; pos !== endPos;) { + arr.push(deserializeTSEnumMember(pos)); + pos += 40; + } + return arr; +} + +function deserializeBoxTSAnyKeyword(pos) { + return deserializeTSAnyKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBigIntKeyword(pos) { + return deserializeTSBigIntKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBooleanKeyword(pos) { + return deserializeTSBooleanKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSIntrinsicKeyword(pos) { + return deserializeTSIntrinsicKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNeverKeyword(pos) { + return deserializeTSNeverKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNullKeyword(pos) { + return deserializeTSNullKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNumberKeyword(pos) { + return deserializeTSNumberKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSObjectKeyword(pos) { + return deserializeTSObjectKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSStringKeyword(pos) { + return deserializeTSStringKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSSymbolKeyword(pos) { + return deserializeTSSymbolKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUndefinedKeyword(pos) { + return deserializeTSUndefinedKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUnknownKeyword(pos) { + return deserializeTSUnknownKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSVoidKeyword(pos) { + return deserializeTSVoidKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSArrayType(pos) { + return deserializeTSArrayType(uint32[pos >> 2]); +} + +function deserializeBoxTSConditionalType(pos) { + return deserializeTSConditionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructorType(pos) { + return deserializeTSConstructorType(uint32[pos >> 2]); +} + +function deserializeBoxTSFunctionType(pos) { + return deserializeTSFunctionType(uint32[pos >> 2]); +} + +function deserializeBoxTSImportType(pos) { + return deserializeTSImportType(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexedAccessType(pos) { + return deserializeTSIndexedAccessType(uint32[pos >> 2]); +} + +function deserializeBoxTSInferType(pos) { + return deserializeTSInferType(uint32[pos >> 2]); +} + +function deserializeBoxTSIntersectionType(pos) { + return deserializeTSIntersectionType(uint32[pos >> 2]); +} + +function deserializeBoxTSLiteralType(pos) { + return deserializeTSLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSMappedType(pos) { + return deserializeTSMappedType(uint32[pos >> 2]); +} + +function deserializeBoxTSNamedTupleMember(pos) { + return deserializeTSNamedTupleMember(uint32[pos >> 2]); +} + +function deserializeBoxTSTemplateLiteralType(pos) { + return deserializeTSTemplateLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSThisType(pos) { + return deserializeTSThisType(uint32[pos >> 2]); +} + +function deserializeBoxTSTupleType(pos) { + return deserializeTSTupleType(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeLiteral(pos) { + return deserializeTSTypeLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeOperator(pos) { + return deserializeTSTypeOperator(uint32[pos >> 2]); +} + +function deserializeBoxTSTypePredicate(pos) { + return deserializeTSTypePredicate(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeQuery(pos) { + return deserializeTSTypeQuery(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeReference(pos) { + return deserializeTSTypeReference(uint32[pos >> 2]); +} + +function deserializeBoxTSUnionType(pos) { + return deserializeTSUnionType(uint32[pos >> 2]); +} + +function deserializeBoxTSParenthesizedType(pos) { + return deserializeTSParenthesizedType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNullableType(pos) { + return deserializeJSDocNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNonNullableType(pos) { + return deserializeJSDocNonNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocUnknownType(pos) { + return deserializeJSDocUnknownType(uint32[pos >> 2]); +} + +function deserializeVecTSType(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSType(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecTSTupleElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSTupleElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSOptionalType(pos) { + return deserializeTSOptionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSRestType(pos) { + return deserializeTSRestType(uint32[pos >> 2]); +} + +function deserializeBoxTSQualifiedName(pos) { + return deserializeTSQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSType(pos) { + if (uint8[pos] === 38) return null; + return deserializeTSType(pos); +} + +function deserializeVecTSTypeParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeTSTypeParameter(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecTSInterfaceHeritage(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSInterfaceHeritage(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxTSInterfaceBody(pos) { + return deserializeTSInterfaceBody(uint32[pos >> 2]); +} + +function deserializeVecTSSignature(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSSignature(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSPropertySignature(pos) { + return deserializeTSPropertySignature(uint32[pos >> 2]); +} + +function deserializeBoxTSCallSignatureDeclaration(pos) { + return deserializeTSCallSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructSignatureDeclaration(pos) { + return deserializeTSConstructSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSMethodSignature(pos) { + return deserializeTSMethodSignature(uint32[pos >> 2]); +} + +function deserializeVecTSIndexSignatureName(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSIndexSignatureName(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionTSModuleDeclarationBody(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSModuleDeclarationBody(pos); +} + +function deserializeBoxTSModuleBlock(pos) { + return deserializeTSModuleBlock(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeParameter(pos) { + return deserializeTSTypeParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxObjectExpression(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxObjectExpression(pos); +} + +function deserializeOptionTSImportTypeQualifier(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSImportTypeQualifier(pos); +} + +function deserializeBoxTSImportTypeQualifiedName(pos) { + return deserializeTSImportTypeQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSMappedTypeModifierOperator(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSMappedTypeModifierOperator(pos); +} + +function deserializeBoxTSExternalModuleReference(pos) { + return deserializeTSExternalModuleReference(uint32[pos >> 2]); +} + +function deserializeOptionNameSpan(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + +function deserializeVecError(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeError(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecErrorLabel(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeErrorLabel(pos)); + pos += 24; + } + return arr; +} + +function deserializeVecStaticImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 56; + for (; pos !== endPos;) { + arr.push(deserializeStaticImport(pos)); + pos += 56; + } + return arr; +} + +function deserializeVecStaticExport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeStaticExport(pos)); + pos += 32; + } + return arr; +} + +function deserializeVecDynamicImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeDynamicImport(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecSpan(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 8; + for (; pos !== endPos;) { + arr.push(deserializeSpan(pos)); + pos += 8; + } + return arr; +} + +function deserializeVecImportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 96; + for (; pos !== endPos;) { + arr.push(deserializeImportEntry(pos)); + pos += 96; + } + return arr; +} + +function deserializeVecExportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 144; + for (; pos !== endPos;) { + arr.push(deserializeExportEntry(pos)); + pos += 144; + } + return arr; +} diff --git a/napi/parser/generated/deserialize/ts.js b/napi/parser/generated/deserialize/ts.js index 36d0f2af094c2..08f5cdc215a27 100644 --- a/napi/parser/generated/deserialize/ts.js +++ b/napi/parser/generated/deserialize/ts.js @@ -31,28 +31,34 @@ function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserializ } function deserializeProgram(pos) { - let body = deserializeVecDirective(pos + 72); + let end = deserializeU32(pos + 4), + program = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start: 0, + end, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + let body = program.body = deserializeVecDirective(pos + 72); body.push(...deserializeVecStatement(pos + 96)); - let end = deserializeU32(pos + 4), start; - if (body.length > 0) { - let first = body[0]; - start = first.start; - if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { - let { declaration } = first; - if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { - let decoratorStart = declaration.decorators[0].start; - decoratorStart < start && (start = decoratorStart); + { + let start; + if (body.length > 0) { + let first = body[0]; + start = first.start; + if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { + let { declaration } = first; + if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { + let decoratorStart = declaration.decorators[0].start; + decoratorStart < start && (start = decoratorStart); + } } - } - } else start = end; - return { - type: 'Program', - body, - sourceType: deserializeModuleKind(pos + 125), - hashbang: deserializeOptionHashbang(pos + 48), - start, - end, - }; + } else start = end; + program.start = start; + } + return program; } function deserializeExpression(pos) { @@ -149,55 +155,75 @@ function deserializeExpression(pos) { } function deserializeIdentifierName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeIdentifierReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeLabelIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeThisExpression(pos) { @@ -210,13 +236,16 @@ function deserializeThisExpression(pos) { } function deserializeArrayExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ArrayExpression', - elements: deserializeVecArrayExpressionElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ArrayExpression', + elements: null, + start, + end, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + return node; } function deserializeArrayExpressionElement(pos) { @@ -321,13 +350,16 @@ function deserializeElision(pos) { } function deserializeObjectExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ObjectExpression', - properties: deserializeVecObjectPropertyKind(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ObjectExpression', + properties: null, + start, + end, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + return node; } function deserializeObjectPropertyKind(pos) { @@ -342,19 +374,24 @@ function deserializeObjectPropertyKind(pos) { } function deserializeObjectProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: deserializePropertyKind(pos + 40), - key: deserializePropertyKey(pos + 8), - value: deserializeExpression(pos + 24), - method: deserializeBool(pos + 41), - shorthand: deserializeBool(pos + 42), - computed: deserializeBool(pos + 43), - optional: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + optional: null, + start, + end, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + node.optional = false; + return node; } function deserializePropertyKey(pos) { @@ -468,26 +505,35 @@ function deserializePropertyKind(pos) { } function deserializeTemplateLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TemplateLiteral', - quasis: deserializeVecTemplateElement(pos + 8), - expressions: deserializeVecExpression(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + return node; } function deserializeTaggedTemplateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TaggedTemplateExpression', - tag: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - quasi: deserializeTemplateLiteral(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TaggedTemplateExpression', + tag: null, + typeArguments: null, + quasi: null, + start, + end, + }; + node.tag = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.quasi = deserializeTemplateLiteral(pos + 32); + return node; } function deserializeTemplateElement(pos) { @@ -514,88 +560,120 @@ function deserializeTemplateElementValue(pos) { } function deserializeComputedMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeExpression(pos + 24), - optional: deserializeBool(pos + 40), - computed: true, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + return node; } function deserializeStaticMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeIdentifierName(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + return node; } function deserializePrivateFieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializePrivateIdentifier(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + return node; } function deserializeCallExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CallExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - optional: deserializeBool(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CallExpression', + callee: null, + typeArguments: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeNewExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'NewExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'NewExpression', + callee: null, + typeArguments: null, + arguments: null, + start, + end, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeMetaProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MetaProperty', - meta: deserializeIdentifierName(pos + 8), - property: deserializeIdentifierName(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + return node; } function deserializeSpreadElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SpreadElement', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SpreadElement', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeArgument(pos) { @@ -694,87 +772,116 @@ function deserializeArgument(pos) { } function deserializeUpdateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UpdateExpression', - operator: deserializeUpdateOperator(pos + 24), - prefix: deserializeBool(pos + 25), - argument: deserializeSimpleAssignmentTarget(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + return node; } function deserializeUnaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UnaryExpression', - operator: deserializeUnaryOperator(pos + 24), - argument: deserializeExpression(pos + 8), - prefix: true, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + return node; } function deserializeBinaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializeExpression(pos + 8), - operator: deserializeBinaryOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializePrivateInExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializePrivateIdentifier(pos + 8), - operator: 'in', - right: deserializeExpression(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + return node; } function deserializeLogicalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LogicalExpression', - left: deserializeExpression(pos + 8), - operator: deserializeLogicalOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeConditionalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ConditionalExpression', - test: deserializeExpression(pos + 8), - consequent: deserializeExpression(pos + 24), - alternate: deserializeExpression(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + return node; } function deserializeAssignmentExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentExpression', - operator: deserializeAssignmentOperator(pos + 40), - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTarget(pos) { @@ -830,49 +937,66 @@ function deserializeSimpleAssignmentTarget(pos) { function deserializeArrayAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + }, elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + }, properties = deserializeVecAssignmentTargetProperty(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetRest(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeAssignmentTarget(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + }; + node.decorators = []; + node.argument = deserializeAssignmentTarget(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeAssignmentTargetMaybeDefault(pos) { @@ -905,17 +1029,24 @@ function deserializeAssignmentTargetMaybeDefault(pos) { } function deserializeAssignmentTargetWithDefault(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetProperty(pos) { @@ -930,58 +1061,78 @@ function deserializeAssignmentTargetProperty(pos) { } function deserializeAssignmentTargetPropertyIdentifier(pos) { - let key = deserializeIdentifierReference(pos + 8), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), - init = deserializeOptionExpression(pos + 40), - keyCopy = { ...key }; - return { - type: 'Property', - kind: 'init', - key, - value: init === null ? keyCopy : { - type: 'AssignmentPattern', - decorators: [], - left: keyCopy, - right: init, - optional: false, - typeAnnotation: null, + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + optional: null, start, end, }, - method: false, - shorthand: true, - computed: false, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + init !== null && (value = { + type: 'AssignmentPattern', + decorators: [], + left: value, + right: init, optional: false, + typeAnnotation: null, start, end, - }; + }); + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + node.optional = false; + return node; } function deserializeAssignmentTargetPropertyProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeAssignmentTargetMaybeDefault(pos + 24), - method: false, - shorthand: false, - computed: deserializeBool(pos + 40), - optional: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + optional: null, + start, + end, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + node.optional = false; + return node; } function deserializeSequenceExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SequenceExpression', - expressions: deserializeVecExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SequenceExpression', + expressions: null, + start, + end, + }; + node.expressions = deserializeVecExpression(pos + 8); + return node; } function deserializeSuper(pos) { @@ -994,23 +1145,29 @@ function deserializeSuper(pos) { } function deserializeAwaitExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AwaitExpression', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AwaitExpression', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeChainExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ChainExpression', - expression: deserializeChainElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ChainExpression', + expression: null, + start, + end, + }; + node.expression = deserializeChainElement(pos + 8); + return node; } function deserializeChainElement(pos) { @@ -1031,13 +1188,14 @@ function deserializeChainElement(pos) { } function deserializeParenthesizedExpression(pos) { - let node = deserializeExpression(pos + 8); + let node; node = { type: 'ParenthesizedExpression', - expression: node, + expression: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), }; + node.expression = deserializeExpression(pos + 8); return node; } @@ -1113,14 +1271,17 @@ function deserializeStatement(pos) { } function deserializeDirective(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeStringLiteral(pos + 8), - directive: deserializeStr(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeHashbang(pos) { @@ -1134,13 +1295,16 @@ function deserializeHashbang(pos) { } function deserializeBlockStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BlockStatement', - body: deserializeVecStatement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeDeclaration(pos) { @@ -1167,15 +1331,18 @@ function deserializeDeclaration(pos) { } function deserializeVariableDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclaration', - kind: deserializeVariableDeclarationKind(pos + 32), - declarations: deserializeVecVariableDeclarator(pos + 8), - declare: deserializeBool(pos + 33), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + declare: deserializeBool(pos + 33), + start, + end, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + return node; } function deserializeVariableDeclarationKind(pos) { @@ -1196,15 +1363,19 @@ function deserializeVariableDeclarationKind(pos) { } function deserializeVariableDeclarator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclarator', - id: deserializeBindingPattern(pos + 8), - init: deserializeOptionExpression(pos + 40), - definite: deserializeBool(pos + 57), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclarator', + id: null, + init: null, + definite: deserializeBool(pos + 57), + start, + end, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + return node; } function deserializeEmptyStatement(pos) { @@ -1217,61 +1388,84 @@ function deserializeEmptyStatement(pos) { } function deserializeExpressionStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeExpression(pos + 8), - directive: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.directive = null; + return node; } function deserializeIfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'IfStatement', - test: deserializeExpression(pos + 8), - consequent: deserializeStatement(pos + 24), - alternate: deserializeOptionStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + return node; } function deserializeDoWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'DoWhileStatement', - body: deserializeStatement(pos + 8), - test: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + return node; } function deserializeWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WhileStatement', - test: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeForStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForStatement', - init: deserializeOptionForStatementInit(pos + 8), - test: deserializeOptionExpression(pos + 24), - update: deserializeOptionExpression(pos + 40), - body: deserializeStatement(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + return node; } function deserializeForStatementInit(pos) { @@ -1370,15 +1564,20 @@ function deserializeForStatementInit(pos) { } function deserializeForInStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForInStatement', - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeForStatementLeft(pos) { @@ -1411,123 +1610,165 @@ function deserializeForStatementLeft(pos) { } function deserializeForOfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForOfStatement', - await: deserializeBool(pos + 60), - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeContinueStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ContinueStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ContinueStatement', + label: null, + start, + end, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeBreakStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BreakStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BreakStatement', + label: null, + start, + end, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeReturnStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ReturnStatement', - argument: deserializeOptionExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ReturnStatement', + argument: null, + start, + end, + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeWithStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WithStatement', - object: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeSwitchStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchStatement', - discriminant: deserializeExpression(pos + 8), - cases: deserializeVecSwitchCase(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + return node; } function deserializeSwitchCase(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchCase', - test: deserializeOptionExpression(pos + 8), - consequent: deserializeVecStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + return node; } function deserializeLabeledStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LabeledStatement', - label: deserializeLabelIdentifier(pos + 8), - body: deserializeStatement(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + return node; } function deserializeThrowStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ThrowStatement', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ThrowStatement', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeTryStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TryStatement', - block: deserializeBoxBlockStatement(pos + 8), - handler: deserializeOptionBoxCatchClause(pos + 16), - finalizer: deserializeOptionBoxBlockStatement(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + return node; } function deserializeCatchClause(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CatchClause', - param: deserializeOptionCatchParameter(pos + 8), - body: deserializeBoxBlockStatement(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + return node; } function deserializeCatchParameter(pos) { @@ -1566,103 +1807,143 @@ function deserializeBindingPatternKind(pos) { } function deserializeAssignmentPattern(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeBindingPattern(pos + 8), - right: deserializeExpression(pos + 40), - optional: false, - typeAnnotation: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + }, properties = deserializeVecBindingProperty(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeBindingPattern(pos + 24), - method: false, - shorthand: deserializeBool(pos + 56), - computed: deserializeBool(pos + 57), - optional: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + optional: null, + start, + end, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + node.optional = false; + return node; } function deserializeArrayPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + }, elements = deserializeVecOptionBindingPattern(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingRestElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeBindingPattern(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + }; + node.decorators = []; + node.argument = deserializeBindingPattern(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeFunction(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), params = deserializeBoxFormalParameters(pos + 56); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + declare: deserializeBool(pos + 87), + typeParameters: null, + params: null, + returnType: null, + body: null, + expression: null, + start, + end, + }, + params = deserializeBoxFormalParameters(pos + 56); { let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); thisParam !== null && params.unshift(thisParam); } - return { - type: deserializeFunctionType(pos + 84), - id: deserializeOptionBindingIdentifier(pos + 8), - generator: deserializeBool(pos + 85), - async: deserializeBool(pos + 86), - declare: deserializeBool(pos + 87), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 64), - body: deserializeOptionBoxFunctionBody(pos + 72), - expression: false, - start, - end, - }; + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 64); + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + return node; } function deserializeFunctionType(pos) { @@ -1684,16 +1965,19 @@ function deserializeFormalParameters(pos) { let params = deserializeVecFormalParameter(pos + 8); if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { pos = uint32[pos + 32 >> 2]; - params.push({ + let rest = { type: 'RestElement', decorators: [], - argument: deserializeBindingPatternKind(pos + 8), + argument: null, optional: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), + typeAnnotation: null, value: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), - }); + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + rest.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + params.push(rest); } return params; } @@ -1709,79 +1993,107 @@ function deserializeFormalParameter(pos) { param.decorators = deserializeVecDecorator(pos + 8); param.optional = deserializeBool(pos + 56); param.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); - } else {param = { + } else { + param = { type: 'TSParameterProperty', accessibility, - decorators: deserializeVecDecorator(pos + 8), + decorators: null, override, - parameter: deserializeBindingPattern(pos + 32), + parameter: null, readonly, static: false, start: deserializeU32(pos), end: deserializeU32(pos + 4), - };} + }; + param.decorators = deserializeVecDecorator(pos + 8); + param.parameter = deserializeBindingPattern(pos + 32); + } } return param; } function deserializeFunctionBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'BlockStatement', - body, - start, - end, - }; + node.body = body; + return node; } function deserializeArrowFunctionExpression(pos) { let expression = deserializeBool(pos + 44), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + typeParameters: null, + params: null, + returnType: null, + body: null, + id: null, + generator: null, + start, + end, + }, body = deserializeBoxFunctionBody(pos + 32); - return { - type: 'ArrowFunctionExpression', - expression, - async: deserializeBool(pos + 45), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - body: expression ? body.body[0].expression : body, - id: null, - generator: false, - start, - end, - }; + expression === true && (body = body.body[0].expression); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.body = body; + node.id = null; + node.generator = false; + return node; } function deserializeYieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'YieldExpression', - delegate: deserializeBool(pos + 24), - argument: deserializeOptionExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeClass(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeClassType(pos + 132), - decorators: deserializeVecDecorator(pos + 8), - id: deserializeOptionBindingIdentifier(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 64), - superClass: deserializeOptionExpression(pos + 72), - superTypeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 88), - implements: deserializeVecTSClassImplements(pos + 96), - body: deserializeBoxClassBody(pos + 120), - abstract: deserializeBool(pos + 133), - declare: deserializeBool(pos + 134), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + typeParameters: null, + superClass: null, + superTypeArguments: null, + implements: null, + body: null, + abstract: deserializeBool(pos + 133), + declare: deserializeBool(pos + 134), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 64); + node.superClass = deserializeOptionExpression(pos + 72); + node.superTypeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 88); + node.implements = deserializeVecTSClassImplements(pos + 96); + node.body = deserializeBoxClassBody(pos + 120); + return node; } function deserializeClassType(pos) { @@ -1796,13 +2108,16 @@ function deserializeClassType(pos) { } function deserializeClassBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ClassBody', - body: deserializeVecClassElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ClassBody', + body: null, + start, + end, + }; + node.body = deserializeVecClassElement(pos + 8); + return node; } function deserializeClassElement(pos) { @@ -1823,21 +2138,26 @@ function deserializeClassElement(pos) { } function deserializeMethodDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeMethodDefinitionType(pos + 56), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeBoxFunction(pos + 48), - kind: deserializeMethodDefinitionKind(pos + 57), - computed: deserializeBool(pos + 58), - static: deserializeBool(pos + 59), - override: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - accessibility: deserializeOptionTSAccessibility(pos + 62), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + override: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + accessibility: deserializeOptionTSAccessibility(pos + 62), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + return node; } function deserializeMethodDefinitionType(pos) { @@ -1852,24 +2172,30 @@ function deserializeMethodDefinitionType(pos) { } function deserializePropertyDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializePropertyDefinitionType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - declare: deserializeBool(pos + 75), - override: deserializeBool(pos + 76), - optional: deserializeBool(pos + 77), - definite: deserializeBool(pos + 78), - readonly: deserializeBool(pos + 79), - accessibility: deserializeOptionTSAccessibility(pos + 80), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + declare: deserializeBool(pos + 75), + override: deserializeBool(pos + 76), + optional: deserializeBool(pos + 77), + definite: deserializeBool(pos + 78), + readonly: deserializeBool(pos + 79), + accessibility: deserializeOptionTSAccessibility(pos + 80), + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializePropertyDefinitionType(pos) { @@ -1909,13 +2235,16 @@ function deserializePrivateIdentifier(pos) { } function deserializeStaticBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'StaticBlock', - body: deserializeVecStatement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'StaticBlock', + body: null, + start, + end, + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeAccessorPropertyType(pos) { @@ -1930,54 +2259,71 @@ function deserializeAccessorPropertyType(pos) { } function deserializeAccessorProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeAccessorPropertyType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - override: deserializeBool(pos + 75), - definite: deserializeBool(pos + 76), - accessibility: deserializeOptionTSAccessibility(pos + 77), - declare: false, - optional: false, - readonly: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + override: deserializeBool(pos + 75), + definite: deserializeBool(pos + 76), + accessibility: deserializeOptionTSAccessibility(pos + 77), + declare: null, + optional: null, + readonly: null, + start, + end, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + node.declare = false; + node.optional = false; + node.readonly = false; + return node; } function deserializeImportExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportExpression', - source: deserializeExpression(pos + 8), - options: deserializeOptionExpression(pos + 24), - phase: deserializeOptionImportPhase(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + return node; } function deserializeImportDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + importKind: deserializeImportOrExportKind(pos + 89), + start, + end, + }, specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); specifiers === null && (specifiers = []); let withClause = deserializeOptionBoxWithClause(pos + 80); - return { - type: 'ImportDeclaration', - specifiers, - source: deserializeStringLiteral(pos + 32), - phase: deserializeOptionImportPhase(pos + 88), - attributes: withClause === null ? [] : withClause.attributes, - importKind: deserializeImportOrExportKind(pos + 89), - start, - end, - }; + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeImportPhase(pos) { @@ -2005,35 +2351,45 @@ function deserializeImportDeclarationSpecifier(pos) { } function deserializeImportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportSpecifier', - imported: deserializeModuleExportName(pos + 8), - local: deserializeBindingIdentifier(pos + 64), - importKind: deserializeImportOrExportKind(pos + 96), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportSpecifier', + imported: null, + local: null, + importKind: deserializeImportOrExportKind(pos + 96), + start, + end, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + return node; } function deserializeImportDefaultSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportDefaultSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeImportNamespaceSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportNamespaceSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeWithClause(pos) { @@ -2041,14 +2397,18 @@ function deserializeWithClause(pos) { } function deserializeImportAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportAttribute', - key: deserializeImportAttributeKey(pos + 8), - value: deserializeStringLiteral(pos + 64), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + return node; } function deserializeImportAttributeKey(pos) { @@ -2063,55 +2423,74 @@ function deserializeImportAttributeKey(pos) { } function deserializeExportNamedDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), withClause = deserializeOptionBoxWithClause(pos + 96); - return { - type: 'ExportNamedDeclaration', - declaration: deserializeOptionDeclaration(pos + 8), - specifiers: deserializeVecExportSpecifier(pos + 24), - source: deserializeOptionStringLiteral(pos + 48), - exportKind: deserializeImportOrExportKind(pos + 104), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + exportKind: deserializeImportOrExportKind(pos + 104), + attributes: null, + start, + end, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportDefaultDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportDefaultDeclaration', - declaration: deserializeExportDefaultDeclarationKind(pos + 8), - exportKind: 'value', - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportDefaultDeclaration', + declaration: null, + exportKind: null, + start, + end, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + node.exportKind = 'value'; + return node; } function deserializeExportAllDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + }, withClause = deserializeOptionBoxWithClause(pos + 112); - return { - type: 'ExportAllDeclaration', - exported: deserializeOptionModuleExportName(pos + 8), - source: deserializeStringLiteral(pos + 64), - attributes: withClause === null ? [] : withClause.attributes, - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - }; + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportSpecifier', - local: deserializeModuleExportName(pos + 8), - exported: deserializeModuleExportName(pos + 64), - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportSpecifier', + local: null, + exported: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + return node; } function deserializeExportDefaultDeclarationKind(pos) { @@ -2227,36 +2606,48 @@ function deserializeModuleExportName(pos) { } function deserializeV8IntrinsicExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'V8IntrinsicExpression', - name: deserializeIdentifierName(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeBooleanLiteral(pos) { - let value = deserializeBool(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value, - raw: start === 0 && end === 0 ? null : value + '', - start, - end, - }; + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value, + raw: null, + start, + end, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + return node; } function deserializeNullLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value: null, - raw: start === 0 && end === 0 ? null : 'null', - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: null, + start, + end, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + return node; } function deserializeNumericLiteral(pos) { @@ -2271,43 +2662,58 @@ function deserializeNumericLiteral(pos) { } function deserializeStringLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), value = deserializeStr(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + }, + value = deserializeStr(pos + 8); deserializeBool(pos + 40) && (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 24), - start, - end, - }; -} - -function deserializeBigIntLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), bigint = deserializeStr(pos + 8); - return { - type: 'Literal', - value: BigInt(bigint), - raw: deserializeOptionStr(pos + 24), - bigint, - start, - end, - }; + node.value = value; + return node; +} + +function deserializeBigIntLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + return node; } function deserializeRegExpLiteral(pos) { - let regex = deserializeRegExp(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4), value = null; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + }, + regex = deserializeRegExp(pos + 8), + value = null; try { value = new RegExp(regex.pattern, regex.flags); } catch {} - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 40), - regex, - start, - end, - }; + node.value = value; + node.regex = regex; + return node; } function deserializeRegExp(pos) { @@ -2332,54 +2738,72 @@ function deserializeRegExpFlags(pos) { } function deserializeJSXElement(pos) { - let closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), openingElement = deserializeBoxJSXOpeningElement(pos + 8); closingElement === null && (openingElement.selfClosing = true); - return { - type: 'JSXElement', - openingElement, - children: deserializeVecJSXChild(pos + 16), - closingElement, - start, - end, - }; + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + return node; } function deserializeJSXOpeningElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningElement', - name: deserializeJSXElementName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - attributes: deserializeVecJSXAttributeItem(pos + 32), - selfClosing: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningElement', + name: null, + typeArguments: null, + attributes: null, + selfClosing: null, + start, + end, + }; + node.name = deserializeJSXElementName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + return node; } function deserializeJSXClosingElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXClosingElement', - name: deserializeJSXElementName(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXClosingElement', + name: null, + start, + end, + }; + node.name = deserializeJSXElementName(pos + 8); + return node; } function deserializeJSXFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXFragment', - openingFragment: deserializeJSXOpeningFragment(pos + 8), - children: deserializeVecJSXChild(pos + 16), - closingFragment: deserializeJSXClosingFragment(pos + 40), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + return node; } function deserializeJSXOpeningFragment(pos) { @@ -2430,25 +2854,33 @@ function deserializeJSXElementName(pos) { } function deserializeJSXNamespacedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXNamespacedName', - namespace: deserializeJSXIdentifier(pos + 8), - name: deserializeJSXIdentifier(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + return node; } function deserializeJSXMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXMemberExpression', - object: deserializeJSXMemberExpressionObject(pos + 8), - property: deserializeJSXIdentifier(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + return node; } function deserializeJSXMemberExpressionObject(pos) { @@ -2477,13 +2909,16 @@ function deserializeJSXMemberExpressionObject(pos) { } function deserializeJSXExpressionContainer(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXExpressionContainer', - expression: deserializeJSXExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + }; + node.expression = deserializeJSXExpression(pos + 8); + return node; } function deserializeJSXExpression(pos) { @@ -2602,24 +3037,31 @@ function deserializeJSXAttributeItem(pos) { } function deserializeJSXAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXAttribute', - name: deserializeJSXAttributeName(pos + 8), - value: deserializeOptionJSXAttributeValue(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + return node; } function deserializeJSXSpreadAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadAttribute', - argument: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeJSXAttributeName(pos) { @@ -2676,13 +3118,16 @@ function deserializeJSXChild(pos) { } function deserializeJSXSpreadChild(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadChild', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeJSXText(pos) { @@ -2697,51 +3142,69 @@ function deserializeJSXText(pos) { } function deserializeTSThisParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: 'this', - optional: false, - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 16), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + return node; } function deserializeTSEnumDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumDeclaration', - id: deserializeBindingIdentifier(pos + 8), - body: deserializeTSEnumBody(pos + 40), - const: deserializeBool(pos + 76), - declare: deserializeBool(pos + 77), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + return node; } function deserializeTSEnumBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumBody', - members: deserializeVecTSEnumMember(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumBody', + members: null, + start, + end, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + return node; } function deserializeTSEnumMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumMember', - id: deserializeTSEnumMemberName(pos + 8), - initializer: deserializeOptionExpression(pos + 24), - computed: deserializeU8(pos + 8) > 1, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + return node; } function deserializeTSEnumMemberName(pos) { @@ -2760,23 +3223,29 @@ function deserializeTSEnumMemberName(pos) { } function deserializeTSTypeAnnotation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAnnotation', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSLiteralType', - literal: deserializeTSLiteral(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSLiteralType', + literal: null, + start, + end, + }; + node.literal = deserializeTSLiteral(pos + 8); + return node; } function deserializeTSLiteral(pos) { @@ -2880,58 +3349,74 @@ function deserializeTSType(pos) { } function deserializeTSConditionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConditionalType', - checkType: deserializeTSType(pos + 8), - extendsType: deserializeTSType(pos + 24), - trueType: deserializeTSType(pos + 40), - falseType: deserializeTSType(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + return node; } function deserializeTSUnionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSUnionType', - types: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSUnionType', + types: null, + start, + end, + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSIntersectionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIntersectionType', - types: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIntersectionType', + types: null, + start, + end, + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSParenthesizedType(pos) { - let node = deserializeTSType(pos + 8); + let node; node = { type: 'TSParenthesizedType', - typeAnnotation: node, + typeAnnotation: null, start: deserializeU32(pos), end: deserializeU32(pos + 4), }; + node.typeAnnotation = deserializeTSType(pos + 8); return node; } function deserializeTSTypeOperator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeOperator', - operator: deserializeTSTypeOperatorOperator(pos + 24), - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperatorOperator(pos) { @@ -2948,66 +3433,86 @@ function deserializeTSTypeOperatorOperator(pos) { } function deserializeTSArrayType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSArrayType', - elementType: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSArrayType', + elementType: null, + start, + end, + }; + node.elementType = deserializeTSType(pos + 8); + return node; } function deserializeTSIndexedAccessType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexedAccessType', - objectType: deserializeTSType(pos + 8), - indexType: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + return node; } function deserializeTSTupleType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTupleType', - elementTypes: deserializeVecTSTupleElement(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + return node; } function deserializeTSNamedTupleMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamedTupleMember', - label: deserializeIdentifierName(pos + 8), - elementType: deserializeTSTupleElement(pos + 32), - optional: deserializeBool(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + return node; } function deserializeTSOptionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSOptionalType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSRestType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSRestType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTupleElement(pos) { @@ -3222,14 +3727,18 @@ function deserializeTSBigIntKeyword(pos) { } function deserializeTSTypeReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeReference', - typeName: deserializeTSTypeName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeName(pos) { @@ -3246,62 +3755,82 @@ function deserializeTSTypeName(pos) { } function deserializeTSQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSTypeName(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSTypeParameterInstantiation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterInstantiation', - params: deserializeVecTSType(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + }; + node.params = deserializeVecTSType(pos + 8); + return node; } function deserializeTSTypeParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameter', - name: deserializeBindingIdentifier(pos + 8), - constraint: deserializeOptionTSType(pos + 40), - default: deserializeOptionTSType(pos + 56), - in: deserializeBool(pos + 72), - out: deserializeBool(pos + 73), - const: deserializeBool(pos + 74), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + return node; } function deserializeTSTypeParameterDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterDeclaration', - params: deserializeVecTSTypeParameter(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeAliasDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAliasDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - typeAnnotation: deserializeTSType(pos + 48), - declare: deserializeBool(pos + 68), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + return node; } function deserializeTSAccessibility(pos) { @@ -3318,24 +3847,34 @@ function deserializeTSAccessibility(pos) { } function deserializeTSClassImplements(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), expression = deserializeTSTypeName(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSClassImplements', + expression: null, + typeArguments: null, + start, + end, + }, + expression = deserializeTSTypeName(pos + 8); if (expression.type === 'TSQualifiedName') { let object = expression.left, - parent = expression = { + { right } = expression, + previous = expression = { type: 'MemberExpression', object, - property: expression.right, + property: right, optional: false, computed: false, start: expression.start, end: expression.end, }; for (; object.type === 'TSQualifiedName';) { - let { left } = object; - parent = parent.object = { + let { left, right } = object; + previous = previous.object = { type: 'MemberExpression', object: left, - property: object.right, + property: right, optional: false, computed: false, start: object.start, @@ -3344,53 +3883,64 @@ function deserializeTSClassImplements(pos) { object = left; } } - return { - type: 'TSClassImplements', - expression, - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + node.expression = expression; + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSInterfaceDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - extends: deserializeVecTSInterfaceHeritage(pos + 48), - body: deserializeBoxTSInterfaceBody(pos + 72), - declare: deserializeBool(pos + 84), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + return node; } function deserializeTSInterfaceBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceBody', - body: deserializeVecTSSignature(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceBody', + body: null, + start, + end, + }; + node.body = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSPropertySignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSPropertySignature', - computed: deserializeBool(pos + 32), - optional: deserializeBool(pos + 33), - readonly: deserializeBool(pos + 34), - key: deserializePropertyKey(pos + 8), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - accessibility: null, - static: false, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + return node; } function deserializeTSSignature(pos) { @@ -3411,33 +3961,42 @@ function deserializeTSSignature(pos) { } function deserializeTSIndexSignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexSignature', - parameters: deserializeVecTSIndexSignatureName(pos + 8), - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 32), - readonly: deserializeBool(pos + 40), - static: deserializeBool(pos + 41), - accessibility: null, - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + return node; } function deserializeTSCallSignatureDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSCallSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 32), - start, - end, - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSMethodSignatureKind(pos) { @@ -3456,72 +4015,98 @@ function deserializeTSMethodSignatureKind(pos) { function deserializeTSMethodSignature(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 40), thisParam = deserializeOptionBoxTSThisParameter(pos + 32); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSMethodSignature', - key: deserializePropertyKey(pos + 8), - computed: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - kind: deserializeTSMethodSignatureKind(pos + 62), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 24), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 48), - accessibility: null, - readonly: false, - static: false, - start, - end, - }; + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + return node; } function deserializeTSConstructSignatureDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSIndexSignatureName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSInterfaceHeritage(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceHeritage', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypePredicate(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypePredicate', - parameterName: deserializeTSTypePredicateName(pos + 8), - asserts: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSTypePredicateName(pos) { @@ -3541,51 +4126,23 @@ function deserializeTSModuleDeclaration(pos) { start = deserializeU32(pos), end = deserializeU32(pos + 4), declare = deserializeBool(pos + 85), - id = deserializeTSModuleDeclarationName(pos + 8), + node, body = deserializeOptionTSModuleDeclarationBody(pos + 64); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: id.start, - end: innerId.end, - }; - } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - for (;;) { - innerId.start = id.start; - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; - } - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: id.start, - end: innerId.left.end, - }; - id = body.id; - } - body = Object.hasOwn(body, 'body') ? body.body : null; - } - return body === null - ? { + if (body === null) { + node = { type: 'TSModuleDeclaration', - id, + id: null, kind, declare, global, start, end, - } - : { + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = { type: 'TSModuleDeclaration', - id, + id: null, body, kind, declare, @@ -3593,6 +4150,44 @@ function deserializeTSModuleDeclaration(pos) { start, end, }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') node.id = id; + else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + node.id = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: id.start, + end: innerId.end, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + let { start } = id; + for (;;) { + innerId.start = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let right = innerId.left; + innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: right.end, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + } else body = null; + } + } + return node; } function deserializeTSModuleDeclarationKind(pos) { @@ -3631,45 +4226,59 @@ function deserializeTSModuleDeclarationBody(pos) { } function deserializeTSModuleBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSModuleBlock', + body: null, + start, + end, + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'TSModuleBlock', - body, - start, - end, - }; + node.body = body; + return node; } function deserializeTSTypeLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeLiteral', - members: deserializeVecTSSignature(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeLiteral', + members: null, + start, + end, + }; + node.members = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSInferType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInferType', - typeParameter: deserializeBoxTSTypeParameter(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInferType', + typeParameter: null, + start, + end, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeQuery(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeQuery', - exprName: deserializeTSTypeQueryExprName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeQueryExprName(pos) { @@ -3688,16 +4297,22 @@ function deserializeTSTypeQueryExprName(pos) { } function deserializeTSImportType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportType', - argument: deserializeTSType(pos + 8), - options: deserializeOptionBoxObjectExpression(pos + 24), - qualifier: deserializeOptionTSImportTypeQualifier(pos + 32), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 48), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + return node; } function deserializeTSImportTypeQualifier(pos) { @@ -3712,62 +4327,83 @@ function deserializeTSImportTypeQualifier(pos) { } function deserializeTSImportTypeQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSImportTypeQualifier(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSFunctionType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSFunctionType', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeBoxTSTypeAnnotation(pos + 32), - start, - end, - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSConstructorType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructorType', - abstract: deserializeBool(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSMappedType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + }, typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name, + { constraint } = typeParameter, optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); optional === null && (optional = false); - return { - type: 'TSMappedType', - key: typeParameter.name, - constraint: typeParameter.constraint, - nameType: deserializeOptionTSType(pos + 16), - typeAnnotation: deserializeOptionTSType(pos + 32), - optional, - readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), - start, - end, - }; + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + return node; } function deserializeTSMappedTypeModifierOperator(pos) { @@ -3784,59 +4420,79 @@ function deserializeTSMappedTypeModifierOperator(pos) { } function deserializeTSTemplateLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTemplateLiteralType', - quasis: deserializeVecTemplateElement(pos + 8), - types: deserializeVecTSType(pos + 32), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + return node; } function deserializeTSAsExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSAsExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSSatisfiesExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSSatisfiesExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSTypeAssertion(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAssertion', - typeAnnotation: deserializeTSType(pos + 8), - expression: deserializeExpression(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + return node; } function deserializeTSImportEqualsDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportEqualsDeclaration', - id: deserializeBindingIdentifier(pos + 8), - moduleReference: deserializeTSModuleReference(pos + 40), - importKind: deserializeImportOrExportKind(pos + 56), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + return node; } function deserializeTSModuleReference(pos) { @@ -3855,64 +4511,83 @@ function deserializeTSModuleReference(pos) { } function deserializeTSExternalModuleReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExternalModuleReference', - expression: deserializeStringLiteral(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeTSNonNullExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNonNullExpression', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeDecorator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Decorator', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Decorator', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSExportAssignment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExportAssignment', - expression: deserializeExpression(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExportAssignment', + expression: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSNamespaceExportDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamespaceExportDeclaration', - id: deserializeIdentifierName(pos + 8), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + }; + node.id = deserializeIdentifierName(pos + 8); + return node; } function deserializeTSInstantiationExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInstantiationExpression', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeImportOrExportKind(pos) { @@ -3927,25 +4602,31 @@ function deserializeImportOrExportKind(pos) { } function deserializeJSDocNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocNonNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNonNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocUnknownType(pos) { @@ -3972,13 +4653,15 @@ function deserializeComment(pos) { let type = deserializeCommentKind(pos + 12), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type, + value: null, + start, + end, + }, endCut = type === 'Line' ? 0 : 2; - return { - type, - value: sourceText.slice(start + 2, end - endCut), - start, - end, - }; + node.value = sourceText.slice(start + 2, end - endCut); + return node; } function deserializeNameSpan(pos) { diff --git a/napi/parser/generated/deserialize/ts_parent.js b/napi/parser/generated/deserialize/ts_parent.js new file mode 100644 index 0000000000000..80b41121feac0 --- /dev/null +++ b/napi/parser/generated/deserialize/ts_parent.js @@ -0,0 +1,6879 @@ +// Auto-generated code, DO NOT EDIT DIRECTLY! +// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`. + +let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen; +const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }), + decodeStr = textDecoder.decode.bind(textDecoder), + { fromCodePoint } = String; +let parent = null; + +export function deserialize(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData); +} + +export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram); +} + +function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) { + uint8 = buffer; + uint32 = buffer.uint32; + float64 = buffer.float64; + sourceText = sourceTextInput; + sourceByteLen = sourceByteLenInput; + sourceIsAscii = sourceText.length === sourceByteLen; + let data = deserialize(uint32[536870902]); + uint8 = + uint32 = + float64 = + sourceText = + void 0; + return data; +} + +function deserializeProgram(pos) { + let end = deserializeU32(pos + 4), + program = parent = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start: 0, + end, + parent: null, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + let body = program.body = deserializeVecDirective(pos + 72); + body.push(...deserializeVecStatement(pos + 96)); + { + let start; + if (body.length > 0) { + let first = body[0]; + start = first.start; + if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { + let { declaration } = first; + if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { + let decoratorStart = declaration.decorators[0].start; + decoratorStart < start && (start = decoratorStart); + } + } + } else start = end; + program.start = start; + } + parent = null; + return program; +} + +function deserializeExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Expression`); + } +} + +function deserializeIdentifierName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeIdentifierReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeLabelIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeThisExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'ThisExpression', + start, + end, + parent, + }; +} + +function deserializeArrayExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayExpression', + elements: null, + start, + end, + parent, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArrayExpressionElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + case 65: + return deserializeElision(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ArrayExpressionElement`); + } +} + +function deserializeElision(pos) { + return null; +} + +function deserializeObjectExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectExpression', + properties: null, + start, + end, + parent, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeObjectPropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxObjectProperty(pos + 8); + case 1: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ObjectPropertyKind`); + } +} + +function deserializeObjectProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + optional: null, + start, + end, + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + node.optional = false; + parent = previousParent; + return node; +} + +function deserializePropertyKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxIdentifierName(pos + 8); + case 65: + return deserializeBoxPrivateIdentifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKey`); + } +} + +function deserializePropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return 'init'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKind`); + } +} + +function deserializeTemplateLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTaggedTemplateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TaggedTemplateExpression', + tag: null, + typeArguments: null, + quasi: null, + start, + end, + parent, + }; + node.tag = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.quasi = deserializeTemplateLiteral(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTemplateElement(pos) { + let tail = deserializeBool(pos + 40), + start = deserializeU32(pos) - 1, + end = deserializeU32(pos + 4) + 2 - tail, + value = deserializeTemplateElementValue(pos + 8); + value.cooked !== null && deserializeBool(pos + 41) && + (value.cooked = value.cooked.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + return { + type: 'TemplateElement', + value, + tail, + start, + end, + parent, + }; +} + +function deserializeTemplateElementValue(pos) { + return { + raw: deserializeStr(pos), + cooked: deserializeOptionStr(pos + 16), + }; +} + +function deserializeComputedMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + parent = previousParent; + return node; +} + +function deserializeStaticMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializePrivateFieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeCallExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CallExpression', + callee: null, + typeArguments: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeNewExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'NewExpression', + callee: null, + typeArguments: null, + arguments: null, + start, + end, + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeMetaProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + parent, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + parent = previousParent; + return node; +} + +function deserializeSpreadElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SpreadElement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArgument(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Argument`); + } +} + +function deserializeUpdateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + parent, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeUnaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + parent = previousParent; + return node; +} + +function deserializeBinaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePrivateInExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + parent, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeLogicalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeConditionalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeAssignmentExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTarget`); + } +} + +function deserializeSimpleAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for SimpleAssignmentTarget`); + } +} + +function deserializeArrayAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }, + elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && elements.push(rest); + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeObjectAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }, + properties = deserializeVecAssignmentTargetProperty(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && properties.push(rest); + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetRest(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + parent, + }; + node.decorators = []; + node.argument = deserializeAssignmentTarget(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetMaybeDefault(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxAssignmentTargetWithDefault(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetMaybeDefault`); + } +} + +function deserializeAssignmentTargetWithDefault(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetProperty(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxAssignmentTargetPropertyIdentifier(pos + 8); + case 1: + return deserializeBoxAssignmentTargetPropertyProperty(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetProperty`); + } +} + +function deserializeAssignmentTargetPropertyIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + optional: null, + start, + end, + parent, + }, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + if (init !== null) { + let left = value, previousParent = parent; + value = parent = { + type: 'AssignmentPattern', + decorators: [], + left, + right: init, + optional: false, + typeAnnotation: null, + start, + end, + parent, + }; + left.parent = value; + init.parent = value; + parent = previousParent; + } + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetPropertyProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + optional: null, + start, + end, + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeSequenceExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SequenceExpression', + expressions: null, + start, + end, + parent, + }; + node.expressions = deserializeVecExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeSuper(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Super', + start, + end, + parent, + }; +} + +function deserializeAwaitExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AwaitExpression', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ChainExpression', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeChainElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxCallExpression(pos + 8); + case 1: + return deserializeBoxTSNonNullExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ChainElement`); + } +} + +function deserializeParenthesizedExpression(pos) { + let node; + { + let previousParent = parent; + node = parent = { + type: 'ParenthesizedExpression', + expression: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeStatement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBlockStatement(pos + 8); + case 1: + return deserializeBoxBreakStatement(pos + 8); + case 2: + return deserializeBoxContinueStatement(pos + 8); + case 3: + return deserializeBoxDebuggerStatement(pos + 8); + case 4: + return deserializeBoxDoWhileStatement(pos + 8); + case 5: + return deserializeBoxEmptyStatement(pos + 8); + case 6: + return deserializeBoxExpressionStatement(pos + 8); + case 7: + return deserializeBoxForInStatement(pos + 8); + case 8: + return deserializeBoxForOfStatement(pos + 8); + case 9: + return deserializeBoxForStatement(pos + 8); + case 10: + return deserializeBoxIfStatement(pos + 8); + case 11: + return deserializeBoxLabeledStatement(pos + 8); + case 12: + return deserializeBoxReturnStatement(pos + 8); + case 13: + return deserializeBoxSwitchStatement(pos + 8); + case 14: + return deserializeBoxThrowStatement(pos + 8); + case 15: + return deserializeBoxTryStatement(pos + 8); + case 16: + return deserializeBoxWhileStatement(pos + 8); + case 17: + return deserializeBoxWithStatement(pos + 8); + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + case 64: + return deserializeBoxImportDeclaration(pos + 8); + case 65: + return deserializeBoxExportAllDeclaration(pos + 8); + case 66: + return deserializeBoxExportDefaultDeclaration(pos + 8); + case 67: + return deserializeBoxExportNamedDeclaration(pos + 8); + case 68: + return deserializeBoxTSExportAssignment(pos + 8); + case 69: + return deserializeBoxTSNamespaceExportDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Statement`); + } +} + +function deserializeDirective(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeHashbang(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Hashbang', + value: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeBlockStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDeclaration(pos) { + switch (uint8[pos]) { + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Declaration`); + } +} + +function deserializeVariableDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + declare: deserializeBool(pos + 33), + start, + end, + parent, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + parent = previousParent; + return node; +} + +function deserializeVariableDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'var'; + case 1: + return 'let'; + case 2: + return 'const'; + case 3: + return 'using'; + case 4: + return 'await using'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for VariableDeclarationKind`); + } +} + +function deserializeVariableDeclarator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclarator', + id: null, + init: null, + definite: deserializeBool(pos + 57), + start, + end, + parent, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeEmptyStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'EmptyStatement', + start, + end, + parent, + }; +} + +function deserializeExpressionStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.directive = null; + parent = previousParent; + return node; +} + +function deserializeIfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeDoWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + parent, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + parent, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeForStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + parent, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + parent = previousParent; + return node; +} + +function deserializeForStatementInit(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxVariableDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementInit`); + } +} + +function deserializeForInStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeForStatementLeft(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxVariableDeclaration(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementLeft`); + } +} + +function deserializeForOfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeContinueStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ContinueStatement', + label: null, + start, + end, + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeBreakStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BreakStatement', + label: null, + start, + end, + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeReturnStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ReturnStatement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + parent, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + parent, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchCase(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + parent, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeLabeledStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + parent, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeThrowStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ThrowStatement', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTryStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + parent, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeCatchClause(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + parent, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + parent = previousParent; + return node; +} + +function deserializeCatchParameter(pos) { + return deserializeBindingPattern(pos + 8); +} + +function deserializeDebuggerStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'DebuggerStatement', + start, + end, + parent, + }; +} + +function deserializeBindingPattern(pos) { + let pattern = deserializeBindingPatternKind(pos); + { + let previousParent = parent; + parent = pattern; + pattern.optional = deserializeBool(pos + 24); + pattern.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + } + return pattern; +} + +function deserializeBindingPatternKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBindingIdentifier(pos + 8); + case 1: + return deserializeBoxObjectPattern(pos + 8); + case 2: + return deserializeBoxArrayPattern(pos + 8); + case 3: + return deserializeBoxAssignmentPattern(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BindingPatternKind`); + } +} + +function deserializeAssignmentPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeObjectPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }, + properties = deserializeVecBindingProperty(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && properties.push(rest); + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + optional: null, + start, + end, + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeArrayPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }, + elements = deserializeVecOptionBindingPattern(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && elements.push(rest); + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingRestElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + parent, + }; + node.decorators = []; + node.argument = deserializeBindingPattern(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + parent = previousParent; + return node; +} + +function deserializeFunction(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + declare: deserializeBool(pos + 87), + typeParameters: null, + params: null, + returnType: null, + body: null, + expression: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 56); + { + let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); + thisParam !== null && params.unshift(thisParam); + } + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 64); + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + parent = previousParent; + return node; +} + +function deserializeFunctionType(pos) { + switch (uint8[pos]) { + case 0: + return 'FunctionDeclaration'; + case 1: + return 'FunctionExpression'; + case 2: + return 'TSDeclareFunction'; + case 3: + return 'TSEmptyBodyFunctionExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for FunctionType`); + } +} + +function deserializeFormalParameters(pos) { + let params = deserializeVecFormalParameter(pos + 8); + if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { + pos = uint32[pos + 32 >> 2]; + let previousParent = parent, + rest = parent = { + type: 'RestElement', + decorators: [], + argument: null, + optional: deserializeBool(pos + 32), + typeAnnotation: null, + value: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + rest.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + params.push(rest); + parent = previousParent; + } + return params; +} + +function deserializeFormalParameter(pos) { + let param; + { + let accessibility = deserializeOptionTSAccessibility(pos + 64), + readonly = deserializeBool(pos + 65), + override = deserializeBool(pos + 66), + previousParent = parent; + if (accessibility === null && !readonly && !override) { + param = parent = deserializeBindingPatternKind(pos + 32); + param.decorators = deserializeVecDecorator(pos + 8); + param.optional = deserializeBool(pos + 56); + param.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + } else { + param = parent = { + type: 'TSParameterProperty', + accessibility, + decorators: null, + override, + parameter: null, + readonly, + static: false, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + param.decorators = deserializeVecDecorator(pos + 8); + param.parameter = deserializeBindingPattern(pos + 32); + } + parent = previousParent; + } + return param; +} + +function deserializeFunctionBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeArrowFunctionExpression(pos) { + let expression = deserializeBool(pos + 44), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + typeParameters: null, + params: null, + returnType: null, + body: null, + id: null, + generator: null, + start, + end, + parent, + }, + body = deserializeBoxFunctionBody(pos + 32); + if (expression === true) { + body = body.body[0].expression; + body.parent = parent; + } + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.body = body; + node.id = null; + node.generator = false; + parent = previousParent; + return node; +} + +function deserializeYieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClass(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + typeParameters: null, + superClass: null, + superTypeArguments: null, + implements: null, + body: null, + abstract: deserializeBool(pos + 133), + declare: deserializeBool(pos + 134), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 64); + node.superClass = deserializeOptionExpression(pos + 72); + node.superTypeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 88); + node.implements = deserializeVecTSClassImplements(pos + 96); + node.body = deserializeBoxClassBody(pos + 120); + parent = previousParent; + return node; +} + +function deserializeClassType(pos) { + switch (uint8[pos]) { + case 0: + return 'ClassDeclaration'; + case 1: + return 'ClassExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassType`); + } +} + +function deserializeClassBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ClassBody', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecClassElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClassElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStaticBlock(pos + 8); + case 1: + return deserializeBoxMethodDefinition(pos + 8); + case 2: + return deserializeBoxPropertyDefinition(pos + 8); + case 3: + return deserializeBoxAccessorProperty(pos + 8); + case 4: + return deserializeBoxTSIndexSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassElement`); + } +} + +function deserializeMethodDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + override: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + accessibility: deserializeOptionTSAccessibility(pos + 62), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + parent = previousParent; + return node; +} + +function deserializeMethodDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'MethodDefinition'; + case 1: + return 'TSAbstractMethodDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionType`); + } +} + +function deserializePropertyDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + declare: deserializeBool(pos + 75), + override: deserializeBool(pos + 76), + optional: deserializeBool(pos + 77), + definite: deserializeBool(pos + 78), + readonly: deserializeBool(pos + 79), + accessibility: deserializeOptionTSAccessibility(pos + 80), + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializePropertyDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'PropertyDefinition'; + case 1: + return 'TSAbstractPropertyDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyDefinitionType`); + } +} + +function deserializeMethodDefinitionKind(pos) { + switch (uint8[pos]) { + case 0: + return 'constructor'; + case 1: + return 'method'; + case 2: + return 'get'; + case 3: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionKind`); + } +} + +function deserializePrivateIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'PrivateIdentifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeStaticBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'StaticBlock', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAccessorPropertyType(pos) { + switch (uint8[pos]) { + case 0: + return 'AccessorProperty'; + case 1: + return 'TSAbstractAccessorProperty'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AccessorPropertyType`); + } +} + +function deserializeAccessorProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + override: deserializeBool(pos + 75), + definite: deserializeBool(pos + 76), + accessibility: deserializeOptionTSAccessibility(pos + 77), + declare: null, + optional: null, + readonly: null, + start, + end, + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + node.declare = false; + node.optional = false; + node.readonly = false; + parent = previousParent; + return node; +} + +function deserializeImportExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + parent, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + importKind: deserializeImportOrExportKind(pos + 89), + start, + end, + parent, + }, + specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); + specifiers === null && (specifiers = []); + let withClause = deserializeOptionBoxWithClause(pos + 80); + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeImportPhase(pos) { + switch (uint8[pos]) { + case 0: + return 'source'; + case 1: + return 'defer'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportPhase`); + } +} + +function deserializeImportDeclarationSpecifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxImportSpecifier(pos + 8); + case 1: + return deserializeBoxImportDefaultSpecifier(pos + 8); + case 2: + return deserializeBoxImportNamespaceSpecifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportDeclarationSpecifier`); + } +} + +function deserializeImportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportSpecifier', + imported: null, + local: null, + importKind: deserializeImportOrExportKind(pos + 96), + start, + end, + parent, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportDefaultSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeImportNamespaceSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithClause(pos) { + return { attributes: deserializeVecImportAttribute(pos + 8) }; +} + +function deserializeImportAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + parent, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportAttributeKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportAttributeKey`); + } +} + +function deserializeExportNamedDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + exportKind: deserializeImportOrExportKind(pos + 104), + attributes: null, + start, + end, + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportDefaultDeclaration', + declaration: null, + exportKind: null, + start, + end, + parent, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + node.exportKind = 'value'; + parent = previousParent; + return node; +} + +function deserializeExportAllDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 112); + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportSpecifier', + local: null, + exported: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + parent, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxFunction(pos + 8); + case 65: + return deserializeBoxClass(pos + 8); + case 66: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportDefaultDeclarationKind`); + } +} + +function deserializeModuleExportName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeIdentifierReference(pos + 8); + case 2: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleExportName`); + } +} + +function deserializeV8IntrinsicExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + parent, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeBooleanLiteral(pos) { + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value, + raw: null, + start, + end, + parent, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + parent = previousParent; + return node; +} + +function deserializeNullLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: null, + start, + end, + parent, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + parent = previousParent; + return node; +} + +function deserializeNumericLiteral(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Literal', + value: deserializeF64(pos + 8), + raw: deserializeOptionStr(pos + 16), + start, + end, + parent, + }; +} + +function deserializeStringLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + parent, + }, + value = deserializeStr(pos + 8); + deserializeBool(pos + 40) && + (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + node.value = value; + parent = previousParent; + return node; +} + +function deserializeBigIntLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + parent, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + parent = previousParent; + return node; +} + +function deserializeRegExpLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + parent, + }, + regex = deserializeRegExp(pos + 8), + value = null; + try { + value = new RegExp(regex.pattern, regex.flags); + } catch {} + node.value = value; + node.regex = regex; + parent = previousParent; + return node; +} + +function deserializeRegExp(pos) { + return { + pattern: deserializeStr(pos), + flags: deserializeRegExpFlags(pos + 24), + }; +} + +function deserializeRegExpFlags(pos) { + let flagBits = deserializeU8(pos), flags = ''; + // Alphabetical order + flagBits & 64 && (flags += 'd'); + flagBits & 1 && (flags += 'g'); + flagBits & 2 && (flags += 'i'); + flagBits & 4 && (flags += 'm'); + flagBits & 8 && (flags += 's'); + flagBits & 16 && (flags += 'u'); + flagBits & 128 && (flags += 'v'); + flagBits & 32 && (flags += 'y'); + return flags; +} + +function deserializeJSXElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + parent, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), + openingElement = deserializeBoxJSXOpeningElement(pos + 8); + closingElement === null && (openingElement.selfClosing = true); + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + parent = previousParent; + return node; +} + +function deserializeJSXOpeningElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningElement', + name: null, + typeArguments: null, + attributes: null, + selfClosing: null, + start, + end, + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXClosingElement', + name: null, + start, + end, + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + parent, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + parent = previousParent; + return node; +} + +function deserializeJSXOpeningFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningFragment', + start, + end, + parent, + }; + parent = previousParent; + return node; +} + +function deserializeJSXClosingFragment(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXClosingFragment', + start, + end, + parent, + }; +} + +function deserializeJSXElementName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + parent, + }; + case 2: + return deserializeBoxJSXNamespacedName(pos + 8); + case 3: + return deserializeBoxJSXMemberExpression(pos + 8); + case 4: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXElementName`); + } +} + +function deserializeJSXNamespacedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + parent, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + parent, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpressionObject(pos) { + switch (uint8[pos]) { + case 0: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + parent, + }; + case 1: + return deserializeBoxJSXMemberExpression(pos + 8); + case 2: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXMemberExpressionObject`); + } +} + +function deserializeJSXExpressionContainer(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeJSXExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeJSXEmptyExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXExpression`); + } +} + +function deserializeJSXEmptyExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXEmptyExpression', + start, + end, + parent, + }; +} + +function deserializeJSXAttributeItem(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXAttribute(pos + 8); + case 1: + return deserializeBoxJSXSpreadAttribute(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeItem`); + } +} + +function deserializeJSXAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + parent, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXSpreadAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXAttributeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + return deserializeBoxJSXNamespacedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeName`); + } +} + +function deserializeJSXAttributeValue(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStringLiteral(pos + 8); + case 1: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 2: + return deserializeBoxJSXElement(pos + 8); + case 3: + return deserializeBoxJSXFragment(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeValue`); + } +} + +function deserializeJSXIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXIdentifier', + name: deserializeStr(pos + 8), + start, + end, + parent, + }; +} + +function deserializeJSXChild(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXText(pos + 8); + case 1: + return deserializeBoxJSXElement(pos + 8); + case 2: + return deserializeBoxJSXFragment(pos + 8); + case 3: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 4: + return deserializeBoxJSXSpreadChild(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXChild`); + } +} + +function deserializeJSXSpreadChild(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXText(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXText', + value: deserializeStr(pos + 8), + raw: deserializeOptionStr(pos + 24), + start, + end, + parent, + }; +} + +function deserializeTSThisParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + return node; +} + +function deserializeTSEnumDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSEnumBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumBody', + members: null, + start, + end, + parent, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSEnumMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + parent, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + parent = previousParent; + return node; +} + +function deserializeTSEnumMemberName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxStringLiteral(pos + 8); + case 2: + return deserializeBoxStringLiteral(pos + 8); + case 3: + return deserializeBoxTemplateLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSEnumMemberName`); + } +} + +function deserializeTSTypeAnnotation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSLiteralType', + literal: null, + start, + end, + parent, + }; + node.literal = deserializeTSLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteral(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNumericLiteral(pos + 8); + case 2: + return deserializeBoxBigIntLiteral(pos + 8); + case 3: + return deserializeBoxStringLiteral(pos + 8); + case 4: + return deserializeBoxTemplateLiteral(pos + 8); + case 5: + return deserializeBoxUnaryExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSLiteral`); + } +} + +function deserializeTSType(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSType`); + } +} + +function deserializeTSConditionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + parent, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSUnionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSUnionType', + types: null, + start, + end, + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIntersectionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIntersectionType', + types: null, + start, + end, + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSParenthesizedType(pos) { + let node; + { + let previousParent = parent; + node = parent = { + type: 'TSParenthesizedType', + typeAnnotation: null, + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeTSTypeOperator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeOperatorOperator(pos) { + switch (uint8[pos]) { + case 0: + return 'keyof'; + case 1: + return 'unique'; + case 2: + return 'readonly'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeOperatorOperator`); + } +} + +function deserializeTSArrayType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSArrayType', + elementType: null, + start, + end, + parent, + }; + node.elementType = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIndexedAccessType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + parent, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTupleType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + parent, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamedTupleMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + parent, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSOptionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSRestType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTupleElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + case 64: + return deserializeBoxTSOptionalType(pos + 8); + case 65: + return deserializeBoxTSRestType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTupleElement`); + } +} + +function deserializeTSAnyKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSAnyKeyword', + start, + end, + parent, + }; +} + +function deserializeTSStringKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSStringKeyword', + start, + end, + parent, + }; +} + +function deserializeTSBooleanKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBooleanKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNumberKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNumberKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNeverKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNeverKeyword', + start, + end, + parent, + }; +} + +function deserializeTSIntrinsicKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSIntrinsicKeyword', + start, + end, + parent, + }; +} + +function deserializeTSUnknownKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUnknownKeyword', + start, + end, + parent, + }; +} + +function deserializeTSNullKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNullKeyword', + start, + end, + parent, + }; +} + +function deserializeTSUndefinedKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUndefinedKeyword', + start, + end, + parent, + }; +} + +function deserializeTSVoidKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSVoidKeyword', + start, + end, + parent, + }; +} + +function deserializeTSSymbolKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSSymbolKeyword', + start, + end, + parent, + }; +} + +function deserializeTSThisType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSThisType', + start, + end, + parent, + }; +} + +function deserializeTSObjectKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSObjectKeyword', + start, + end, + parent, + }; +} + +function deserializeTSBigIntKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBigIntKeyword', + start, + end, + parent, + }; +} + +function deserializeTSTypeReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + parent, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeName`); + } +} + +function deserializeTSQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterInstantiation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + parent, + }; + node.params = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + parent, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + parent, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeAliasDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSAccessibility(pos) { + switch (uint8[pos]) { + case 0: + return 'private'; + case 1: + return 'protected'; + case 2: + return 'public'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSAccessibility`); + } +} + +function deserializeTSClassImplements(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSClassImplements', + expression: null, + typeArguments: null, + start, + end, + parent, + }, + expression = deserializeTSTypeName(pos + 8); + if (expression.type === 'TSQualifiedName') { + let object = expression.left, + { right } = expression, + previous = expression = { + type: 'MemberExpression', + object, + property: right, + optional: false, + computed: false, + start: expression.start, + end: expression.end, + parent, + }; + right.parent = previous; + for (;;) { + if (object.type !== 'TSQualifiedName') { + object.parent = previous; + break; + } + let { left, right } = object; + previous = previous.object = { + type: 'MemberExpression', + object: left, + property: right, + optional: false, + computed: false, + start: object.start, + end: object.end, + parent: previous, + }; + right.parent = previous; + object = left; + } + } + node.expression = expression; + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceBody', + body: null, + start, + end, + parent, + }; + node.body = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSPropertySignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSSignature(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSIndexSignature(pos + 8); + case 1: + return deserializeBoxTSPropertySignature(pos + 8); + case 2: + return deserializeBoxTSCallSignatureDeclaration(pos + 8); + case 3: + return deserializeBoxTSConstructSignatureDeclaration(pos + 8); + case 4: + return deserializeBoxTSMethodSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSSignature`); + } +} + +function deserializeTSIndexSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + parent, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + parent = previousParent; + return node; +} + +function deserializeTSCallSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSMethodSignatureKind(pos) { + switch (uint8[pos]) { + case 0: + return 'method'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMethodSignatureKind`); + } +} + +function deserializeTSMethodSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 40), + thisParam = deserializeOptionBoxTSThisParameter(pos + 32); + thisParam !== null && params.unshift(thisParam); + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSConstructSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSIndexSignatureName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceHeritage(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicate(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + parent, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicateName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeTSThisType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypePredicateName`); + } +} + +function deserializeTSModuleDeclaration(pos) { + let kind = deserializeTSModuleDeclarationKind(pos + 84), + global = kind === 'global', + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + declare = deserializeBool(pos + 85), + node, + previousParent = parent, + body = deserializeOptionTSModuleDeclarationBody(pos + 64); + if (body === null) { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + kind, + declare, + global, + start, + end, + parent, + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + body, + kind, + declare, + global, + start, + end, + parent, + }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') { + node.id = id; + body.parent = node; + } else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + id.parent = + innerId.parent = + node.id = + parent = + { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: id.start, + end: innerId.end, + parent: node, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + innerId.parent = node; + let { start } = id; + for (;;) { + innerId.start = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let right = innerId.left; + id.parent = right.parent = innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: right.end, + parent: innerId, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + body.parent = node; + } else body = null; + } + } + parent = previousParent; + return node; +} + +function deserializeTSModuleDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'global'; + case 1: + return 'module'; + case 2: + return 'namespace'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationKind`); + } +} + +function deserializeTSModuleDeclarationName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBindingIdentifier(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationName`); + } +} + +function deserializeTSModuleDeclarationBody(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 1: + return deserializeBoxTSModuleBlock(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationBody`); + } +} + +function deserializeTSModuleBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSModuleBlock', + body: null, + start, + end, + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeTSTypeLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeLiteral', + members: null, + start, + end, + parent, + }; + node.members = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInferType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInferType', + typeParameter: null, + start, + end, + parent, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeQuery(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + parent, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeQueryExprName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSImportType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeQueryExprName`); + } +} + +function deserializeTSImportType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + parent, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSImportTypeQualifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxTSImportTypeQualifiedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSImportTypeQualifier`); + } +} + +function deserializeTSImportTypeQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + parent, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSFunctionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSConstructorType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSMappedType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + parent, + }, + typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name; + key.parent = parent; + let { constraint } = typeParameter; + constraint !== null && (constraint.parent = parent); + let optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); + optional === null && (optional = false); + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + parent = previousParent; + return node; +} + +function deserializeTSMappedTypeModifierOperator(pos) { + switch (uint8[pos]) { + case 0: + return true; + case 1: + return '+'; + case 2: + return '-'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMappedTypeModifierOperator`); + } +} + +function deserializeTSTemplateLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSAsExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSSatisfiesExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeAssertion(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSImportEqualsDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSModuleReference(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSExternalModuleReference(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleReference`); + } +} + +function deserializeTSExternalModuleReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNonNullExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDecorator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Decorator', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSExportAssignment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExportAssignment', + expression: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamespaceExportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + parent, + }; + node.id = deserializeIdentifierName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInstantiationExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportOrExportKind(pos) { + switch (uint8[pos]) { + case 0: + return 'value'; + case 1: + return 'type'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportOrExportKind`); + } +} + +function deserializeJSDocNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocNonNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocUnknownType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSJSDocUnknownType', + start, + end, + parent, + }; +} + +function deserializeCommentKind(pos) { + switch (uint8[pos]) { + case 0: + return 'Line'; + case 1: + return 'Block'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for CommentKind`); + } +} + +function deserializeComment(pos) { + let type = deserializeCommentKind(pos + 12), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type, + value: null, + start, + end, + parent, + }, + endCut = type === 'Line' ? 0 : 2; + node.value = sourceText.slice(start + 2, end - endCut); + parent = previousParent; + return node; +} + +function deserializeNameSpan(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + value: deserializeStr(pos + 8), + start, + end, + }; +} + +function deserializeImportEntry(pos) { + return { + importName: deserializeImportImportName(pos + 32), + localName: deserializeNameSpan(pos + 64), + isType: deserializeBool(pos + 88), + }; +} + +function deserializeImportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + return { + kind: 'NamespaceObject', + name: null, + start: null, + end: null, + }; + case 2: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportImportName`); + } +} + +function deserializeExportEntry(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeOptionNameSpan(pos + 16), + importName: deserializeExportImportName(pos + 40), + exportName: deserializeExportExportName(pos + 72), + localName: deserializeExportLocalName(pos + 104), + isType: deserializeBool(pos + 136), + start, + end, + }; +} + +function deserializeExportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + return { + kind: 'All', + name: null, + start: null, + end: null, + }; + case 2: + return { + kind: 'AllButDefault', + name: null, + start: null, + end: null, + }; + case 3: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportImportName`); + } +} + +function deserializeExportExportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportExportName`); + } +} + +function deserializeExportLocalName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 1: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Default', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportLocalName`); + } +} + +function deserializeDynamicImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeSpan(pos + 8), + start, + end, + }; +} + +function deserializeAssignmentOperator(pos) { + switch (uint8[pos]) { + case 0: + return '='; + case 1: + return '+='; + case 2: + return '-='; + case 3: + return '*='; + case 4: + return '/='; + case 5: + return '%='; + case 6: + return '**='; + case 7: + return '<<='; + case 8: + return '>>='; + case 9: + return '>>>='; + case 10: + return '|='; + case 11: + return '^='; + case 12: + return '&='; + case 13: + return '||='; + case 14: + return '&&='; + case 15: + return '??='; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentOperator`); + } +} + +function deserializeBinaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '=='; + case 1: + return '!='; + case 2: + return '==='; + case 3: + return '!=='; + case 4: + return '<'; + case 5: + return '<='; + case 6: + return '>'; + case 7: + return '>='; + case 8: + return '+'; + case 9: + return '-'; + case 10: + return '*'; + case 11: + return '/'; + case 12: + return '%'; + case 13: + return '**'; + case 14: + return '<<'; + case 15: + return '>>'; + case 16: + return '>>>'; + case 17: + return '|'; + case 18: + return '^'; + case 19: + return '&'; + case 20: + return 'in'; + case 21: + return 'instanceof'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BinaryOperator`); + } +} + +function deserializeLogicalOperator(pos) { + switch (uint8[pos]) { + case 0: + return '||'; + case 1: + return '&&'; + case 2: + return '??'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for LogicalOperator`); + } +} + +function deserializeUnaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '+'; + case 1: + return '-'; + case 2: + return '!'; + case 3: + return '~'; + case 4: + return 'typeof'; + case 5: + return 'void'; + case 6: + return 'delete'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UnaryOperator`); + } +} + +function deserializeUpdateOperator(pos) { + switch (uint8[pos]) { + case 0: + return '++'; + case 1: + return '--'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UpdateOperator`); + } +} + +function deserializeSpan(pos) { + return { + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + }; +} + +function deserializeModuleKind(pos) { + switch (uint8[pos]) { + case 0: + return 'script'; + case 1: + return 'module'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleKind`); + } +} + +function deserializeRawTransferData(pos) { + return { + program: deserializeProgram(pos), + comments: deserializeVecComment(pos + 128), + module: deserializeEcmaScriptModule(pos + 152), + errors: deserializeVecError(pos + 256), + }; +} + +function deserializeError(pos) { + return { + severity: deserializeErrorSeverity(pos + 72), + message: deserializeStr(pos), + labels: deserializeVecErrorLabel(pos + 16), + helpMessage: deserializeOptionStr(pos + 40), + codeframe: deserializeStr(pos + 56), + }; +} + +function deserializeErrorSeverity(pos) { + switch (uint8[pos]) { + case 0: + return 'Error'; + case 1: + return 'Warning'; + case 2: + return 'Advice'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ErrorSeverity`); + } +} + +function deserializeErrorLabel(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + message: deserializeOptionStr(pos + 8), + start, + end, + }; +} + +function deserializeEcmaScriptModule(pos) { + return { + hasModuleSyntax: deserializeBool(pos + 96), + staticImports: deserializeVecStaticImport(pos), + staticExports: deserializeVecStaticExport(pos + 24), + dynamicImports: deserializeVecDynamicImport(pos + 48), + importMetas: deserializeVecSpan(pos + 72), + }; +} + +function deserializeStaticImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeNameSpan(pos + 8), + entries: deserializeVecImportEntry(pos + 32), + start, + end, + }; +} + +function deserializeStaticExport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + entries: deserializeVecExportEntry(pos + 8), + start, + end, + }; +} + +function deserializeU32(pos) { + return uint32[pos >> 2]; +} + +function deserializeU8(pos) { + return uint8[pos]; +} + +function deserializeStr(pos) { + let pos32 = pos >> 2, len = uint32[pos32 + 2]; + if (len === 0) return ''; + pos = uint32[pos32]; + if (sourceIsAscii && pos < sourceByteLen) return sourceText.substr(pos, len); + // Longer strings use `TextDecoder` + // TODO: Find best switch-over point + let end = pos + len; + if (len > 50) return decodeStr(uint8.subarray(pos, end)); + // Shorter strings decode by hand to avoid native call + let out = '', c; + do { + c = uint8[pos++]; + if (c < 128) out += fromCodePoint(c); + else { + out += decodeStr(uint8.subarray(pos - 1, end)); + break; + } + } while (pos < end); + return out; +} + +function deserializeVecComment(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeComment(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionHashbang(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeHashbang(pos); +} + +function deserializeVecDirective(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeDirective(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecStatement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeStatement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxBooleanLiteral(pos) { + return deserializeBooleanLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNullLiteral(pos) { + return deserializeNullLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNumericLiteral(pos) { + return deserializeNumericLiteral(uint32[pos >> 2]); +} + +function deserializeBoxBigIntLiteral(pos) { + return deserializeBigIntLiteral(uint32[pos >> 2]); +} + +function deserializeBoxRegExpLiteral(pos) { + return deserializeRegExpLiteral(uint32[pos >> 2]); +} + +function deserializeBoxStringLiteral(pos) { + return deserializeStringLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTemplateLiteral(pos) { + return deserializeTemplateLiteral(uint32[pos >> 2]); +} + +function deserializeBoxIdentifierReference(pos) { + return deserializeIdentifierReference(uint32[pos >> 2]); +} + +function deserializeBoxMetaProperty(pos) { + return deserializeMetaProperty(uint32[pos >> 2]); +} + +function deserializeBoxSuper(pos) { + return deserializeSuper(uint32[pos >> 2]); +} + +function deserializeBoxArrayExpression(pos) { + return deserializeArrayExpression(uint32[pos >> 2]); +} + +function deserializeBoxArrowFunctionExpression(pos) { + return deserializeArrowFunctionExpression(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentExpression(pos) { + return deserializeAssignmentExpression(uint32[pos >> 2]); +} + +function deserializeBoxAwaitExpression(pos) { + return deserializeAwaitExpression(uint32[pos >> 2]); +} + +function deserializeBoxBinaryExpression(pos) { + return deserializeBinaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxCallExpression(pos) { + return deserializeCallExpression(uint32[pos >> 2]); +} + +function deserializeBoxChainExpression(pos) { + return deserializeChainExpression(uint32[pos >> 2]); +} + +function deserializeBoxClass(pos) { + return deserializeClass(uint32[pos >> 2]); +} + +function deserializeBoxConditionalExpression(pos) { + return deserializeConditionalExpression(uint32[pos >> 2]); +} + +function deserializeBoxFunction(pos) { + return deserializeFunction(uint32[pos >> 2]); +} + +function deserializeBoxImportExpression(pos) { + return deserializeImportExpression(uint32[pos >> 2]); +} + +function deserializeBoxLogicalExpression(pos) { + return deserializeLogicalExpression(uint32[pos >> 2]); +} + +function deserializeBoxNewExpression(pos) { + return deserializeNewExpression(uint32[pos >> 2]); +} + +function deserializeBoxObjectExpression(pos) { + return deserializeObjectExpression(uint32[pos >> 2]); +} + +function deserializeBoxParenthesizedExpression(pos) { + return deserializeParenthesizedExpression(uint32[pos >> 2]); +} + +function deserializeBoxSequenceExpression(pos) { + return deserializeSequenceExpression(uint32[pos >> 2]); +} + +function deserializeBoxTaggedTemplateExpression(pos) { + return deserializeTaggedTemplateExpression(uint32[pos >> 2]); +} + +function deserializeBoxThisExpression(pos) { + return deserializeThisExpression(uint32[pos >> 2]); +} + +function deserializeBoxUnaryExpression(pos) { + return deserializeUnaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxUpdateExpression(pos) { + return deserializeUpdateExpression(uint32[pos >> 2]); +} + +function deserializeBoxYieldExpression(pos) { + return deserializeYieldExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateInExpression(pos) { + return deserializePrivateInExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXElement(pos) { + return deserializeJSXElement(uint32[pos >> 2]); +} + +function deserializeBoxJSXFragment(pos) { + return deserializeJSXFragment(uint32[pos >> 2]); +} + +function deserializeBoxTSAsExpression(pos) { + return deserializeTSAsExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSSatisfiesExpression(pos) { + return deserializeTSSatisfiesExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAssertion(pos) { + return deserializeTSTypeAssertion(uint32[pos >> 2]); +} + +function deserializeBoxTSNonNullExpression(pos) { + return deserializeTSNonNullExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSInstantiationExpression(pos) { + return deserializeTSInstantiationExpression(uint32[pos >> 2]); +} + +function deserializeBoxV8IntrinsicExpression(pos) { + return deserializeV8IntrinsicExpression(uint32[pos >> 2]); +} + +function deserializeVecArrayExpressionElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArrayExpressionElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxSpreadElement(pos) { + return deserializeSpreadElement(uint32[pos >> 2]); +} + +function deserializeVecObjectPropertyKind(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeObjectPropertyKind(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxObjectProperty(pos) { + return deserializeObjectProperty(uint32[pos >> 2]); +} + +function deserializeBool(pos) { + return uint8[pos] === 1; +} + +function deserializeBoxIdentifierName(pos) { + return deserializeIdentifierName(uint32[pos >> 2]); +} + +function deserializeBoxPrivateIdentifier(pos) { + return deserializePrivateIdentifier(uint32[pos >> 2]); +} + +function deserializeVecTemplateElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeTemplateElement(pos)); + pos += 48; + } + return arr; +} + +function deserializeVecExpression(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeExpression(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSTypeParameterInstantiation(pos) { + return deserializeTSTypeParameterInstantiation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterInstantiation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterInstantiation(pos); +} + +function deserializeOptionStr(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeStr(pos); +} + +function deserializeBoxComputedMemberExpression(pos) { + return deserializeComputedMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxStaticMemberExpression(pos) { + return deserializeStaticMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateFieldExpression(pos) { + return deserializePrivateFieldExpression(uint32[pos >> 2]); +} + +function deserializeVecArgument(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArgument(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxArrayAssignmentTarget(pos) { + return deserializeArrayAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeBoxObjectAssignmentTarget(pos) { + return deserializeObjectAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeOptionAssignmentTargetMaybeDefault(pos) { + if (uint8[pos] === 51) return null; + return deserializeAssignmentTargetMaybeDefault(pos); +} + +function deserializeVecOptionAssignmentTargetMaybeDefault(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeOptionAssignmentTargetMaybeDefault(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetRest(pos) { + return deserializeAssignmentTargetRest(uint32[pos >> 2]); +} + +function deserializeOptionBoxAssignmentTargetRest(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxAssignmentTargetRest(pos); +} + +function deserializeVecAssignmentTargetProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeAssignmentTargetProperty(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetWithDefault(pos) { + return deserializeAssignmentTargetWithDefault(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyIdentifier(pos) { + return deserializeAssignmentTargetPropertyIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyProperty(pos) { + return deserializeAssignmentTargetPropertyProperty(uint32[pos >> 2]); +} + +function deserializeOptionExpression(pos) { + if (uint8[pos] === 51) return null; + return deserializeExpression(pos); +} + +function deserializeBoxBlockStatement(pos) { + return deserializeBlockStatement(uint32[pos >> 2]); +} + +function deserializeBoxBreakStatement(pos) { + return deserializeBreakStatement(uint32[pos >> 2]); +} + +function deserializeBoxContinueStatement(pos) { + return deserializeContinueStatement(uint32[pos >> 2]); +} + +function deserializeBoxDebuggerStatement(pos) { + return deserializeDebuggerStatement(uint32[pos >> 2]); +} + +function deserializeBoxDoWhileStatement(pos) { + return deserializeDoWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxEmptyStatement(pos) { + return deserializeEmptyStatement(uint32[pos >> 2]); +} + +function deserializeBoxExpressionStatement(pos) { + return deserializeExpressionStatement(uint32[pos >> 2]); +} + +function deserializeBoxForInStatement(pos) { + return deserializeForInStatement(uint32[pos >> 2]); +} + +function deserializeBoxForOfStatement(pos) { + return deserializeForOfStatement(uint32[pos >> 2]); +} + +function deserializeBoxForStatement(pos) { + return deserializeForStatement(uint32[pos >> 2]); +} + +function deserializeBoxIfStatement(pos) { + return deserializeIfStatement(uint32[pos >> 2]); +} + +function deserializeBoxLabeledStatement(pos) { + return deserializeLabeledStatement(uint32[pos >> 2]); +} + +function deserializeBoxReturnStatement(pos) { + return deserializeReturnStatement(uint32[pos >> 2]); +} + +function deserializeBoxSwitchStatement(pos) { + return deserializeSwitchStatement(uint32[pos >> 2]); +} + +function deserializeBoxThrowStatement(pos) { + return deserializeThrowStatement(uint32[pos >> 2]); +} + +function deserializeBoxTryStatement(pos) { + return deserializeTryStatement(uint32[pos >> 2]); +} + +function deserializeBoxWhileStatement(pos) { + return deserializeWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxWithStatement(pos) { + return deserializeWithStatement(uint32[pos >> 2]); +} + +function deserializeBoxVariableDeclaration(pos) { + return deserializeVariableDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAliasDeclaration(pos) { + return deserializeTSTypeAliasDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSInterfaceDeclaration(pos) { + return deserializeTSInterfaceDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSEnumDeclaration(pos) { + return deserializeTSEnumDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSModuleDeclaration(pos) { + return deserializeTSModuleDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSImportEqualsDeclaration(pos) { + return deserializeTSImportEqualsDeclaration(uint32[pos >> 2]); +} + +function deserializeVecVariableDeclarator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeVariableDeclarator(pos)); + pos += 64; + } + return arr; +} + +function deserializeOptionStatement(pos) { + if (uint8[pos] === 70) return null; + return deserializeStatement(pos); +} + +function deserializeOptionForStatementInit(pos) { + if (uint8[pos] === 65) return null; + return deserializeForStatementInit(pos); +} + +function deserializeOptionLabelIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeLabelIdentifier(pos); +} + +function deserializeVecSwitchCase(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeSwitchCase(pos)); + pos += 48; + } + return arr; +} + +function deserializeBoxCatchClause(pos) { + return deserializeCatchClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxCatchClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxCatchClause(pos); +} + +function deserializeOptionBoxBlockStatement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBlockStatement(pos); +} + +function deserializeOptionCatchParameter(pos) { + if (uint8[pos + 32] === 2) return null; + return deserializeCatchParameter(pos); +} + +function deserializeBoxTSTypeAnnotation(pos) { + return deserializeTSTypeAnnotation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeAnnotation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeAnnotation(pos); +} + +function deserializeBoxBindingIdentifier(pos) { + return deserializeBindingIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxObjectPattern(pos) { + return deserializeObjectPattern(uint32[pos >> 2]); +} + +function deserializeBoxArrayPattern(pos) { + return deserializeArrayPattern(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentPattern(pos) { + return deserializeAssignmentPattern(uint32[pos >> 2]); +} + +function deserializeVecBindingProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeBindingProperty(pos)); + pos += 64; + } + return arr; +} + +function deserializeBoxBindingRestElement(pos) { + return deserializeBindingRestElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxBindingRestElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBindingRestElement(pos); +} + +function deserializeOptionBindingPattern(pos) { + if (uint8[pos + 24] === 2) return null; + return deserializeBindingPattern(pos); +} + +function deserializeVecOptionBindingPattern(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeOptionBindingPattern(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionBindingIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeBindingIdentifier(pos); +} + +function deserializeBoxTSTypeParameterDeclaration(pos) { + return deserializeTSTypeParameterDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterDeclaration(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterDeclaration(pos); +} + +function deserializeBoxTSThisParameter(pos) { + return deserializeTSThisParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSThisParameter(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSThisParameter(pos); +} + +function deserializeBoxFormalParameters(pos) { + return deserializeFormalParameters(uint32[pos >> 2]); +} + +function deserializeBoxFunctionBody(pos) { + return deserializeFunctionBody(uint32[pos >> 2]); +} + +function deserializeOptionBoxFunctionBody(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxFunctionBody(pos); +} + +function deserializeVecFormalParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeFormalParameter(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecDecorator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeDecorator(pos)); + pos += 24; + } + return arr; +} + +function deserializeOptionTSAccessibility(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSAccessibility(pos); +} + +function deserializeVecTSClassImplements(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSClassImplements(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxClassBody(pos) { + return deserializeClassBody(uint32[pos >> 2]); +} + +function deserializeVecClassElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeClassElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxStaticBlock(pos) { + return deserializeStaticBlock(uint32[pos >> 2]); +} + +function deserializeBoxMethodDefinition(pos) { + return deserializeMethodDefinition(uint32[pos >> 2]); +} + +function deserializeBoxPropertyDefinition(pos) { + return deserializePropertyDefinition(uint32[pos >> 2]); +} + +function deserializeBoxAccessorProperty(pos) { + return deserializeAccessorProperty(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexSignature(pos) { + return deserializeTSIndexSignature(uint32[pos >> 2]); +} + +function deserializeBoxImportDeclaration(pos) { + return deserializeImportDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportAllDeclaration(pos) { + return deserializeExportAllDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportDefaultDeclaration(pos) { + return deserializeExportDefaultDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportNamedDeclaration(pos) { + return deserializeExportNamedDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSExportAssignment(pos) { + return deserializeTSExportAssignment(uint32[pos >> 2]); +} + +function deserializeBoxTSNamespaceExportDeclaration(pos) { + return deserializeTSNamespaceExportDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionImportPhase(pos) { + if (uint8[pos] === 2) return null; + return deserializeImportPhase(pos); +} + +function deserializeVecImportDeclarationSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeImportDeclarationSpecifier(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionVecImportDeclarationSpecifier(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeVecImportDeclarationSpecifier(pos); +} + +function deserializeBoxWithClause(pos) { + return deserializeWithClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxWithClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxWithClause(pos); +} + +function deserializeBoxImportSpecifier(pos) { + return deserializeImportSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportDefaultSpecifier(pos) { + return deserializeImportDefaultSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportNamespaceSpecifier(pos) { + return deserializeImportNamespaceSpecifier(uint32[pos >> 2]); +} + +function deserializeVecImportAttribute(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 112; + for (; pos !== endPos;) { + arr.push(deserializeImportAttribute(pos)); + pos += 112; + } + return arr; +} + +function deserializeOptionDeclaration(pos) { + if (uint8[pos] === 31) return null; + return deserializeDeclaration(pos); +} + +function deserializeVecExportSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 128; + for (; pos !== endPos;) { + arr.push(deserializeExportSpecifier(pos)); + pos += 128; + } + return arr; +} + +function deserializeOptionStringLiteral(pos) { + if (uint8[pos + 40] === 2) return null; + return deserializeStringLiteral(pos); +} + +function deserializeOptionModuleExportName(pos) { + if (uint8[pos] === 3) return null; + return deserializeModuleExportName(pos); +} + +function deserializeF64(pos) { + return float64[pos >> 3]; +} + +function deserializeBoxJSXOpeningElement(pos) { + return deserializeJSXOpeningElement(uint32[pos >> 2]); +} + +function deserializeVecJSXChild(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXChild(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXClosingElement(pos) { + return deserializeJSXClosingElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxJSXClosingElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxJSXClosingElement(pos); +} + +function deserializeVecJSXAttributeItem(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXAttributeItem(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXIdentifier(pos) { + return deserializeJSXIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxJSXNamespacedName(pos) { + return deserializeJSXNamespacedName(uint32[pos >> 2]); +} + +function deserializeBoxJSXMemberExpression(pos) { + return deserializeJSXMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXAttribute(pos) { + return deserializeJSXAttribute(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadAttribute(pos) { + return deserializeJSXSpreadAttribute(uint32[pos >> 2]); +} + +function deserializeOptionJSXAttributeValue(pos) { + if (uint8[pos] === 4) return null; + return deserializeJSXAttributeValue(pos); +} + +function deserializeBoxJSXExpressionContainer(pos) { + return deserializeJSXExpressionContainer(uint32[pos >> 2]); +} + +function deserializeBoxJSXText(pos) { + return deserializeJSXText(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadChild(pos) { + return deserializeJSXSpreadChild(uint32[pos >> 2]); +} + +function deserializeVecTSEnumMember(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 40; + for (; pos !== endPos;) { + arr.push(deserializeTSEnumMember(pos)); + pos += 40; + } + return arr; +} + +function deserializeBoxTSAnyKeyword(pos) { + return deserializeTSAnyKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBigIntKeyword(pos) { + return deserializeTSBigIntKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBooleanKeyword(pos) { + return deserializeTSBooleanKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSIntrinsicKeyword(pos) { + return deserializeTSIntrinsicKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNeverKeyword(pos) { + return deserializeTSNeverKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNullKeyword(pos) { + return deserializeTSNullKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNumberKeyword(pos) { + return deserializeTSNumberKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSObjectKeyword(pos) { + return deserializeTSObjectKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSStringKeyword(pos) { + return deserializeTSStringKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSSymbolKeyword(pos) { + return deserializeTSSymbolKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUndefinedKeyword(pos) { + return deserializeTSUndefinedKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUnknownKeyword(pos) { + return deserializeTSUnknownKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSVoidKeyword(pos) { + return deserializeTSVoidKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSArrayType(pos) { + return deserializeTSArrayType(uint32[pos >> 2]); +} + +function deserializeBoxTSConditionalType(pos) { + return deserializeTSConditionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructorType(pos) { + return deserializeTSConstructorType(uint32[pos >> 2]); +} + +function deserializeBoxTSFunctionType(pos) { + return deserializeTSFunctionType(uint32[pos >> 2]); +} + +function deserializeBoxTSImportType(pos) { + return deserializeTSImportType(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexedAccessType(pos) { + return deserializeTSIndexedAccessType(uint32[pos >> 2]); +} + +function deserializeBoxTSInferType(pos) { + return deserializeTSInferType(uint32[pos >> 2]); +} + +function deserializeBoxTSIntersectionType(pos) { + return deserializeTSIntersectionType(uint32[pos >> 2]); +} + +function deserializeBoxTSLiteralType(pos) { + return deserializeTSLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSMappedType(pos) { + return deserializeTSMappedType(uint32[pos >> 2]); +} + +function deserializeBoxTSNamedTupleMember(pos) { + return deserializeTSNamedTupleMember(uint32[pos >> 2]); +} + +function deserializeBoxTSTemplateLiteralType(pos) { + return deserializeTSTemplateLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSThisType(pos) { + return deserializeTSThisType(uint32[pos >> 2]); +} + +function deserializeBoxTSTupleType(pos) { + return deserializeTSTupleType(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeLiteral(pos) { + return deserializeTSTypeLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeOperator(pos) { + return deserializeTSTypeOperator(uint32[pos >> 2]); +} + +function deserializeBoxTSTypePredicate(pos) { + return deserializeTSTypePredicate(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeQuery(pos) { + return deserializeTSTypeQuery(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeReference(pos) { + return deserializeTSTypeReference(uint32[pos >> 2]); +} + +function deserializeBoxTSUnionType(pos) { + return deserializeTSUnionType(uint32[pos >> 2]); +} + +function deserializeBoxTSParenthesizedType(pos) { + return deserializeTSParenthesizedType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNullableType(pos) { + return deserializeJSDocNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNonNullableType(pos) { + return deserializeJSDocNonNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocUnknownType(pos) { + return deserializeJSDocUnknownType(uint32[pos >> 2]); +} + +function deserializeVecTSType(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSType(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecTSTupleElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSTupleElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSOptionalType(pos) { + return deserializeTSOptionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSRestType(pos) { + return deserializeTSRestType(uint32[pos >> 2]); +} + +function deserializeBoxTSQualifiedName(pos) { + return deserializeTSQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSType(pos) { + if (uint8[pos] === 38) return null; + return deserializeTSType(pos); +} + +function deserializeVecTSTypeParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeTSTypeParameter(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecTSInterfaceHeritage(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSInterfaceHeritage(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxTSInterfaceBody(pos) { + return deserializeTSInterfaceBody(uint32[pos >> 2]); +} + +function deserializeVecTSSignature(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSSignature(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSPropertySignature(pos) { + return deserializeTSPropertySignature(uint32[pos >> 2]); +} + +function deserializeBoxTSCallSignatureDeclaration(pos) { + return deserializeTSCallSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructSignatureDeclaration(pos) { + return deserializeTSConstructSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSMethodSignature(pos) { + return deserializeTSMethodSignature(uint32[pos >> 2]); +} + +function deserializeVecTSIndexSignatureName(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSIndexSignatureName(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionTSModuleDeclarationBody(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSModuleDeclarationBody(pos); +} + +function deserializeBoxTSModuleBlock(pos) { + return deserializeTSModuleBlock(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeParameter(pos) { + return deserializeTSTypeParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxObjectExpression(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxObjectExpression(pos); +} + +function deserializeOptionTSImportTypeQualifier(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSImportTypeQualifier(pos); +} + +function deserializeBoxTSImportTypeQualifiedName(pos) { + return deserializeTSImportTypeQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSMappedTypeModifierOperator(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSMappedTypeModifierOperator(pos); +} + +function deserializeBoxTSExternalModuleReference(pos) { + return deserializeTSExternalModuleReference(uint32[pos >> 2]); +} + +function deserializeOptionNameSpan(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + +function deserializeVecError(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeError(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecErrorLabel(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeErrorLabel(pos)); + pos += 24; + } + return arr; +} + +function deserializeVecStaticImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 56; + for (; pos !== endPos;) { + arr.push(deserializeStaticImport(pos)); + pos += 56; + } + return arr; +} + +function deserializeVecStaticExport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeStaticExport(pos)); + pos += 32; + } + return arr; +} + +function deserializeVecDynamicImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeDynamicImport(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecSpan(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 8; + for (; pos !== endPos;) { + arr.push(deserializeSpan(pos)); + pos += 8; + } + return arr; +} + +function deserializeVecImportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 96; + for (; pos !== endPos;) { + arr.push(deserializeImportEntry(pos)); + pos += 96; + } + return arr; +} + +function deserializeVecExportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 144; + for (; pos !== endPos;) { + arr.push(deserializeExportEntry(pos)); + pos += 144; + } + return arr; +} diff --git a/napi/parser/generated/deserialize/ts_range.js b/napi/parser/generated/deserialize/ts_range.js index a32e97a2b21a0..eaffe148e721d 100644 --- a/napi/parser/generated/deserialize/ts_range.js +++ b/napi/parser/generated/deserialize/ts_range.js @@ -31,29 +31,35 @@ function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserializ } function deserializeProgram(pos) { - let body = deserializeVecDirective(pos + 72); + let end = deserializeU32(pos + 4), + program = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start: 0, + end, + range: [0, end], + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + let body = program.body = deserializeVecDirective(pos + 72); body.push(...deserializeVecStatement(pos + 96)); - let end = deserializeU32(pos + 4), start; - if (body.length > 0) { - let first = body[0]; - start = first.start; - if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { - let { declaration } = first; - if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { - let decoratorStart = declaration.decorators[0].start; - decoratorStart < start && (start = decoratorStart); + { + let start; + if (body.length > 0) { + let first = body[0]; + start = first.start; + if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { + let { declaration } = first; + if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { + let decoratorStart = declaration.decorators[0].start; + decoratorStart < start && (start = decoratorStart); + } } - } - } else start = end; - return { - type: 'Program', - body, - sourceType: deserializeModuleKind(pos + 125), - hashbang: deserializeOptionHashbang(pos + 48), - start, - end, - range: [start, end], - }; + } else start = end; + program.start = program.range[0] = start; + } + return program; } function deserializeExpression(pos) { @@ -150,59 +156,79 @@ function deserializeExpression(pos) { } function deserializeIdentifierName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeIdentifierReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeLabelIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeThisExpression(pos) { @@ -216,14 +242,17 @@ function deserializeThisExpression(pos) { } function deserializeArrayExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ArrayExpression', - elements: deserializeVecArrayExpressionElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ArrayExpression', + elements: null, + start, + end, + range: [start, end], + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + return node; } function deserializeArrayExpressionElement(pos) { @@ -328,14 +357,17 @@ function deserializeElision(pos) { } function deserializeObjectExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ObjectExpression', - properties: deserializeVecObjectPropertyKind(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ObjectExpression', + properties: null, + start, + end, + range: [start, end], + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + return node; } function deserializeObjectPropertyKind(pos) { @@ -350,20 +382,25 @@ function deserializeObjectPropertyKind(pos) { } function deserializeObjectProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: deserializePropertyKind(pos + 40), - key: deserializePropertyKey(pos + 8), - value: deserializeExpression(pos + 24), - method: deserializeBool(pos + 41), - shorthand: deserializeBool(pos + 42), - computed: deserializeBool(pos + 43), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + optional: null, + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + node.optional = false; + return node; } function deserializePropertyKey(pos) { @@ -477,28 +514,37 @@ function deserializePropertyKind(pos) { } function deserializeTemplateLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TemplateLiteral', - quasis: deserializeVecTemplateElement(pos + 8), - expressions: deserializeVecExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + return node; } function deserializeTaggedTemplateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TaggedTemplateExpression', - tag: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - quasi: deserializeTemplateLiteral(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TaggedTemplateExpression', + tag: null, + typeArguments: null, + quasi: null, + start, + end, + range: [start, end], + }; + node.tag = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.quasi = deserializeTemplateLiteral(pos + 32); + return node; } function deserializeTemplateElement(pos) { @@ -526,95 +572,127 @@ function deserializeTemplateElementValue(pos) { } function deserializeComputedMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeExpression(pos + 24), - optional: deserializeBool(pos + 40), - computed: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + return node; } function deserializeStaticMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeIdentifierName(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + return node; } function deserializePrivateFieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializePrivateIdentifier(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + return node; } function deserializeCallExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CallExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - optional: deserializeBool(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CallExpression', + callee: null, + typeArguments: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeNewExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'NewExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'NewExpression', + callee: null, + typeArguments: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeMetaProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MetaProperty', - meta: deserializeIdentifierName(pos + 8), - property: deserializeIdentifierName(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + range: [start, end], + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + return node; } function deserializeSpreadElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SpreadElement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SpreadElement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeArgument(pos) { @@ -713,94 +791,123 @@ function deserializeArgument(pos) { } function deserializeUpdateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UpdateExpression', - operator: deserializeUpdateOperator(pos + 24), - prefix: deserializeBool(pos + 25), - argument: deserializeSimpleAssignmentTarget(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + return node; } function deserializeUnaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UnaryExpression', - operator: deserializeUnaryOperator(pos + 24), - argument: deserializeExpression(pos + 8), - prefix: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + return node; } function deserializeBinaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializeExpression(pos + 8), - operator: deserializeBinaryOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializePrivateInExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializePrivateIdentifier(pos + 8), - operator: 'in', - right: deserializeExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + return node; } function deserializeLogicalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LogicalExpression', - left: deserializeExpression(pos + 8), - operator: deserializeLogicalOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeConditionalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ConditionalExpression', - test: deserializeExpression(pos + 8), - consequent: deserializeExpression(pos + 24), - alternate: deserializeExpression(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + return node; } function deserializeAssignmentExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentExpression', - operator: deserializeAssignmentOperator(pos + 40), - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTarget(pos) { @@ -856,52 +963,69 @@ function deserializeSimpleAssignmentTarget(pos) { function deserializeArrayAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, properties = deserializeVecAssignmentTargetProperty(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetRest(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeAssignmentTarget(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.argument = deserializeAssignmentTarget(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeAssignmentTargetMaybeDefault(pos) { @@ -934,18 +1058,25 @@ function deserializeAssignmentTargetMaybeDefault(pos) { } function deserializeAssignmentTargetWithDefault(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetProperty(pos) { @@ -960,62 +1091,82 @@ function deserializeAssignmentTargetProperty(pos) { } function deserializeAssignmentTargetPropertyIdentifier(pos) { - let key = deserializeIdentifierReference(pos + 8), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), - init = deserializeOptionExpression(pos + 40), - keyCopy = { ...key }; - return { - type: 'Property', - kind: 'init', - key, - value: init === null ? keyCopy : { - type: 'AssignmentPattern', - decorators: [], - left: keyCopy, - right: init, - optional: false, - typeAnnotation: null, + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + optional: null, start, end, range: [start, end], }, - method: false, - shorthand: true, - computed: false, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + init !== null && (value = { + type: 'AssignmentPattern', + decorators: [], + left: value, + right: init, optional: false, + typeAnnotation: null, start, end, range: [start, end], - }; + }); + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + node.optional = false; + return node; } function deserializeAssignmentTargetPropertyProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeAssignmentTargetMaybeDefault(pos + 24), - method: false, - shorthand: false, - computed: deserializeBool(pos + 40), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + optional: null, + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + node.optional = false; + return node; } function deserializeSequenceExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SequenceExpression', - expressions: deserializeVecExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SequenceExpression', + expressions: null, + start, + end, + range: [start, end], + }; + node.expressions = deserializeVecExpression(pos + 8); + return node; } function deserializeSuper(pos) { @@ -1029,25 +1180,31 @@ function deserializeSuper(pos) { } function deserializeAwaitExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AwaitExpression', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AwaitExpression', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeChainExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ChainExpression', - expression: deserializeChainElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ChainExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeChainElement(pos + 8); + return node; } function deserializeChainElement(pos) { @@ -1068,16 +1225,17 @@ function deserializeChainElement(pos) { } function deserializeParenthesizedExpression(pos) { - let node = deserializeExpression(pos + 8); + let node; { let start, end; node = { type: 'ParenthesizedExpression', - expression: node, + expression: null, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + node.expression = deserializeExpression(pos + 8); } return node; } @@ -1154,15 +1312,18 @@ function deserializeStatement(pos) { } function deserializeDirective(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeStringLiteral(pos + 8), - directive: deserializeStr(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeHashbang(pos) { @@ -1177,14 +1338,17 @@ function deserializeHashbang(pos) { } function deserializeBlockStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BlockStatement', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeDeclaration(pos) { @@ -1211,16 +1375,19 @@ function deserializeDeclaration(pos) { } function deserializeVariableDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclaration', - kind: deserializeVariableDeclarationKind(pos + 32), - declarations: deserializeVecVariableDeclarator(pos + 8), - declare: deserializeBool(pos + 33), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + declare: deserializeBool(pos + 33), + start, + end, + range: [start, end], + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + return node; } function deserializeVariableDeclarationKind(pos) { @@ -1241,16 +1408,20 @@ function deserializeVariableDeclarationKind(pos) { } function deserializeVariableDeclarator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclarator', - id: deserializeBindingPattern(pos + 8), - init: deserializeOptionExpression(pos + 40), - definite: deserializeBool(pos + 57), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclarator', + id: null, + init: null, + definite: deserializeBool(pos + 57), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + return node; } function deserializeEmptyStatement(pos) { @@ -1264,66 +1435,89 @@ function deserializeEmptyStatement(pos) { } function deserializeExpressionStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeExpression(pos + 8), - directive: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.directive = null; + return node; } function deserializeIfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'IfStatement', - test: deserializeExpression(pos + 8), - consequent: deserializeStatement(pos + 24), - alternate: deserializeOptionStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + return node; } function deserializeDoWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'DoWhileStatement', - body: deserializeStatement(pos + 8), - test: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + range: [start, end], + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + return node; } function deserializeWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WhileStatement', - test: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeForStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForStatement', - init: deserializeOptionForStatementInit(pos + 8), - test: deserializeOptionExpression(pos + 24), - update: deserializeOptionExpression(pos + 40), - body: deserializeStatement(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + range: [start, end], + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + return node; } function deserializeForStatementInit(pos) { @@ -1422,16 +1616,21 @@ function deserializeForStatementInit(pos) { } function deserializeForInStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForInStatement', - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeForStatementLeft(pos) { @@ -1464,134 +1663,176 @@ function deserializeForStatementLeft(pos) { } function deserializeForOfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForOfStatement', - await: deserializeBool(pos + 60), - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeContinueStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ContinueStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ContinueStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeBreakStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BreakStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BreakStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeReturnStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ReturnStatement', - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ReturnStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeWithStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WithStatement', - object: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeSwitchStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchStatement', - discriminant: deserializeExpression(pos + 8), - cases: deserializeVecSwitchCase(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + range: [start, end], + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + return node; } function deserializeSwitchCase(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchCase', - test: deserializeOptionExpression(pos + 8), - consequent: deserializeVecStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + range: [start, end], + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + return node; } function deserializeLabeledStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LabeledStatement', - label: deserializeLabelIdentifier(pos + 8), - body: deserializeStatement(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + range: [start, end], + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + return node; } function deserializeThrowStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ThrowStatement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ThrowStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeTryStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TryStatement', - block: deserializeBoxBlockStatement(pos + 8), - handler: deserializeOptionBoxCatchClause(pos + 16), - finalizer: deserializeOptionBoxBlockStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + range: [start, end], + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + return node; } function deserializeCatchClause(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CatchClause', - param: deserializeOptionCatchParameter(pos + 8), - body: deserializeBoxBlockStatement(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + range: [start, end], + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + return node; } function deserializeCatchParameter(pos) { @@ -1631,109 +1872,149 @@ function deserializeBindingPatternKind(pos) { } function deserializeAssignmentPattern(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeBindingPattern(pos + 8), - right: deserializeExpression(pos + 40), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, properties = deserializeVecBindingProperty(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeBindingPattern(pos + 24), - method: false, - shorthand: deserializeBool(pos + 56), - computed: deserializeBool(pos + 57), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + optional: null, + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + node.optional = false; + return node; } function deserializeArrayPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionBindingPattern(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingRestElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeBindingPattern(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.argument = deserializeBindingPattern(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeFunction(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), params = deserializeBoxFormalParameters(pos + 56); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + declare: deserializeBool(pos + 87), + typeParameters: null, + params: null, + returnType: null, + body: null, + expression: null, + start, + end, + range: [start, end], + }, + params = deserializeBoxFormalParameters(pos + 56); { let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); thisParam !== null && params.unshift(thisParam); } - return { - type: deserializeFunctionType(pos + 84), - id: deserializeOptionBindingIdentifier(pos + 8), - generator: deserializeBool(pos + 85), - async: deserializeBool(pos + 86), - declare: deserializeBool(pos + 87), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 64), - body: deserializeOptionBoxFunctionBody(pos + 72), - expression: false, - start, - end, - range: [start, end], - }; + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 64); + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + return node; } function deserializeFunctionType(pos) { @@ -1755,18 +2036,22 @@ function deserializeFormalParameters(pos) { let params = deserializeVecFormalParameter(pos + 8); if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { pos = uint32[pos + 32 >> 2]; - let start, end; - params.push({ - type: 'RestElement', - decorators: [], - argument: deserializeBindingPatternKind(pos + 8), - optional: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - value: null, - start: start = deserializeU32(pos), - end: end = deserializeU32(pos + 4), - range: [start, end], - }); + let start, + end, + rest = { + type: 'RestElement', + decorators: [], + argument: null, + optional: deserializeBool(pos + 32), + typeAnnotation: null, + value: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + rest.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + params.push(rest); } return params; } @@ -1787,82 +2072,108 @@ function deserializeFormalParameter(pos) { param = { type: 'TSParameterProperty', accessibility, - decorators: deserializeVecDecorator(pos + 8), + decorators: null, override, - parameter: deserializeBindingPattern(pos + 32), + parameter: null, readonly, static: false, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + param.decorators = deserializeVecDecorator(pos + 8); + param.parameter = deserializeBindingPattern(pos + 32); } } return param; } function deserializeFunctionBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'BlockStatement', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeArrowFunctionExpression(pos) { let expression = deserializeBool(pos + 44), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + typeParameters: null, + params: null, + returnType: null, + body: null, + id: null, + generator: null, + start, + end, + range: [start, end], + }, body = deserializeBoxFunctionBody(pos + 32); - return { - type: 'ArrowFunctionExpression', - expression, - async: deserializeBool(pos + 45), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - body: expression ? body.body[0].expression : body, - id: null, - generator: false, - start, - end, - range: [start, end], - }; + expression === true && (body = body.body[0].expression); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.body = body; + node.id = null; + node.generator = false; + return node; } function deserializeYieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'YieldExpression', - delegate: deserializeBool(pos + 24), - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeClass(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeClassType(pos + 132), - decorators: deserializeVecDecorator(pos + 8), - id: deserializeOptionBindingIdentifier(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 64), - superClass: deserializeOptionExpression(pos + 72), - superTypeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 88), - implements: deserializeVecTSClassImplements(pos + 96), - body: deserializeBoxClassBody(pos + 120), - abstract: deserializeBool(pos + 133), - declare: deserializeBool(pos + 134), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + typeParameters: null, + superClass: null, + superTypeArguments: null, + implements: null, + body: null, + abstract: deserializeBool(pos + 133), + declare: deserializeBool(pos + 134), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 64); + node.superClass = deserializeOptionExpression(pos + 72); + node.superTypeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 88); + node.implements = deserializeVecTSClassImplements(pos + 96); + node.body = deserializeBoxClassBody(pos + 120); + return node; } function deserializeClassType(pos) { @@ -1877,14 +2188,17 @@ function deserializeClassType(pos) { } function deserializeClassBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ClassBody', - body: deserializeVecClassElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ClassBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecClassElement(pos + 8); + return node; } function deserializeClassElement(pos) { @@ -1905,22 +2219,27 @@ function deserializeClassElement(pos) { } function deserializeMethodDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeMethodDefinitionType(pos + 56), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeBoxFunction(pos + 48), - kind: deserializeMethodDefinitionKind(pos + 57), - computed: deserializeBool(pos + 58), - static: deserializeBool(pos + 59), - override: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - accessibility: deserializeOptionTSAccessibility(pos + 62), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + override: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + accessibility: deserializeOptionTSAccessibility(pos + 62), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + return node; } function deserializeMethodDefinitionType(pos) { @@ -1935,25 +2254,31 @@ function deserializeMethodDefinitionType(pos) { } function deserializePropertyDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializePropertyDefinitionType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - declare: deserializeBool(pos + 75), - override: deserializeBool(pos + 76), - optional: deserializeBool(pos + 77), - definite: deserializeBool(pos + 78), - readonly: deserializeBool(pos + 79), - accessibility: deserializeOptionTSAccessibility(pos + 80), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + declare: deserializeBool(pos + 75), + override: deserializeBool(pos + 76), + optional: deserializeBool(pos + 77), + definite: deserializeBool(pos + 78), + readonly: deserializeBool(pos + 79), + accessibility: deserializeOptionTSAccessibility(pos + 80), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializePropertyDefinitionType(pos) { @@ -1994,14 +2319,17 @@ function deserializePrivateIdentifier(pos) { } function deserializeStaticBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'StaticBlock', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'StaticBlock', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeAccessorPropertyType(pos) { @@ -2016,57 +2344,74 @@ function deserializeAccessorPropertyType(pos) { } function deserializeAccessorProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeAccessorPropertyType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - override: deserializeBool(pos + 75), - definite: deserializeBool(pos + 76), - accessibility: deserializeOptionTSAccessibility(pos + 77), - declare: false, - optional: false, - readonly: false, - start, - end, - range: [start, end], - }; -} - -function deserializeImportExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportExpression', - source: deserializeExpression(pos + 8), - options: deserializeOptionExpression(pos + 24), - phase: deserializeOptionImportPhase(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + override: deserializeBool(pos + 75), + definite: deserializeBool(pos + 76), + accessibility: deserializeOptionTSAccessibility(pos + 77), + declare: null, + optional: null, + readonly: null, + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + node.declare = false; + node.optional = false; + node.readonly = false; + return node; +} + +function deserializeImportExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + range: [start, end], + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + return node; } function deserializeImportDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + importKind: deserializeImportOrExportKind(pos + 89), + start, + end, + range: [start, end], + }, specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); specifiers === null && (specifiers = []); let withClause = deserializeOptionBoxWithClause(pos + 80); - return { - type: 'ImportDeclaration', - specifiers, - source: deserializeStringLiteral(pos + 32), - phase: deserializeOptionImportPhase(pos + 88), - attributes: withClause === null ? [] : withClause.attributes, - importKind: deserializeImportOrExportKind(pos + 89), - start, - end, - range: [start, end], - }; + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeImportPhase(pos) { @@ -2094,38 +2439,48 @@ function deserializeImportDeclarationSpecifier(pos) { } function deserializeImportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportSpecifier', - imported: deserializeModuleExportName(pos + 8), - local: deserializeBindingIdentifier(pos + 64), - importKind: deserializeImportOrExportKind(pos + 96), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportSpecifier', + imported: null, + local: null, + importKind: deserializeImportOrExportKind(pos + 96), + start, + end, + range: [start, end], + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + return node; } function deserializeImportDefaultSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportDefaultSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeImportNamespaceSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportNamespaceSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeWithClause(pos) { @@ -2133,15 +2488,19 @@ function deserializeWithClause(pos) { } function deserializeImportAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportAttribute', - key: deserializeImportAttributeKey(pos + 8), - value: deserializeStringLiteral(pos + 64), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + range: [start, end], + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + return node; } function deserializeImportAttributeKey(pos) { @@ -2156,59 +2515,78 @@ function deserializeImportAttributeKey(pos) { } function deserializeExportNamedDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), withClause = deserializeOptionBoxWithClause(pos + 96); - return { - type: 'ExportNamedDeclaration', - declaration: deserializeOptionDeclaration(pos + 8), - specifiers: deserializeVecExportSpecifier(pos + 24), - source: deserializeOptionStringLiteral(pos + 48), - exportKind: deserializeImportOrExportKind(pos + 104), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + exportKind: deserializeImportOrExportKind(pos + 104), + attributes: null, + start, + end, + range: [start, end], + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportDefaultDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportDefaultDeclaration', - declaration: deserializeExportDefaultDeclarationKind(pos + 8), - exportKind: 'value', - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportDefaultDeclaration', + declaration: null, + exportKind: null, + start, + end, + range: [start, end], + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + node.exportKind = 'value'; + return node; } function deserializeExportAllDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + }, withClause = deserializeOptionBoxWithClause(pos + 112); - return { - type: 'ExportAllDeclaration', - exported: deserializeOptionModuleExportName(pos + 8), - source: deserializeStringLiteral(pos + 64), - attributes: withClause === null ? [] : withClause.attributes, - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - range: [start, end], - }; + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportSpecifier', - local: deserializeModuleExportName(pos + 8), - exported: deserializeModuleExportName(pos + 64), - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportSpecifier', + local: null, + exported: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + return node; } function deserializeExportDefaultDeclarationKind(pos) { @@ -2324,39 +2702,51 @@ function deserializeModuleExportName(pos) { } function deserializeV8IntrinsicExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'V8IntrinsicExpression', - name: deserializeIdentifierName(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeBooleanLiteral(pos) { - let value = deserializeBool(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value, - raw: start === 0 && end === 0 ? null : value + '', - start, - end, - range: [start, end], - }; + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value, + raw: null, + start, + end, + range: [start, end], + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + return node; } function deserializeNullLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value: null, - raw: start === 0 && end === 0 ? null : 'null', - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: null, + start, + end, + range: [start, end], + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + return node; } function deserializeNumericLiteral(pos) { @@ -2372,46 +2762,61 @@ function deserializeNumericLiteral(pos) { } function deserializeStringLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), value = deserializeStr(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + }, + value = deserializeStr(pos + 8); deserializeBool(pos + 40) && (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 24), - start, - end, - range: [start, end], - }; + node.value = value; + return node; } function deserializeBigIntLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), bigint = deserializeStr(pos + 8); - return { - type: 'Literal', - value: BigInt(bigint), - raw: deserializeOptionStr(pos + 24), - bigint, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + range: [start, end], + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + return node; } function deserializeRegExpLiteral(pos) { - let regex = deserializeRegExp(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4), value = null; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + range: [start, end], + }, + regex = deserializeRegExp(pos + 8), + value = null; try { value = new RegExp(regex.pattern, regex.flags); } catch {} - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 40), - regex, - start, - end, - range: [start, end], - }; + node.value = value; + node.regex = regex; + return node; } function deserializeRegExp(pos) { @@ -2436,58 +2841,76 @@ function deserializeRegExpFlags(pos) { } function deserializeJSXElement(pos) { - let closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + range: [start, end], + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), openingElement = deserializeBoxJSXOpeningElement(pos + 8); closingElement === null && (openingElement.selfClosing = true); - return { - type: 'JSXElement', - openingElement, - children: deserializeVecJSXChild(pos + 16), - closingElement, - start, - end, - range: [start, end], - }; + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + return node; } function deserializeJSXOpeningElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningElement', - name: deserializeJSXElementName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - attributes: deserializeVecJSXAttributeItem(pos + 32), - selfClosing: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningElement', + name: null, + typeArguments: null, + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + return node; } function deserializeJSXClosingElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXClosingElement', - name: deserializeJSXElementName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXClosingElement', + name: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + return node; } function deserializeJSXFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXFragment', - openingFragment: deserializeJSXOpeningFragment(pos + 8), - children: deserializeVecJSXChild(pos + 16), - closingFragment: deserializeJSXClosingFragment(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + range: [start, end], + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + return node; } function deserializeJSXOpeningFragment(pos) { @@ -2542,27 +2965,35 @@ function deserializeJSXElementName(pos) { } function deserializeJSXNamespacedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXNamespacedName', - namespace: deserializeJSXIdentifier(pos + 8), - name: deserializeJSXIdentifier(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + range: [start, end], + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + return node; } function deserializeJSXMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXMemberExpression', - object: deserializeJSXMemberExpressionObject(pos + 8), - property: deserializeJSXIdentifier(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + range: [start, end], + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + return node; } function deserializeJSXMemberExpressionObject(pos) { @@ -2593,14 +3024,17 @@ function deserializeJSXMemberExpressionObject(pos) { } function deserializeJSXExpressionContainer(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXExpressionContainer', - expression: deserializeJSXExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeJSXExpression(pos + 8); + return node; } function deserializeJSXExpression(pos) { @@ -2720,26 +3154,33 @@ function deserializeJSXAttributeItem(pos) { } function deserializeJSXAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXAttribute', - name: deserializeJSXAttributeName(pos + 8), - value: deserializeOptionJSXAttributeValue(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + return node; } function deserializeJSXSpreadAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadAttribute', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeJSXAttributeName(pos) { @@ -2797,14 +3238,17 @@ function deserializeJSXChild(pos) { } function deserializeJSXSpreadChild(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadChild', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeJSXText(pos) { @@ -2820,55 +3264,73 @@ function deserializeJSXText(pos) { } function deserializeTSThisParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: 'this', - optional: false, - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 16), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + return node; } function deserializeTSEnumDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumDeclaration', - id: deserializeBindingIdentifier(pos + 8), - body: deserializeTSEnumBody(pos + 40), - const: deserializeBool(pos + 76), - declare: deserializeBool(pos + 77), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + return node; } function deserializeTSEnumBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumBody', - members: deserializeVecTSEnumMember(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumBody', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSEnumMember(pos + 8); + return node; } function deserializeTSEnumMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumMember', - id: deserializeTSEnumMemberName(pos + 8), - initializer: deserializeOptionExpression(pos + 24), - computed: deserializeU8(pos + 8) > 1, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + range: [start, end], + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + return node; } function deserializeTSEnumMemberName(pos) { @@ -2887,25 +3349,31 @@ function deserializeTSEnumMemberName(pos) { } function deserializeTSTypeAnnotation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAnnotation', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSLiteralType', - literal: deserializeTSLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSLiteralType', + literal: null, + start, + end, + range: [start, end], + }; + node.literal = deserializeTSLiteral(pos + 8); + return node; } function deserializeTSLiteral(pos) { @@ -3009,66 +3477,82 @@ function deserializeTSType(pos) { } function deserializeTSConditionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConditionalType', - checkType: deserializeTSType(pos + 8), - extendsType: deserializeTSType(pos + 24), - trueType: deserializeTSType(pos + 40), - falseType: deserializeTSType(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + range: [start, end], + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + return node; } function deserializeTSUnionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSUnionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSUnionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSIntersectionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIntersectionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIntersectionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSParenthesizedType(pos) { - let node = deserializeTSType(pos + 8); + let node; { let start, end; node = { type: 'TSParenthesizedType', - typeAnnotation: node, + typeAnnotation: null, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + node.typeAnnotation = deserializeTSType(pos + 8); } return node; } function deserializeTSTypeOperator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeOperator', - operator: deserializeTSTypeOperatorOperator(pos + 24), - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperatorOperator(pos) { @@ -3085,72 +3569,92 @@ function deserializeTSTypeOperatorOperator(pos) { } function deserializeTSArrayType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSArrayType', - elementType: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSArrayType', + elementType: null, + start, + end, + range: [start, end], + }; + node.elementType = deserializeTSType(pos + 8); + return node; } function deserializeTSIndexedAccessType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexedAccessType', - objectType: deserializeTSType(pos + 8), - indexType: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + range: [start, end], + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + return node; } function deserializeTSTupleType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTupleType', - elementTypes: deserializeVecTSTupleElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + range: [start, end], + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + return node; } function deserializeTSNamedTupleMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamedTupleMember', - label: deserializeIdentifierName(pos + 8), - elementType: deserializeTSTupleElement(pos + 32), - optional: deserializeBool(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + range: [start, end], + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + return node; } function deserializeTSOptionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSOptionalType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSRestType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSRestType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTupleElement(pos) { @@ -3379,15 +3883,19 @@ function deserializeTSBigIntKeyword(pos) { } function deserializeTSTypeReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeReference', - typeName: deserializeTSTypeName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeName(pos) { @@ -3404,67 +3912,87 @@ function deserializeTSTypeName(pos) { } function deserializeTSQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSTypeName(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSTypeParameterInstantiation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterInstantiation', - params: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSType(pos + 8); + return node; } function deserializeTSTypeParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameter', - name: deserializeBindingIdentifier(pos + 8), - constraint: deserializeOptionTSType(pos + 40), - default: deserializeOptionTSType(pos + 56), - in: deserializeBool(pos + 72), - out: deserializeBool(pos + 73), - const: deserializeBool(pos + 74), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + range: [start, end], + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + return node; } function deserializeTSTypeParameterDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterDeclaration', - params: deserializeVecTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeAliasDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAliasDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - typeAnnotation: deserializeTSType(pos + 48), - declare: deserializeBool(pos + 68), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + return node; } function deserializeTSAccessibility(pos) { @@ -3481,15 +4009,26 @@ function deserializeTSAccessibility(pos) { } function deserializeTSClassImplements(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), expression = deserializeTSTypeName(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSClassImplements', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }, + expression = deserializeTSTypeName(pos + 8); if (expression.type === 'TSQualifiedName') { let object = expression.left, + { right } = expression, start, end, - parent = expression = { + previous = expression = { type: 'MemberExpression', object, - property: expression.right, + property: right, optional: false, computed: false, start: start = expression.start, @@ -3497,11 +4036,11 @@ function deserializeTSClassImplements(pos) { range: [start, end], }; for (; object.type === 'TSQualifiedName';) { - let { left } = object, start, end; - parent = parent.object = { + let { left, right } = object; + previous = previous.object = { type: 'MemberExpression', object: left, - property: object.right, + property: right, optional: false, computed: false, start: start = object.start, @@ -3511,57 +4050,67 @@ function deserializeTSClassImplements(pos) { object = left; } } - return { - type: 'TSClassImplements', - expression, - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + node.expression = expression; + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSInterfaceDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - extends: deserializeVecTSInterfaceHeritage(pos + 48), - body: deserializeBoxTSInterfaceBody(pos + 72), - declare: deserializeBool(pos + 84), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + return node; } function deserializeTSInterfaceBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceBody', - body: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSPropertySignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSPropertySignature', - computed: deserializeBool(pos + 32), - optional: deserializeBool(pos + 33), - readonly: deserializeBool(pos + 34), - key: deserializePropertyKey(pos + 8), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - accessibility: null, - static: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + return node; } function deserializeTSSignature(pos) { @@ -3582,35 +4131,44 @@ function deserializeTSSignature(pos) { } function deserializeTSIndexSignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexSignature', - parameters: deserializeVecTSIndexSignatureName(pos + 8), - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 32), - readonly: deserializeBool(pos + 40), - static: deserializeBool(pos + 41), - accessibility: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + range: [start, end], + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + return node; } function deserializeTSCallSignatureDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), - params = deserializeBoxFormalParameters(pos + 24), + node = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, + params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSCallSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSMethodSignatureKind(pos) { @@ -3629,77 +4187,103 @@ function deserializeTSMethodSignatureKind(pos) { function deserializeTSMethodSignature(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 40), thisParam = deserializeOptionBoxTSThisParameter(pos + 32); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSMethodSignature', - key: deserializePropertyKey(pos + 8), - computed: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - kind: deserializeTSMethodSignatureKind(pos + 62), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 24), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 48), - accessibility: null, - readonly: false, - static: false, - start, - end, - range: [start, end], - }; + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + return node; } function deserializeTSConstructSignatureDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSIndexSignatureName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSInterfaceHeritage(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceHeritage', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypePredicate(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypePredicate', - parameterName: deserializeTSTypePredicateName(pos + 8), - asserts: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSTypePredicateName(pos) { @@ -3719,56 +4303,24 @@ function deserializeTSModuleDeclaration(pos) { start = deserializeU32(pos), end = deserializeU32(pos + 4), declare = deserializeBool(pos + 85), - id = deserializeTSModuleDeclarationName(pos + 8), + node, body = deserializeOptionTSModuleDeclarationBody(pos + 64); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - let start, end; - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: start = id.start, - end: end = innerId.end, - range: [start, end], - }; - } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - for (;;) { - innerId.start = innerId.range[0] = id.start; - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; - } - let start, end; - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: start = id.start, - end: end = innerId.left.end, - range: [start, end], - }; - id = body.id; - } - body = Object.hasOwn(body, 'body') ? body.body : null; - } - return body === null - ? { + if (body === null) { + node = { type: 'TSModuleDeclaration', - id, + id: null, kind, declare, global, start, end, range: [start, end], - } - : { + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = { type: 'TSModuleDeclaration', - id, + id: null, body, kind, declare, @@ -3777,6 +4329,47 @@ function deserializeTSModuleDeclaration(pos) { end, range: [start, end], }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') node.id = id; + else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + node.id = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + range: [start, end], + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + let { start } = id; + for (;;) { + innerId.start = innerId.range[0] = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let end, right = innerId.left; + innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + range: [start, end], + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + } else body = null; + } + } + return node; } function deserializeTSModuleDeclarationKind(pos) { @@ -3815,49 +4408,63 @@ function deserializeTSModuleDeclarationBody(pos) { } function deserializeTSModuleBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSModuleBlock', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'TSModuleBlock', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeTSTypeLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeLiteral', - members: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeLiteral', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSInferType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInferType', - typeParameter: deserializeBoxTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInferType', + typeParameter: null, + start, + end, + range: [start, end], + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeQuery(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeQuery', - exprName: deserializeTSTypeQueryExprName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeQueryExprName(pos) { @@ -3876,17 +4483,23 @@ function deserializeTSTypeQueryExprName(pos) { } function deserializeTSImportType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportType', - argument: deserializeTSType(pos + 8), - options: deserializeOptionBoxObjectExpression(pos + 24), - qualifier: deserializeOptionTSImportTypeQualifier(pos + 32), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + return node; } function deserializeTSImportTypeQualifier(pos) { @@ -3901,66 +4514,87 @@ function deserializeTSImportTypeQualifier(pos) { } function deserializeTSImportTypeQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSImportTypeQualifier(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSFunctionType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSFunctionType', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSConstructorType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructorType', - abstract: deserializeBool(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSMappedType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + range: [start, end], + }, typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name, + { constraint } = typeParameter, optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); optional === null && (optional = false); - return { - type: 'TSMappedType', - key: typeParameter.name, - constraint: typeParameter.constraint, - nameType: deserializeOptionTSType(pos + 16), - typeAnnotation: deserializeOptionTSType(pos + 32), - optional, - readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), - start, - end, - range: [start, end], - }; + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + return node; } function deserializeTSMappedTypeModifierOperator(pos) { @@ -3977,64 +4611,84 @@ function deserializeTSMappedTypeModifierOperator(pos) { } function deserializeTSTemplateLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTemplateLiteralType', - quasis: deserializeVecTemplateElement(pos + 8), - types: deserializeVecTSType(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + return node; } function deserializeTSAsExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSAsExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSSatisfiesExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSSatisfiesExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSTypeAssertion(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAssertion', - typeAnnotation: deserializeTSType(pos + 8), - expression: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + return node; } function deserializeTSImportEqualsDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportEqualsDeclaration', - id: deserializeBindingIdentifier(pos + 8), - moduleReference: deserializeTSModuleReference(pos + 40), - importKind: deserializeImportOrExportKind(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + return node; } function deserializeTSModuleReference(pos) { @@ -4053,70 +4707,89 @@ function deserializeTSModuleReference(pos) { } function deserializeTSExternalModuleReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExternalModuleReference', - expression: deserializeStringLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeTSNonNullExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNonNullExpression', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeDecorator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Decorator', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Decorator', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSExportAssignment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExportAssignment', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExportAssignment', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSNamespaceExportDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamespaceExportDeclaration', - id: deserializeIdentifierName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + range: [start, end], + }; + node.id = deserializeIdentifierName(pos + 8); + return node; } function deserializeTSInstantiationExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInstantiationExpression', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeImportOrExportKind(pos) { @@ -4131,27 +4804,33 @@ function deserializeImportOrExportKind(pos) { } function deserializeJSDocNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocNonNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNonNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocUnknownType(pos) { @@ -4179,14 +4858,16 @@ function deserializeComment(pos) { let type = deserializeCommentKind(pos + 12), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type, + value: null, + start, + end, + range: [start, end], + }, endCut = type === 'Line' ? 0 : 2; - return { - type, - value: sourceText.slice(start + 2, end - endCut), - start, - end, - range: [start, end], - }; + node.value = sourceText.slice(start + 2, end - endCut); + return node; } function deserializeNameSpan(pos) { diff --git a/napi/parser/generated/deserialize/ts_range_no_parens.js b/napi/parser/generated/deserialize/ts_range_no_parens.js index a709cf7b4b144..910d249a95797 100644 --- a/napi/parser/generated/deserialize/ts_range_no_parens.js +++ b/napi/parser/generated/deserialize/ts_range_no_parens.js @@ -31,29 +31,35 @@ function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserializ } function deserializeProgram(pos) { - let body = deserializeVecDirective(pos + 72); + let end = deserializeU32(pos + 4), + program = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start: 0, + end, + range: [0, end], + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + let body = program.body = deserializeVecDirective(pos + 72); body.push(...deserializeVecStatement(pos + 96)); - let end = deserializeU32(pos + 4), start; - if (body.length > 0) { - let first = body[0]; - start = first.start; - if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { - let { declaration } = first; - if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { - let decoratorStart = declaration.decorators[0].start; - decoratorStart < start && (start = decoratorStart); + { + let start; + if (body.length > 0) { + let first = body[0]; + start = first.start; + if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { + let { declaration } = first; + if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { + let decoratorStart = declaration.decorators[0].start; + decoratorStart < start && (start = decoratorStart); + } } - } - } else start = end; - return { - type: 'Program', - body, - sourceType: deserializeModuleKind(pos + 125), - hashbang: deserializeOptionHashbang(pos + 48), - start, - end, - range: [start, end], - }; + } else start = end; + program.start = program.range[0] = start; + } + return program; } function deserializeExpression(pos) { @@ -150,59 +156,79 @@ function deserializeExpression(pos) { } function deserializeIdentifierName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeIdentifierReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeLabelIdentifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeThisExpression(pos) { @@ -216,14 +242,17 @@ function deserializeThisExpression(pos) { } function deserializeArrayExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ArrayExpression', - elements: deserializeVecArrayExpressionElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ArrayExpression', + elements: null, + start, + end, + range: [start, end], + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + return node; } function deserializeArrayExpressionElement(pos) { @@ -328,14 +357,17 @@ function deserializeElision(pos) { } function deserializeObjectExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ObjectExpression', - properties: deserializeVecObjectPropertyKind(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ObjectExpression', + properties: null, + start, + end, + range: [start, end], + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + return node; } function deserializeObjectPropertyKind(pos) { @@ -350,20 +382,25 @@ function deserializeObjectPropertyKind(pos) { } function deserializeObjectProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: deserializePropertyKind(pos + 40), - key: deserializePropertyKey(pos + 8), - value: deserializeExpression(pos + 24), - method: deserializeBool(pos + 41), - shorthand: deserializeBool(pos + 42), - computed: deserializeBool(pos + 43), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + optional: null, + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + node.optional = false; + return node; } function deserializePropertyKey(pos) { @@ -477,28 +514,37 @@ function deserializePropertyKind(pos) { } function deserializeTemplateLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TemplateLiteral', - quasis: deserializeVecTemplateElement(pos + 8), - expressions: deserializeVecExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + return node; } function deserializeTaggedTemplateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TaggedTemplateExpression', - tag: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - quasi: deserializeTemplateLiteral(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TaggedTemplateExpression', + tag: null, + typeArguments: null, + quasi: null, + start, + end, + range: [start, end], + }; + node.tag = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.quasi = deserializeTemplateLiteral(pos + 32); + return node; } function deserializeTemplateElement(pos) { @@ -526,95 +572,127 @@ function deserializeTemplateElementValue(pos) { } function deserializeComputedMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeExpression(pos + 24), - optional: deserializeBool(pos + 40), - computed: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + return node; } function deserializeStaticMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializeIdentifierName(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + return node; } function deserializePrivateFieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MemberExpression', - object: deserializeExpression(pos + 8), - property: deserializePrivateIdentifier(pos + 24), - optional: deserializeBool(pos + 48), - computed: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + return node; } function deserializeCallExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CallExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - optional: deserializeBool(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CallExpression', + callee: null, + typeArguments: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeNewExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'NewExpression', - callee: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'NewExpression', + callee: null, + typeArguments: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + return node; } function deserializeMetaProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'MetaProperty', - meta: deserializeIdentifierName(pos + 8), - property: deserializeIdentifierName(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + range: [start, end], + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + return node; } function deserializeSpreadElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SpreadElement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SpreadElement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeArgument(pos) { @@ -713,94 +791,123 @@ function deserializeArgument(pos) { } function deserializeUpdateExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UpdateExpression', - operator: deserializeUpdateOperator(pos + 24), - prefix: deserializeBool(pos + 25), - argument: deserializeSimpleAssignmentTarget(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + return node; } function deserializeUnaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'UnaryExpression', - operator: deserializeUnaryOperator(pos + 24), - argument: deserializeExpression(pos + 8), - prefix: true, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + return node; } function deserializeBinaryExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializeExpression(pos + 8), - operator: deserializeBinaryOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; -} - + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; +} + function deserializePrivateInExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BinaryExpression', - left: deserializePrivateIdentifier(pos + 8), - operator: 'in', - right: deserializeExpression(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + return node; } function deserializeLogicalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LogicalExpression', - left: deserializeExpression(pos + 8), - operator: deserializeLogicalOperator(pos + 40), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeConditionalExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ConditionalExpression', - test: deserializeExpression(pos + 8), - consequent: deserializeExpression(pos + 24), - alternate: deserializeExpression(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + return node; } function deserializeAssignmentExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentExpression', - operator: deserializeAssignmentOperator(pos + 40), - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + return node; } function deserializeAssignmentTarget(pos) { @@ -856,52 +963,69 @@ function deserializeSimpleAssignmentTarget(pos) { function deserializeArrayAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectAssignmentTarget(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, properties = deserializeVecAssignmentTargetProperty(pos + 8), rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetRest(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeAssignmentTarget(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.argument = deserializeAssignmentTarget(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeAssignmentTargetMaybeDefault(pos) { @@ -934,18 +1058,25 @@ function deserializeAssignmentTargetMaybeDefault(pos) { } function deserializeAssignmentTargetWithDefault(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeAssignmentTarget(pos + 8), - right: deserializeExpression(pos + 24), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeAssignmentTargetProperty(pos) { @@ -960,62 +1091,82 @@ function deserializeAssignmentTargetProperty(pos) { } function deserializeAssignmentTargetPropertyIdentifier(pos) { - let key = deserializeIdentifierReference(pos + 8), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), - init = deserializeOptionExpression(pos + 40), - keyCopy = { ...key }; - return { - type: 'Property', - kind: 'init', - key, - value: init === null ? keyCopy : { - type: 'AssignmentPattern', - decorators: [], - left: keyCopy, - right: init, - optional: false, - typeAnnotation: null, + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + optional: null, start, end, range: [start, end], }, - method: false, - shorthand: true, - computed: false, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + init !== null && (value = { + type: 'AssignmentPattern', + decorators: [], + left: value, + right: init, optional: false, + typeAnnotation: null, start, end, range: [start, end], - }; + }); + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + node.optional = false; + return node; } function deserializeAssignmentTargetPropertyProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeAssignmentTargetMaybeDefault(pos + 24), - method: false, - shorthand: false, - computed: deserializeBool(pos + 40), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + optional: null, + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + node.optional = false; + return node; } function deserializeSequenceExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SequenceExpression', - expressions: deserializeVecExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SequenceExpression', + expressions: null, + start, + end, + range: [start, end], + }; + node.expressions = deserializeVecExpression(pos + 8); + return node; } function deserializeSuper(pos) { @@ -1029,25 +1180,31 @@ function deserializeSuper(pos) { } function deserializeAwaitExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AwaitExpression', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AwaitExpression', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeChainExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ChainExpression', - expression: deserializeChainElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ChainExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeChainElement(pos + 8); + return node; } function deserializeChainElement(pos) { @@ -1068,7 +1225,9 @@ function deserializeChainElement(pos) { } function deserializeParenthesizedExpression(pos) { - return deserializeExpression(pos + 8); + let node; + node = deserializeExpression(pos + 8); + return node; } function deserializeStatement(pos) { @@ -1143,15 +1302,18 @@ function deserializeStatement(pos) { } function deserializeDirective(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeStringLiteral(pos + 8), - directive: deserializeStr(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeHashbang(pos) { @@ -1166,14 +1328,17 @@ function deserializeHashbang(pos) { } function deserializeBlockStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BlockStatement', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeDeclaration(pos) { @@ -1200,16 +1365,19 @@ function deserializeDeclaration(pos) { } function deserializeVariableDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclaration', - kind: deserializeVariableDeclarationKind(pos + 32), - declarations: deserializeVecVariableDeclarator(pos + 8), - declare: deserializeBool(pos + 33), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + declare: deserializeBool(pos + 33), + start, + end, + range: [start, end], + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + return node; } function deserializeVariableDeclarationKind(pos) { @@ -1230,16 +1398,20 @@ function deserializeVariableDeclarationKind(pos) { } function deserializeVariableDeclarator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'VariableDeclarator', - id: deserializeBindingPattern(pos + 8), - init: deserializeOptionExpression(pos + 40), - definite: deserializeBool(pos + 57), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'VariableDeclarator', + id: null, + init: null, + definite: deserializeBool(pos + 57), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + return node; } function deserializeEmptyStatement(pos) { @@ -1253,66 +1425,89 @@ function deserializeEmptyStatement(pos) { } function deserializeExpressionStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExpressionStatement', - expression: deserializeExpression(pos + 8), - directive: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExpressionStatement', + expression: null, + directive: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.directive = null; + return node; } function deserializeIfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'IfStatement', - test: deserializeExpression(pos + 8), - consequent: deserializeStatement(pos + 24), - alternate: deserializeOptionStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + return node; } function deserializeDoWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'DoWhileStatement', - body: deserializeStatement(pos + 8), - test: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + range: [start, end], + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + return node; } function deserializeWhileStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WhileStatement', - test: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + range: [start, end], + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeForStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForStatement', - init: deserializeOptionForStatementInit(pos + 8), - test: deserializeOptionExpression(pos + 24), - update: deserializeOptionExpression(pos + 40), - body: deserializeStatement(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + range: [start, end], + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + return node; } function deserializeForStatementInit(pos) { @@ -1411,16 +1606,21 @@ function deserializeForStatementInit(pos) { } function deserializeForInStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForInStatement', - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeForStatementLeft(pos) { @@ -1453,134 +1653,176 @@ function deserializeForStatementLeft(pos) { } function deserializeForOfStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ForOfStatement', - await: deserializeBool(pos + 60), - left: deserializeForStatementLeft(pos + 8), - right: deserializeExpression(pos + 24), - body: deserializeStatement(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + return node; } function deserializeContinueStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ContinueStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ContinueStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeBreakStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'BreakStatement', - label: deserializeOptionLabelIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BreakStatement', + label: null, + start, + end, + range: [start, end], + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + return node; } function deserializeReturnStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ReturnStatement', - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ReturnStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeWithStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'WithStatement', - object: deserializeExpression(pos + 8), - body: deserializeStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + range: [start, end], + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + return node; } function deserializeSwitchStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchStatement', - discriminant: deserializeExpression(pos + 8), - cases: deserializeVecSwitchCase(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + range: [start, end], + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + return node; } function deserializeSwitchCase(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'SwitchCase', - test: deserializeOptionExpression(pos + 8), - consequent: deserializeVecStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + range: [start, end], + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + return node; } function deserializeLabeledStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'LabeledStatement', - label: deserializeLabelIdentifier(pos + 8), - body: deserializeStatement(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + range: [start, end], + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + return node; } function deserializeThrowStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ThrowStatement', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ThrowStatement', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeTryStatement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TryStatement', - block: deserializeBoxBlockStatement(pos + 8), - handler: deserializeOptionBoxCatchClause(pos + 16), - finalizer: deserializeOptionBoxBlockStatement(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + range: [start, end], + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + return node; } function deserializeCatchClause(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'CatchClause', - param: deserializeOptionCatchParameter(pos + 8), - body: deserializeBoxBlockStatement(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + range: [start, end], + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + return node; } function deserializeCatchParameter(pos) { @@ -1620,109 +1862,149 @@ function deserializeBindingPatternKind(pos) { } function deserializeAssignmentPattern(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'AssignmentPattern', - decorators: [], - left: deserializeBindingPattern(pos + 8), - right: deserializeExpression(pos + 40), - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeObjectPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, properties = deserializeVecBindingProperty(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && properties.push(rest); - return { - type: 'ObjectPattern', - decorators: [], - properties, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Property', - kind: 'init', - key: deserializePropertyKey(pos + 8), - value: deserializeBindingPattern(pos + 24), - method: false, - shorthand: deserializeBool(pos + 56), - computed: deserializeBool(pos + 57), - optional: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + optional: null, + start, + end, + range: [start, end], + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + node.optional = false; + return node; } function deserializeArrayPattern(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }, elements = deserializeVecOptionBindingPattern(pos + 8), rest = deserializeOptionBoxBindingRestElement(pos + 32); rest !== null && elements.push(rest); - return { - type: 'ArrayPattern', - decorators: [], - elements, - optional: false, - typeAnnotation: null, - start, - end, - range: [start, end], - }; + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + return node; } function deserializeBindingRestElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'RestElement', - decorators: [], - argument: deserializeBindingPattern(pos + 8), - optional: false, - typeAnnotation: null, - value: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.argument = deserializeBindingPattern(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + return node; } function deserializeFunction(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), params = deserializeBoxFormalParameters(pos + 56); - { - let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); - thisParam !== null && params.unshift(thisParam); - } - return { - type: deserializeFunctionType(pos + 84), - id: deserializeOptionBindingIdentifier(pos + 8), - generator: deserializeBool(pos + 85), - async: deserializeBool(pos + 86), - declare: deserializeBool(pos + 87), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 64), - body: deserializeOptionBoxFunctionBody(pos + 72), - expression: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + declare: deserializeBool(pos + 87), + typeParameters: null, + params: null, + returnType: null, + body: null, + expression: null, + start, + end, + range: [start, end], + }, + params = deserializeBoxFormalParameters(pos + 56); + { + let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); + thisParam !== null && params.unshift(thisParam); + } + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 64); + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + return node; } function deserializeFunctionType(pos) { @@ -1744,18 +2026,22 @@ function deserializeFormalParameters(pos) { let params = deserializeVecFormalParameter(pos + 8); if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { pos = uint32[pos + 32 >> 2]; - let start, end; - params.push({ - type: 'RestElement', - decorators: [], - argument: deserializeBindingPatternKind(pos + 8), - optional: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - value: null, - start: start = deserializeU32(pos), - end: end = deserializeU32(pos + 4), - range: [start, end], - }); + let start, + end, + rest = { + type: 'RestElement', + decorators: [], + argument: null, + optional: deserializeBool(pos + 32), + typeAnnotation: null, + value: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + rest.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + params.push(rest); } return params; } @@ -1776,82 +2062,108 @@ function deserializeFormalParameter(pos) { param = { type: 'TSParameterProperty', accessibility, - decorators: deserializeVecDecorator(pos + 8), + decorators: null, override, - parameter: deserializeBindingPattern(pos + 32), + parameter: null, readonly, static: false, start: start = deserializeU32(pos), end: end = deserializeU32(pos + 4), range: [start, end], }; + param.decorators = deserializeVecDecorator(pos + 8); + param.parameter = deserializeBindingPattern(pos + 32); } } return param; } function deserializeFunctionBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'BlockStatement', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeArrowFunctionExpression(pos) { let expression = deserializeBool(pos + 44), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + typeParameters: null, + params: null, + returnType: null, + body: null, + id: null, + generator: null, + start, + end, + range: [start, end], + }, body = deserializeBoxFunctionBody(pos + 32); - return { - type: 'ArrowFunctionExpression', - expression, - async: deserializeBool(pos + 45), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - body: expression ? body.body[0].expression : body, - id: null, - generator: false, - start, - end, - range: [start, end], - }; + expression === true && (body = body.body[0].expression); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.body = body; + node.id = null; + node.generator = false; + return node; } function deserializeYieldExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'YieldExpression', - delegate: deserializeBool(pos + 24), - argument: deserializeOptionExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeOptionExpression(pos + 8); + return node; } function deserializeClass(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeClassType(pos + 132), - decorators: deserializeVecDecorator(pos + 8), - id: deserializeOptionBindingIdentifier(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 64), - superClass: deserializeOptionExpression(pos + 72), - superTypeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 88), - implements: deserializeVecTSClassImplements(pos + 96), - body: deserializeBoxClassBody(pos + 120), - abstract: deserializeBool(pos + 133), - declare: deserializeBool(pos + 134), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + typeParameters: null, + superClass: null, + superTypeArguments: null, + implements: null, + body: null, + abstract: deserializeBool(pos + 133), + declare: deserializeBool(pos + 134), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 64); + node.superClass = deserializeOptionExpression(pos + 72); + node.superTypeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 88); + node.implements = deserializeVecTSClassImplements(pos + 96); + node.body = deserializeBoxClassBody(pos + 120); + return node; } function deserializeClassType(pos) { @@ -1866,14 +2178,17 @@ function deserializeClassType(pos) { } function deserializeClassBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ClassBody', - body: deserializeVecClassElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ClassBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecClassElement(pos + 8); + return node; } function deserializeClassElement(pos) { @@ -1894,22 +2209,27 @@ function deserializeClassElement(pos) { } function deserializeMethodDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeMethodDefinitionType(pos + 56), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - value: deserializeBoxFunction(pos + 48), - kind: deserializeMethodDefinitionKind(pos + 57), - computed: deserializeBool(pos + 58), - static: deserializeBool(pos + 59), - override: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - accessibility: deserializeOptionTSAccessibility(pos + 62), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + override: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + accessibility: deserializeOptionTSAccessibility(pos + 62), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + return node; } function deserializeMethodDefinitionType(pos) { @@ -1924,25 +2244,31 @@ function deserializeMethodDefinitionType(pos) { } function deserializePropertyDefinition(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializePropertyDefinitionType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - declare: deserializeBool(pos + 75), - override: deserializeBool(pos + 76), - optional: deserializeBool(pos + 77), - definite: deserializeBool(pos + 78), - readonly: deserializeBool(pos + 79), - accessibility: deserializeOptionTSAccessibility(pos + 80), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + declare: deserializeBool(pos + 75), + override: deserializeBool(pos + 76), + optional: deserializeBool(pos + 77), + definite: deserializeBool(pos + 78), + readonly: deserializeBool(pos + 79), + accessibility: deserializeOptionTSAccessibility(pos + 80), + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + return node; } function deserializePropertyDefinitionType(pos) { @@ -1983,14 +2309,17 @@ function deserializePrivateIdentifier(pos) { } function deserializeStaticBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'StaticBlock', - body: deserializeVecStatement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'StaticBlock', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecStatement(pos + 8); + return node; } function deserializeAccessorPropertyType(pos) { @@ -2005,57 +2334,74 @@ function deserializeAccessorPropertyType(pos) { } function deserializeAccessorProperty(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: deserializeAccessorPropertyType(pos + 72), - decorators: deserializeVecDecorator(pos + 8), - key: deserializePropertyKey(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 48), - value: deserializeOptionExpression(pos + 56), - computed: deserializeBool(pos + 73), - static: deserializeBool(pos + 74), - override: deserializeBool(pos + 75), - definite: deserializeBool(pos + 76), - accessibility: deserializeOptionTSAccessibility(pos + 77), - declare: false, - optional: false, - readonly: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + override: deserializeBool(pos + 75), + definite: deserializeBool(pos + 76), + accessibility: deserializeOptionTSAccessibility(pos + 77), + declare: null, + optional: null, + readonly: null, + start, + end, + range: [start, end], + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + node.declare = false; + node.optional = false; + node.readonly = false; + return node; } function deserializeImportExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportExpression', - source: deserializeExpression(pos + 8), - options: deserializeOptionExpression(pos + 24), - phase: deserializeOptionImportPhase(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + range: [start, end], + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + return node; } function deserializeImportDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + importKind: deserializeImportOrExportKind(pos + 89), + start, + end, + range: [start, end], + }, specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); specifiers === null && (specifiers = []); let withClause = deserializeOptionBoxWithClause(pos + 80); - return { - type: 'ImportDeclaration', - specifiers, - source: deserializeStringLiteral(pos + 32), - phase: deserializeOptionImportPhase(pos + 88), - attributes: withClause === null ? [] : withClause.attributes, - importKind: deserializeImportOrExportKind(pos + 89), - start, - end, - range: [start, end], - }; + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeImportPhase(pos) { @@ -2083,38 +2429,48 @@ function deserializeImportDeclarationSpecifier(pos) { } function deserializeImportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportSpecifier', - imported: deserializeModuleExportName(pos + 8), - local: deserializeBindingIdentifier(pos + 64), - importKind: deserializeImportOrExportKind(pos + 96), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportSpecifier', + imported: null, + local: null, + importKind: deserializeImportOrExportKind(pos + 96), + start, + end, + range: [start, end], + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + return node; } function deserializeImportDefaultSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportDefaultSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeImportNamespaceSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportNamespaceSpecifier', - local: deserializeBindingIdentifier(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + range: [start, end], + }; + node.local = deserializeBindingIdentifier(pos + 8); + return node; } function deserializeWithClause(pos) { @@ -2122,15 +2478,19 @@ function deserializeWithClause(pos) { } function deserializeImportAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ImportAttribute', - key: deserializeImportAttributeKey(pos + 8), - value: deserializeStringLiteral(pos + 64), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + range: [start, end], + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + return node; } function deserializeImportAttributeKey(pos) { @@ -2145,59 +2505,78 @@ function deserializeImportAttributeKey(pos) { } function deserializeExportNamedDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), withClause = deserializeOptionBoxWithClause(pos + 96); - return { - type: 'ExportNamedDeclaration', - declaration: deserializeOptionDeclaration(pos + 8), - specifiers: deserializeVecExportSpecifier(pos + 24), - source: deserializeOptionStringLiteral(pos + 48), - exportKind: deserializeImportOrExportKind(pos + 104), - attributes: withClause === null ? [] : withClause.attributes, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + exportKind: deserializeImportOrExportKind(pos + 104), + attributes: null, + start, + end, + range: [start, end], + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportDefaultDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportDefaultDeclaration', - declaration: deserializeExportDefaultDeclarationKind(pos + 8), - exportKind: 'value', - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportDefaultDeclaration', + declaration: null, + exportKind: null, + start, + end, + range: [start, end], + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + node.exportKind = 'value'; + return node; } function deserializeExportAllDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + }, withClause = deserializeOptionBoxWithClause(pos + 112); - return { - type: 'ExportAllDeclaration', - exported: deserializeOptionModuleExportName(pos + 8), - source: deserializeStringLiteral(pos + 64), - attributes: withClause === null ? [] : withClause.attributes, - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - range: [start, end], - }; + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + return node; } function deserializeExportSpecifier(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'ExportSpecifier', - local: deserializeModuleExportName(pos + 8), - exported: deserializeModuleExportName(pos + 64), - exportKind: deserializeImportOrExportKind(pos + 120), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'ExportSpecifier', + local: null, + exported: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + return node; } function deserializeExportDefaultDeclarationKind(pos) { @@ -2313,39 +2692,51 @@ function deserializeModuleExportName(pos) { } function deserializeV8IntrinsicExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'V8IntrinsicExpression', - name: deserializeIdentifierName(pos + 8), - arguments: deserializeVecArgument(pos + 32), - start, - end, - range: [start, end], - }; -} - + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + range: [start, end], + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + return node; +} + function deserializeBooleanLiteral(pos) { - let value = deserializeBool(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value, - raw: start === 0 && end === 0 ? null : value + '', - start, - end, - range: [start, end], - }; + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value, + raw: null, + start, + end, + range: [start, end], + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + return node; } function deserializeNullLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Literal', - value: null, - raw: start === 0 && end === 0 ? null : 'null', - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: null, + start, + end, + range: [start, end], + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + return node; } function deserializeNumericLiteral(pos) { @@ -2361,46 +2752,61 @@ function deserializeNumericLiteral(pos) { } function deserializeStringLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), value = deserializeStr(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + }, + value = deserializeStr(pos + 8); deserializeBool(pos + 40) && (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 24), - start, - end, - range: [start, end], - }; + node.value = value; + return node; } function deserializeBigIntLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), bigint = deserializeStr(pos + 8); - return { - type: 'Literal', - value: BigInt(bigint), - raw: deserializeOptionStr(pos + 24), - bigint, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + range: [start, end], + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + return node; } function deserializeRegExpLiteral(pos) { - let regex = deserializeRegExp(pos + 8), start = deserializeU32(pos), end = deserializeU32(pos + 4), value = null; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + range: [start, end], + }, + regex = deserializeRegExp(pos + 8), + value = null; try { value = new RegExp(regex.pattern, regex.flags); } catch {} - return { - type: 'Literal', - value, - raw: deserializeOptionStr(pos + 40), - regex, - start, - end, - range: [start, end], - }; + node.value = value; + node.regex = regex; + return node; } function deserializeRegExp(pos) { @@ -2425,58 +2831,76 @@ function deserializeRegExpFlags(pos) { } function deserializeJSXElement(pos) { - let closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), - start = deserializeU32(pos), + let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + range: [start, end], + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), openingElement = deserializeBoxJSXOpeningElement(pos + 8); closingElement === null && (openingElement.selfClosing = true); - return { - type: 'JSXElement', - openingElement, - children: deserializeVecJSXChild(pos + 16), - closingElement, - start, - end, - range: [start, end], - }; + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + return node; } function deserializeJSXOpeningElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXOpeningElement', - name: deserializeJSXElementName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - attributes: deserializeVecJSXAttributeItem(pos + 32), - selfClosing: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXOpeningElement', + name: null, + typeArguments: null, + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + return node; } function deserializeJSXClosingElement(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXClosingElement', - name: deserializeJSXElementName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXClosingElement', + name: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXElementName(pos + 8); + return node; } function deserializeJSXFragment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXFragment', - openingFragment: deserializeJSXOpeningFragment(pos + 8), - children: deserializeVecJSXChild(pos + 16), - closingFragment: deserializeJSXClosingFragment(pos + 40), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + range: [start, end], + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + return node; } function deserializeJSXOpeningFragment(pos) { @@ -2531,27 +2955,35 @@ function deserializeJSXElementName(pos) { } function deserializeJSXNamespacedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXNamespacedName', - namespace: deserializeJSXIdentifier(pos + 8), - name: deserializeJSXIdentifier(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + range: [start, end], + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + return node; } function deserializeJSXMemberExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXMemberExpression', - object: deserializeJSXMemberExpressionObject(pos + 8), - property: deserializeJSXIdentifier(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + range: [start, end], + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + return node; } function deserializeJSXMemberExpressionObject(pos) { @@ -2582,14 +3014,17 @@ function deserializeJSXMemberExpressionObject(pos) { } function deserializeJSXExpressionContainer(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXExpressionContainer', - expression: deserializeJSXExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeJSXExpression(pos + 8); + return node; } function deserializeJSXExpression(pos) { @@ -2709,26 +3144,33 @@ function deserializeJSXAttributeItem(pos) { } function deserializeJSXAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXAttribute', - name: deserializeJSXAttributeName(pos + 8), - value: deserializeOptionJSXAttributeValue(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + range: [start, end], + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + return node; } function deserializeJSXSpreadAttribute(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadAttribute', - argument: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeExpression(pos + 8); + return node; } function deserializeJSXAttributeName(pos) { @@ -2786,14 +3228,17 @@ function deserializeJSXChild(pos) { } function deserializeJSXSpreadChild(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'JSXSpreadChild', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeJSXText(pos) { @@ -2809,55 +3254,73 @@ function deserializeJSXText(pos) { } function deserializeTSThisParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: 'this', - optional: false, - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 16), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + return node; } function deserializeTSEnumDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumDeclaration', - id: deserializeBindingIdentifier(pos + 8), - body: deserializeTSEnumBody(pos + 40), - const: deserializeBool(pos + 76), - declare: deserializeBool(pos + 77), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + return node; } function deserializeTSEnumBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumBody', - members: deserializeVecTSEnumMember(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumBody', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSEnumMember(pos + 8); + return node; } function deserializeTSEnumMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSEnumMember', - id: deserializeTSEnumMemberName(pos + 8), - initializer: deserializeOptionExpression(pos + 24), - computed: deserializeU8(pos + 8) > 1, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + range: [start, end], + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + return node; } function deserializeTSEnumMemberName(pos) { @@ -2876,25 +3339,31 @@ function deserializeTSEnumMemberName(pos) { } function deserializeTSTypeAnnotation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAnnotation', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; -} + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; +} function deserializeTSLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSLiteralType', - literal: deserializeTSLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSLiteralType', + literal: null, + start, + end, + range: [start, end], + }; + node.literal = deserializeTSLiteral(pos + 8); + return node; } function deserializeTSLiteral(pos) { @@ -2998,55 +3467,72 @@ function deserializeTSType(pos) { } function deserializeTSConditionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConditionalType', - checkType: deserializeTSType(pos + 8), - extendsType: deserializeTSType(pos + 24), - trueType: deserializeTSType(pos + 40), - falseType: deserializeTSType(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + range: [start, end], + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + return node; } function deserializeTSUnionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSUnionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSUnionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSIntersectionType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIntersectionType', - types: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIntersectionType', + types: null, + start, + end, + range: [start, end], + }; + node.types = deserializeVecTSType(pos + 8); + return node; } function deserializeTSParenthesizedType(pos) { - return deserializeTSType(pos + 8); + let node; + node = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeOperator', - operator: deserializeTSTypeOperatorOperator(pos + 24), - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTypeOperatorOperator(pos) { @@ -3063,72 +3549,92 @@ function deserializeTSTypeOperatorOperator(pos) { } function deserializeTSArrayType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSArrayType', - elementType: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSArrayType', + elementType: null, + start, + end, + range: [start, end], + }; + node.elementType = deserializeTSType(pos + 8); + return node; } function deserializeTSIndexedAccessType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexedAccessType', - objectType: deserializeTSType(pos + 8), - indexType: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + range: [start, end], + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + return node; } function deserializeTSTupleType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTupleType', - elementTypes: deserializeVecTSTupleElement(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + range: [start, end], + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + return node; } function deserializeTSNamedTupleMember(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamedTupleMember', - label: deserializeIdentifierName(pos + 8), - elementType: deserializeTSTupleElement(pos + 32), - optional: deserializeBool(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + range: [start, end], + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + return node; } function deserializeTSOptionalType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSOptionalType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSRestType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSRestType', - typeAnnotation: deserializeTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeTSTupleElement(pos) { @@ -3357,15 +3863,19 @@ function deserializeTSBigIntKeyword(pos) { } function deserializeTSTypeReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeReference', - typeName: deserializeTSTypeName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeName(pos) { @@ -3382,67 +3892,87 @@ function deserializeTSTypeName(pos) { } function deserializeTSQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSTypeName(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSTypeParameterInstantiation(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterInstantiation', - params: deserializeVecTSType(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSType(pos + 8); + return node; } function deserializeTSTypeParameter(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameter', - name: deserializeBindingIdentifier(pos + 8), - constraint: deserializeOptionTSType(pos + 40), - default: deserializeOptionTSType(pos + 56), - in: deserializeBool(pos + 72), - out: deserializeBool(pos + 73), - const: deserializeBool(pos + 74), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + range: [start, end], + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + return node; } function deserializeTSTypeParameterDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeParameterDeclaration', - params: deserializeVecTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + range: [start, end], + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeAliasDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAliasDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - typeAnnotation: deserializeTSType(pos + 48), - declare: deserializeBool(pos + 68), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + return node; } function deserializeTSAccessibility(pos) { @@ -3459,15 +3989,26 @@ function deserializeTSAccessibility(pos) { } function deserializeTSClassImplements(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), expression = deserializeTSTypeName(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSClassImplements', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }, + expression = deserializeTSTypeName(pos + 8); if (expression.type === 'TSQualifiedName') { let object = expression.left, + { right } = expression, start, end, - parent = expression = { + previous = expression = { type: 'MemberExpression', object, - property: expression.right, + property: right, optional: false, computed: false, start: start = expression.start, @@ -3475,11 +4016,11 @@ function deserializeTSClassImplements(pos) { range: [start, end], }; for (; object.type === 'TSQualifiedName';) { - let { left } = object, start, end; - parent = parent.object = { + let { left, right } = object; + previous = previous.object = { type: 'MemberExpression', object: left, - property: object.right, + property: right, optional: false, computed: false, start: start = object.start, @@ -3489,57 +4030,67 @@ function deserializeTSClassImplements(pos) { object = left; } } - return { - type: 'TSClassImplements', - expression, - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + node.expression = expression; + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSInterfaceDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceDeclaration', - id: deserializeBindingIdentifier(pos + 8), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 40), - extends: deserializeVecTSInterfaceHeritage(pos + 48), - body: deserializeBoxTSInterfaceBody(pos + 72), - declare: deserializeBool(pos + 84), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + return node; } function deserializeTSInterfaceBody(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceBody', - body: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceBody', + body: null, + start, + end, + range: [start, end], + }; + node.body = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSPropertySignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSPropertySignature', - computed: deserializeBool(pos + 32), - optional: deserializeBool(pos + 33), - readonly: deserializeBool(pos + 34), - key: deserializePropertyKey(pos + 8), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - accessibility: null, - static: false, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + range: [start, end], + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + return node; } function deserializeTSSignature(pos) { @@ -3560,35 +4111,44 @@ function deserializeTSSignature(pos) { } function deserializeTSIndexSignature(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSIndexSignature', - parameters: deserializeVecTSIndexSignatureName(pos + 8), - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 32), - readonly: deserializeBool(pos + 40), - static: deserializeBool(pos + 41), - accessibility: null, - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + range: [start, end], + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + return node; } function deserializeTSCallSignatureDeclaration(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSCallSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSMethodSignatureKind(pos) { @@ -3607,77 +4167,103 @@ function deserializeTSMethodSignatureKind(pos) { function deserializeTSMethodSignature(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 40), thisParam = deserializeOptionBoxTSThisParameter(pos + 32); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSMethodSignature', - key: deserializePropertyKey(pos + 8), - computed: deserializeBool(pos + 60), - optional: deserializeBool(pos + 61), - kind: deserializeTSMethodSignatureKind(pos + 62), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 24), - params, - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 48), - accessibility: null, - readonly: false, - static: false, - start, - end, - range: [start, end], - }; + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + return node; } function deserializeTSConstructSignatureDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructSignatureDeclaration', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSIndexSignatureName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Identifier', - decorators: [], - name: deserializeStr(pos + 8), - optional: false, - typeAnnotation: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSInterfaceHeritage(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInterfaceHeritage', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypePredicate(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypePredicate', - parameterName: deserializeTSTypePredicateName(pos + 8), - asserts: deserializeBool(pos + 32), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSTypePredicateName(pos) { @@ -3697,56 +4283,24 @@ function deserializeTSModuleDeclaration(pos) { start = deserializeU32(pos), end = deserializeU32(pos + 4), declare = deserializeBool(pos + 85), - id = deserializeTSModuleDeclarationName(pos + 8), + node, body = deserializeOptionTSModuleDeclarationBody(pos + 64); - // Flatten `body`, and nest `id` - if (body !== null && body.type === 'TSModuleDeclaration') { - let innerId = body.id; - if (innerId.type === 'Identifier') { - let start, end; - id = { - type: 'TSQualifiedName', - left: id, - right: innerId, - start: start = id.start, - end: end = innerId.end, - range: [start, end], - }; - } else { - // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of - // this module on left, and previous `left` of innermost `TSQualifiedName` on right - for (;;) { - innerId.start = innerId.range[0] = id.start; - if (innerId.left.type === 'Identifier') break; - innerId = innerId.left; - } - let start, end; - innerId.left = { - type: 'TSQualifiedName', - left: id, - right: innerId.left, - start: start = id.start, - end: end = innerId.left.end, - range: [start, end], - }; - id = body.id; - } - body = Object.hasOwn(body, 'body') ? body.body : null; - } - return body === null - ? { + if (body === null) { + node = { type: 'TSModuleDeclaration', - id, + id: null, kind, declare, global, start, end, range: [start, end], - } - : { + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = { type: 'TSModuleDeclaration', - id, + id: null, body, kind, declare, @@ -3755,6 +4309,47 @@ function deserializeTSModuleDeclaration(pos) { end, range: [start, end], }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') node.id = id; + else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + node.id = { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + range: [start, end], + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + let { start } = id; + for (;;) { + innerId.start = innerId.range[0] = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let end, right = innerId.left; + innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + range: [start, end], + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + } else body = null; + } + } + return node; } function deserializeTSModuleDeclarationKind(pos) { @@ -3793,49 +4388,63 @@ function deserializeTSModuleDeclarationBody(pos) { } function deserializeTSModuleBlock(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4), body = deserializeVecDirective(pos + 8); + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSModuleBlock', + body: null, + start, + end, + range: [start, end], + }, + body = deserializeVecDirective(pos + 8); body.push(...deserializeVecStatement(pos + 32)); - return { - type: 'TSModuleBlock', - body, - start, - end, - range: [start, end], - }; + node.body = body; + return node; } function deserializeTSTypeLiteral(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeLiteral', - members: deserializeVecTSSignature(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeLiteral', + members: null, + start, + end, + range: [start, end], + }; + node.members = deserializeVecTSSignature(pos + 8); + return node; } function deserializeTSInferType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInferType', - typeParameter: deserializeBoxTSTypeParameter(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInferType', + typeParameter: null, + start, + end, + range: [start, end], + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + return node; } function deserializeTSTypeQuery(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeQuery', - exprName: deserializeTSTypeQueryExprName(pos + 8), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeTSTypeQueryExprName(pos) { @@ -3854,17 +4463,23 @@ function deserializeTSTypeQueryExprName(pos) { } function deserializeTSImportType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportType', - argument: deserializeTSType(pos + 8), - options: deserializeOptionBoxObjectExpression(pos + 24), - qualifier: deserializeOptionTSImportTypeQualifier(pos + 32), - typeArguments: deserializeOptionBoxTSTypeParameterInstantiation(pos + 48), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + return node; } function deserializeTSImportTypeQualifier(pos) { @@ -3879,66 +4494,87 @@ function deserializeTSImportTypeQualifier(pos) { } function deserializeTSImportTypeQualifiedName(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSQualifiedName', - left: deserializeTSImportTypeQualifier(pos + 8), - right: deserializeIdentifierName(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + return node; } function deserializeTSFunctionType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }, params = deserializeBoxFormalParameters(pos + 24), thisParam = deserializeOptionBoxTSThisParameter(pos + 16); thisParam !== null && params.unshift(thisParam); - return { - type: 'TSFunctionType', - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params, - returnType: deserializeBoxTSTypeAnnotation(pos + 32), - start, - end, - range: [start, end], - }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + return node; } function deserializeTSConstructorType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSConstructorType', - abstract: deserializeBool(pos + 32), - typeParameters: deserializeOptionBoxTSTypeParameterDeclaration(pos + 8), - params: deserializeBoxFormalParameters(pos + 16), - returnType: deserializeBoxTSTypeAnnotation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + return node; } function deserializeTSMappedType(pos) { let start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + range: [start, end], + }, typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name, + { constraint } = typeParameter, optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); optional === null && (optional = false); - return { - type: 'TSMappedType', - key: typeParameter.name, - constraint: typeParameter.constraint, - nameType: deserializeOptionTSType(pos + 16), - typeAnnotation: deserializeOptionTSType(pos + 32), - optional, - readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), - start, - end, - range: [start, end], - }; + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + return node; } function deserializeTSMappedTypeModifierOperator(pos) { @@ -3955,64 +4591,84 @@ function deserializeTSMappedTypeModifierOperator(pos) { } function deserializeTSTemplateLiteralType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTemplateLiteralType', - quasis: deserializeVecTemplateElement(pos + 8), - types: deserializeVecTSType(pos + 32), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + range: [start, end], + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + return node; } function deserializeTSAsExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSAsExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSSatisfiesExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSSatisfiesExpression', - expression: deserializeExpression(pos + 8), - typeAnnotation: deserializeTSType(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + return node; } function deserializeTSTypeAssertion(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSTypeAssertion', - typeAnnotation: deserializeTSType(pos + 8), - expression: deserializeExpression(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + return node; } function deserializeTSImportEqualsDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSImportEqualsDeclaration', - id: deserializeBindingIdentifier(pos + 8), - moduleReference: deserializeTSModuleReference(pos + 40), - importKind: deserializeImportOrExportKind(pos + 56), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + range: [start, end], + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + return node; } function deserializeTSModuleReference(pos) { @@ -4031,70 +4687,89 @@ function deserializeTSModuleReference(pos) { } function deserializeTSExternalModuleReference(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExternalModuleReference', - expression: deserializeStringLiteral(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeStringLiteral(pos + 8); + return node; } function deserializeTSNonNullExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNonNullExpression', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeDecorator(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'Decorator', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'Decorator', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSExportAssignment(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSExportAssignment', - expression: deserializeExpression(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSExportAssignment', + expression: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + return node; } function deserializeTSNamespaceExportDeclaration(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSNamespaceExportDeclaration', - id: deserializeIdentifierName(pos + 8), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + range: [start, end], + }; + node.id = deserializeIdentifierName(pos + 8); + return node; } function deserializeTSInstantiationExpression(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSInstantiationExpression', - expression: deserializeExpression(pos + 8), - typeArguments: deserializeBoxTSTypeParameterInstantiation(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + return node; } function deserializeImportOrExportKind(pos) { @@ -4109,27 +4784,33 @@ function deserializeImportOrExportKind(pos) { } function deserializeJSDocNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocNonNullableType(pos) { - let start = deserializeU32(pos), end = deserializeU32(pos + 4); - return { - type: 'TSJSDocNonNullableType', - typeAnnotation: deserializeTSType(pos + 8), - postfix: deserializeBool(pos + 24), - start, - end, - range: [start, end], - }; + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + node = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + }; + node.typeAnnotation = deserializeTSType(pos + 8); + return node; } function deserializeJSDocUnknownType(pos) { @@ -4157,14 +4838,16 @@ function deserializeComment(pos) { let type = deserializeCommentKind(pos + 12), start = deserializeU32(pos), end = deserializeU32(pos + 4), + node = { + type, + value: null, + start, + end, + range: [start, end], + }, endCut = type === 'Line' ? 0 : 2; - return { - type, - value: sourceText.slice(start + 2, end - endCut), - start, - end, - range: [start, end], - }; + node.value = sourceText.slice(start + 2, end - endCut); + return node; } function deserializeNameSpan(pos) { diff --git a/napi/parser/generated/deserialize/ts_range_parent.js b/napi/parser/generated/deserialize/ts_range_parent.js new file mode 100644 index 0000000000000..18ed403a028dc --- /dev/null +++ b/napi/parser/generated/deserialize/ts_range_parent.js @@ -0,0 +1,7098 @@ +// Auto-generated code, DO NOT EDIT DIRECTLY! +// To edit this generated file you have to edit `tasks/ast_tools/src/generators/raw_transfer.rs`. + +let uint8, uint32, float64, sourceText, sourceIsAscii, sourceByteLen; +const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }), + decodeStr = textDecoder.decode.bind(textDecoder), + { fromCodePoint } = String; +let parent = null; + +export function deserialize(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData); +} + +export function deserializeProgramOnly(buffer, sourceText, sourceByteLen) { + return deserializeWith(buffer, sourceText, sourceByteLen, deserializeProgram); +} + +function deserializeWith(buffer, sourceTextInput, sourceByteLenInput, deserialize) { + uint8 = buffer; + uint32 = buffer.uint32; + float64 = buffer.float64; + sourceText = sourceTextInput; + sourceByteLen = sourceByteLenInput; + sourceIsAscii = sourceText.length === sourceByteLen; + let data = deserialize(uint32[536870902]); + uint8 = + uint32 = + float64 = + sourceText = + void 0; + return data; +} + +function deserializeProgram(pos) { + let end = deserializeU32(pos + 4), + program = parent = { + type: 'Program', + body: null, + sourceType: deserializeModuleKind(pos + 125), + hashbang: null, + start: 0, + end, + range: [0, end], + parent: null, + }; + program.hashbang = deserializeOptionHashbang(pos + 48); + let body = program.body = deserializeVecDirective(pos + 72); + body.push(...deserializeVecStatement(pos + 96)); + { + let start; + if (body.length > 0) { + let first = body[0]; + start = first.start; + if (first.type === 'ExportNamedDeclaration' || first.type === 'ExportDefaultDeclaration') { + let { declaration } = first; + if (declaration !== null && declaration.type === 'ClassDeclaration' && declaration.decorators.length > 0) { + let decoratorStart = declaration.decorators[0].start; + decoratorStart < start && (start = decoratorStart); + } + } + } else start = end; + program.start = program.range[0] = start; + } + parent = null; + return program; +} + +function deserializeExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Expression`); + } +} + +function deserializeIdentifierName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeIdentifierReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeLabelIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeThisExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'ThisExpression', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeArrayExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayExpression', + elements: null, + start, + end, + range: [start, end], + parent, + }; + node.elements = deserializeVecArrayExpressionElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArrayExpressionElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + case 65: + return deserializeElision(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ArrayExpressionElement`); + } +} + +function deserializeElision(pos) { + return null; +} + +function deserializeObjectExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectExpression', + properties: null, + start, + end, + range: [start, end], + parent, + }; + node.properties = deserializeVecObjectPropertyKind(pos + 8); + parent = previousParent; + return node; +} + +function deserializeObjectPropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxObjectProperty(pos + 8); + case 1: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ObjectPropertyKind`); + } +} + +function deserializeObjectProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: deserializePropertyKind(pos + 40), + key: null, + value: null, + method: deserializeBool(pos + 41), + shorthand: deserializeBool(pos + 42), + computed: deserializeBool(pos + 43), + optional: null, + start, + end, + range: [start, end], + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeExpression(pos + 24); + node.optional = false; + parent = previousParent; + return node; +} + +function deserializePropertyKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxIdentifierName(pos + 8); + case 65: + return deserializeBoxPrivateIdentifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKey`); + } +} + +function deserializePropertyKind(pos) { + switch (uint8[pos]) { + case 0: + return 'init'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyKind`); + } +} + +function deserializeTemplateLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TemplateLiteral', + quasis: null, + expressions: null, + start, + end, + range: [start, end], + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.expressions = deserializeVecExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTaggedTemplateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TaggedTemplateExpression', + tag: null, + typeArguments: null, + quasi: null, + start, + end, + range: [start, end], + parent, + }; + node.tag = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.quasi = deserializeTemplateLiteral(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTemplateElement(pos) { + let tail = deserializeBool(pos + 40), + start = deserializeU32(pos) - 1, + end = deserializeU32(pos + 4) + 2 - tail, + value = deserializeTemplateElementValue(pos + 8); + value.cooked !== null && deserializeBool(pos + 41) && + (value.cooked = value.cooked.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + return { + type: 'TemplateElement', + value, + tail, + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTemplateElementValue(pos) { + return { + raw: deserializeStr(pos), + cooked: deserializeOptionStr(pos + 16), + }; +} + +function deserializeComputedMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 40), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeExpression(pos + 24); + node.computed = true; + parent = previousParent; + return node; +} + +function deserializeStaticMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializeIdentifierName(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializePrivateFieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MemberExpression', + object: null, + property: null, + optional: deserializeBool(pos + 48), + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.property = deserializePrivateIdentifier(pos + 24); + node.computed = false; + parent = previousParent; + return node; +} + +function deserializeCallExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CallExpression', + callee: null, + typeArguments: null, + arguments: null, + optional: deserializeBool(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeNewExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'NewExpression', + callee: null, + typeArguments: null, + arguments: null, + start, + end, + range: [start, end], + parent, + }; + node.callee = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeMetaProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'MetaProperty', + meta: null, + property: null, + start, + end, + range: [start, end], + parent, + }; + node.meta = deserializeIdentifierName(pos + 8); + node.property = deserializeIdentifierName(pos + 32); + parent = previousParent; + return node; +} + +function deserializeSpreadElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SpreadElement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeArgument(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxSpreadElement(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Argument`); + } +} + +function deserializeUpdateExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UpdateExpression', + operator: deserializeUpdateOperator(pos + 24), + prefix: deserializeBool(pos + 25), + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeSimpleAssignmentTarget(pos + 8); + parent = previousParent; + return node; +} + +function deserializeUnaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'UnaryExpression', + operator: deserializeUnaryOperator(pos + 24), + argument: null, + prefix: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + node.prefix = true; + parent = previousParent; + return node; +} + +function deserializeBinaryExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: deserializeBinaryOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializePrivateInExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BinaryExpression', + left: null, + operator: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializePrivateIdentifier(pos + 8); + node.operator = 'in'; + node.right = deserializeExpression(pos + 32); + parent = previousParent; + return node; +} + +function deserializeLogicalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LogicalExpression', + left: null, + operator: deserializeLogicalOperator(pos + 40), + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeExpression(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeConditionalExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ConditionalExpression', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeExpression(pos + 24); + node.alternate = deserializeExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeAssignmentExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentExpression', + operator: deserializeAssignmentOperator(pos + 40), + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTarget`); + } +} + +function deserializeSimpleAssignmentTarget(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for SimpleAssignmentTarget`); + } +} + +function deserializeArrayAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }, + elements = deserializeVecOptionAssignmentTargetMaybeDefault(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && elements.push(rest); + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeObjectAssignmentTarget(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }, + properties = deserializeVecAssignmentTargetProperty(pos + 8), + rest = deserializeOptionBoxAssignmentTargetRest(pos + 32); + rest !== null && properties.push(rest); + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetRest(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.argument = deserializeAssignmentTarget(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetMaybeDefault(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxAssignmentTargetWithDefault(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetMaybeDefault`); + } +} + +function deserializeAssignmentTargetWithDefault(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.left = deserializeAssignmentTarget(pos + 8); + node.right = deserializeExpression(pos + 24); + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetProperty(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxAssignmentTargetPropertyIdentifier(pos + 8); + case 1: + return deserializeBoxAssignmentTargetPropertyProperty(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentTargetProperty`); + } +} + +function deserializeAssignmentTargetPropertyIdentifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: null, + optional: null, + start, + end, + range: [start, end], + parent, + }, + key = deserializeIdentifierReference(pos + 8), + init = deserializeOptionExpression(pos + 40), + value = { ...key }; + if (init !== null) { + let left = value, previousParent = parent; + value = parent = { + type: 'AssignmentPattern', + decorators: [], + left, + right: init, + optional: false, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + left.parent = value; + init.parent = value; + parent = previousParent; + } + node.kind = 'init'; + node.key = key; + node.value = value; + node.method = false; + node.shorthand = true; + node.computed = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeAssignmentTargetPropertyProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: null, + computed: deserializeBool(pos + 40), + optional: null, + start, + end, + range: [start, end], + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeAssignmentTargetMaybeDefault(pos + 24); + node.method = false; + node.shorthand = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeSequenceExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SequenceExpression', + expressions: null, + start, + end, + range: [start, end], + parent, + }; + node.expressions = deserializeVecExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeSuper(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Super', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeAwaitExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AwaitExpression', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ChainExpression', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeChainElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeChainElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxCallExpression(pos + 8); + case 1: + return deserializeBoxTSNonNullExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ChainElement`); + } +} + +function deserializeParenthesizedExpression(pos) { + let node; + { + let start, end, previousParent = parent; + node = parent = { + type: 'ParenthesizedExpression', + expression: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeStatement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBlockStatement(pos + 8); + case 1: + return deserializeBoxBreakStatement(pos + 8); + case 2: + return deserializeBoxContinueStatement(pos + 8); + case 3: + return deserializeBoxDebuggerStatement(pos + 8); + case 4: + return deserializeBoxDoWhileStatement(pos + 8); + case 5: + return deserializeBoxEmptyStatement(pos + 8); + case 6: + return deserializeBoxExpressionStatement(pos + 8); + case 7: + return deserializeBoxForInStatement(pos + 8); + case 8: + return deserializeBoxForOfStatement(pos + 8); + case 9: + return deserializeBoxForStatement(pos + 8); + case 10: + return deserializeBoxIfStatement(pos + 8); + case 11: + return deserializeBoxLabeledStatement(pos + 8); + case 12: + return deserializeBoxReturnStatement(pos + 8); + case 13: + return deserializeBoxSwitchStatement(pos + 8); + case 14: + return deserializeBoxThrowStatement(pos + 8); + case 15: + return deserializeBoxTryStatement(pos + 8); + case 16: + return deserializeBoxWhileStatement(pos + 8); + case 17: + return deserializeBoxWithStatement(pos + 8); + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + case 64: + return deserializeBoxImportDeclaration(pos + 8); + case 65: + return deserializeBoxExportAllDeclaration(pos + 8); + case 66: + return deserializeBoxExportDefaultDeclaration(pos + 8); + case 67: + return deserializeBoxExportNamedDeclaration(pos + 8); + case 68: + return deserializeBoxTSExportAssignment(pos + 8); + case 69: + return deserializeBoxTSNamespaceExportDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Statement`); + } +} + +function deserializeDirective(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: deserializeStr(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeHashbang(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Hashbang', + value: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeBlockStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDeclaration(pos) { + switch (uint8[pos]) { + case 32: + return deserializeBoxVariableDeclaration(pos + 8); + case 33: + return deserializeBoxFunction(pos + 8); + case 34: + return deserializeBoxClass(pos + 8); + case 35: + return deserializeBoxTSTypeAliasDeclaration(pos + 8); + case 36: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + case 37: + return deserializeBoxTSEnumDeclaration(pos + 8); + case 38: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 39: + return deserializeBoxTSImportEqualsDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for Declaration`); + } +} + +function deserializeVariableDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclaration', + kind: deserializeVariableDeclarationKind(pos + 32), + declarations: null, + declare: deserializeBool(pos + 33), + start, + end, + range: [start, end], + parent, + }; + node.declarations = deserializeVecVariableDeclarator(pos + 8); + parent = previousParent; + return node; +} + +function deserializeVariableDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'var'; + case 1: + return 'let'; + case 2: + return 'const'; + case 3: + return 'using'; + case 4: + return 'await using'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for VariableDeclarationKind`); + } +} + +function deserializeVariableDeclarator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'VariableDeclarator', + id: null, + init: null, + definite: deserializeBool(pos + 57), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingPattern(pos + 8); + node.init = deserializeOptionExpression(pos + 40); + parent = previousParent; + return node; +} + +function deserializeEmptyStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'EmptyStatement', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeExpressionStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExpressionStatement', + expression: null, + directive: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.directive = null; + parent = previousParent; + return node; +} + +function deserializeIfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'IfStatement', + test: null, + consequent: null, + alternate: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.consequent = deserializeStatement(pos + 24); + node.alternate = deserializeOptionStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeDoWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'DoWhileStatement', + body: null, + test: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeStatement(pos + 8); + node.test = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeWhileStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WhileStatement', + test: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeForStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.init = deserializeOptionForStatementInit(pos + 8); + node.test = deserializeOptionExpression(pos + 24); + node.update = deserializeOptionExpression(pos + 40); + node.body = deserializeStatement(pos + 56); + parent = previousParent; + return node; +} + +function deserializeForStatementInit(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxVariableDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementInit`); + } +} + +function deserializeForInStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForInStatement', + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeForStatementLeft(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSAsExpression(pos + 8); + case 2: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 3: + return deserializeBoxTSNonNullExpression(pos + 8); + case 4: + return deserializeBoxTSTypeAssertion(pos + 8); + case 8: + return deserializeBoxArrayAssignmentTarget(pos + 8); + case 9: + return deserializeBoxObjectAssignmentTarget(pos + 8); + case 16: + return deserializeBoxVariableDeclaration(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ForStatementLeft`); + } +} + +function deserializeForOfStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ForOfStatement', + await: deserializeBool(pos + 60), + left: null, + right: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeForStatementLeft(pos + 8); + node.right = deserializeExpression(pos + 24); + node.body = deserializeStatement(pos + 40); + parent = previousParent; + return node; +} + +function deserializeContinueStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ContinueStatement', + label: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeBreakStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BreakStatement', + label: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeOptionLabelIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeReturnStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ReturnStatement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'WithStatement', + object: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeExpression(pos + 8); + node.body = deserializeStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchStatement', + discriminant: null, + cases: null, + start, + end, + range: [start, end], + parent, + }; + node.discriminant = deserializeExpression(pos + 8); + node.cases = deserializeVecSwitchCase(pos + 24); + parent = previousParent; + return node; +} + +function deserializeSwitchCase(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'SwitchCase', + test: null, + consequent: null, + start, + end, + range: [start, end], + parent, + }; + node.test = deserializeOptionExpression(pos + 8); + node.consequent = deserializeVecStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeLabeledStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'LabeledStatement', + label: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeLabelIdentifier(pos + 8); + node.body = deserializeStatement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeThrowStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ThrowStatement', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTryStatement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TryStatement', + block: null, + handler: null, + finalizer: null, + start, + end, + range: [start, end], + parent, + }; + node.block = deserializeBoxBlockStatement(pos + 8); + node.handler = deserializeOptionBoxCatchClause(pos + 16); + node.finalizer = deserializeOptionBoxBlockStatement(pos + 24); + parent = previousParent; + return node; +} + +function deserializeCatchClause(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'CatchClause', + param: null, + body: null, + start, + end, + range: [start, end], + parent, + }; + node.param = deserializeOptionCatchParameter(pos + 8); + node.body = deserializeBoxBlockStatement(pos + 48); + parent = previousParent; + return node; +} + +function deserializeCatchParameter(pos) { + return deserializeBindingPattern(pos + 8); +} + +function deserializeDebuggerStatement(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'DebuggerStatement', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeBindingPattern(pos) { + let pattern = deserializeBindingPatternKind(pos); + { + let previousParent = parent; + parent = pattern; + pattern.optional = deserializeBool(pos + 24); + pattern.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + } + return pattern; +} + +function deserializeBindingPatternKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBindingIdentifier(pos + 8); + case 1: + return deserializeBoxObjectPattern(pos + 8); + case 2: + return deserializeBoxArrayPattern(pos + 8); + case 3: + return deserializeBoxAssignmentPattern(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BindingPatternKind`); + } +} + +function deserializeAssignmentPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'AssignmentPattern', + decorators: null, + left: null, + right: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.left = deserializeBindingPattern(pos + 8); + node.right = deserializeExpression(pos + 40); + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeObjectPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ObjectPattern', + decorators: null, + properties: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }, + properties = deserializeVecBindingProperty(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && properties.push(rest); + node.decorators = []; + node.properties = properties; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Property', + kind: null, + key: null, + value: null, + method: null, + shorthand: deserializeBool(pos + 56), + computed: deserializeBool(pos + 57), + optional: null, + start, + end, + range: [start, end], + parent, + }; + node.kind = 'init'; + node.key = deserializePropertyKey(pos + 8); + node.value = deserializeBindingPattern(pos + 24); + node.method = false; + node.optional = false; + parent = previousParent; + return node; +} + +function deserializeArrayPattern(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrayPattern', + decorators: null, + elements: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }, + elements = deserializeVecOptionBindingPattern(pos + 8), + rest = deserializeOptionBoxBindingRestElement(pos + 32); + rest !== null && elements.push(rest); + node.decorators = []; + node.elements = elements; + node.optional = false; + node.typeAnnotation = null; + parent = previousParent; + return node; +} + +function deserializeBindingRestElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'RestElement', + decorators: null, + argument: null, + optional: null, + typeAnnotation: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.argument = deserializeBindingPattern(pos + 8); + node.optional = false; + node.typeAnnotation = null; + node.value = null; + parent = previousParent; + return node; +} + +function deserializeFunction(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeFunctionType(pos + 84), + id: null, + generator: deserializeBool(pos + 85), + async: deserializeBool(pos + 86), + declare: deserializeBool(pos + 87), + typeParameters: null, + params: null, + returnType: null, + body: null, + expression: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 56); + { + let thisParam = deserializeOptionBoxTSThisParameter(pos + 48); + thisParam !== null && params.unshift(thisParam); + } + node.id = deserializeOptionBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 64); + node.body = deserializeOptionBoxFunctionBody(pos + 72); + node.expression = false; + parent = previousParent; + return node; +} + +function deserializeFunctionType(pos) { + switch (uint8[pos]) { + case 0: + return 'FunctionDeclaration'; + case 1: + return 'FunctionExpression'; + case 2: + return 'TSDeclareFunction'; + case 3: + return 'TSEmptyBodyFunctionExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for FunctionType`); + } +} + +function deserializeFormalParameters(pos) { + let params = deserializeVecFormalParameter(pos + 8); + if (uint32[pos + 32 >> 2] !== 0 && uint32[pos + 36 >> 2] !== 0) { + pos = uint32[pos + 32 >> 2]; + let start, + end, + previousParent = parent, + rest = parent = { + type: 'RestElement', + decorators: [], + argument: null, + optional: deserializeBool(pos + 32), + typeAnnotation: null, + value: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + rest.argument = deserializeBindingPatternKind(pos + 8); + rest.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + params.push(rest); + parent = previousParent; + } + return params; +} + +function deserializeFormalParameter(pos) { + let param; + { + let accessibility = deserializeOptionTSAccessibility(pos + 64), + readonly = deserializeBool(pos + 65), + override = deserializeBool(pos + 66), + previousParent = parent; + if (accessibility === null && !readonly && !override) { + param = parent = deserializeBindingPatternKind(pos + 32); + param.decorators = deserializeVecDecorator(pos + 8); + param.optional = deserializeBool(pos + 56); + param.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + } else { + let start, end; + param = parent = { + type: 'TSParameterProperty', + accessibility, + decorators: null, + override, + parameter: null, + readonly, + static: false, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + param.decorators = deserializeVecDecorator(pos + 8); + param.parameter = deserializeBindingPattern(pos + 32); + } + parent = previousParent; + } + return param; +} + +function deserializeFunctionBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'BlockStatement', + body: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeArrowFunctionExpression(pos) { + let expression = deserializeBool(pos + 44), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ArrowFunctionExpression', + expression, + async: deserializeBool(pos + 45), + typeParameters: null, + params: null, + returnType: null, + body: null, + id: null, + generator: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeBoxFunctionBody(pos + 32); + if (expression === true) { + body = body.body[0].expression; + body.parent = parent; + } + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.body = body; + node.id = null; + node.generator = false; + parent = previousParent; + return node; +} + +function deserializeYieldExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'YieldExpression', + delegate: deserializeBool(pos + 24), + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeOptionExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClass(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeClassType(pos + 132), + decorators: null, + id: null, + typeParameters: null, + superClass: null, + superTypeArguments: null, + implements: null, + body: null, + abstract: deserializeBool(pos + 133), + declare: deserializeBool(pos + 134), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.id = deserializeOptionBindingIdentifier(pos + 32); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 64); + node.superClass = deserializeOptionExpression(pos + 72); + node.superTypeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 88); + node.implements = deserializeVecTSClassImplements(pos + 96); + node.body = deserializeBoxClassBody(pos + 120); + parent = previousParent; + return node; +} + +function deserializeClassType(pos) { + switch (uint8[pos]) { + case 0: + return 'ClassDeclaration'; + case 1: + return 'ClassExpression'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassType`); + } +} + +function deserializeClassBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ClassBody', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecClassElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeClassElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStaticBlock(pos + 8); + case 1: + return deserializeBoxMethodDefinition(pos + 8); + case 2: + return deserializeBoxPropertyDefinition(pos + 8); + case 3: + return deserializeBoxAccessorProperty(pos + 8); + case 4: + return deserializeBoxTSIndexSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ClassElement`); + } +} + +function deserializeMethodDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeMethodDefinitionType(pos + 56), + decorators: null, + key: null, + value: null, + kind: deserializeMethodDefinitionKind(pos + 57), + computed: deserializeBool(pos + 58), + static: deserializeBool(pos + 59), + override: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + accessibility: deserializeOptionTSAccessibility(pos + 62), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.value = deserializeBoxFunction(pos + 48); + parent = previousParent; + return node; +} + +function deserializeMethodDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'MethodDefinition'; + case 1: + return 'TSAbstractMethodDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionType`); + } +} + +function deserializePropertyDefinition(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializePropertyDefinitionType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + declare: deserializeBool(pos + 75), + override: deserializeBool(pos + 76), + optional: deserializeBool(pos + 77), + definite: deserializeBool(pos + 78), + readonly: deserializeBool(pos + 79), + accessibility: deserializeOptionTSAccessibility(pos + 80), + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + parent = previousParent; + return node; +} + +function deserializePropertyDefinitionType(pos) { + switch (uint8[pos]) { + case 0: + return 'PropertyDefinition'; + case 1: + return 'TSAbstractPropertyDefinition'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for PropertyDefinitionType`); + } +} + +function deserializeMethodDefinitionKind(pos) { + switch (uint8[pos]) { + case 0: + return 'constructor'; + case 1: + return 'method'; + case 2: + return 'get'; + case 3: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for MethodDefinitionKind`); + } +} + +function deserializePrivateIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'PrivateIdentifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeStaticBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'StaticBlock', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecStatement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeAccessorPropertyType(pos) { + switch (uint8[pos]) { + case 0: + return 'AccessorProperty'; + case 1: + return 'TSAbstractAccessorProperty'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AccessorPropertyType`); + } +} + +function deserializeAccessorProperty(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: deserializeAccessorPropertyType(pos + 72), + decorators: null, + key: null, + typeAnnotation: null, + value: null, + computed: deserializeBool(pos + 73), + static: deserializeBool(pos + 74), + override: deserializeBool(pos + 75), + definite: deserializeBool(pos + 76), + accessibility: deserializeOptionTSAccessibility(pos + 77), + declare: null, + optional: null, + readonly: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = deserializeVecDecorator(pos + 8); + node.key = deserializePropertyKey(pos + 32); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.value = deserializeOptionExpression(pos + 56); + node.declare = false; + node.optional = false; + node.readonly = false; + parent = previousParent; + return node; +} + +function deserializeImportExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportExpression', + source: null, + options: null, + phase: deserializeOptionImportPhase(pos + 40), + start, + end, + range: [start, end], + parent, + }; + node.source = deserializeExpression(pos + 8); + node.options = deserializeOptionExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDeclaration', + specifiers: null, + source: null, + phase: deserializeOptionImportPhase(pos + 88), + attributes: null, + importKind: deserializeImportOrExportKind(pos + 89), + start, + end, + range: [start, end], + parent, + }, + specifiers = deserializeOptionVecImportDeclarationSpecifier(pos + 8); + specifiers === null && (specifiers = []); + let withClause = deserializeOptionBoxWithClause(pos + 80); + node.specifiers = specifiers; + node.source = deserializeStringLiteral(pos + 32); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeImportPhase(pos) { + switch (uint8[pos]) { + case 0: + return 'source'; + case 1: + return 'defer'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportPhase`); + } +} + +function deserializeImportDeclarationSpecifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxImportSpecifier(pos + 8); + case 1: + return deserializeBoxImportDefaultSpecifier(pos + 8); + case 2: + return deserializeBoxImportNamespaceSpecifier(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportDeclarationSpecifier`); + } +} + +function deserializeImportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportSpecifier', + imported: null, + local: null, + importKind: deserializeImportOrExportKind(pos + 96), + start, + end, + range: [start, end], + parent, + }; + node.imported = deserializeModuleExportName(pos + 8); + node.local = deserializeBindingIdentifier(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportDefaultSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportDefaultSpecifier', + local: null, + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeImportNamespaceSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportNamespaceSpecifier', + local: null, + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeBindingIdentifier(pos + 8); + parent = previousParent; + return node; +} + +function deserializeWithClause(pos) { + return { attributes: deserializeVecImportAttribute(pos + 8) }; +} + +function deserializeImportAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ImportAttribute', + key: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.key = deserializeImportAttributeKey(pos + 8); + node.value = deserializeStringLiteral(pos + 64); + parent = previousParent; + return node; +} + +function deserializeImportAttributeKey(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportAttributeKey`); + } +} + +function deserializeExportNamedDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportNamedDeclaration', + declaration: null, + specifiers: null, + source: null, + exportKind: deserializeImportOrExportKind(pos + 104), + attributes: null, + start, + end, + range: [start, end], + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 96); + node.declaration = deserializeOptionDeclaration(pos + 8); + node.specifiers = deserializeVecExportSpecifier(pos + 24); + node.source = deserializeOptionStringLiteral(pos + 48); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportDefaultDeclaration', + declaration: null, + exportKind: null, + start, + end, + range: [start, end], + parent, + }; + node.declaration = deserializeExportDefaultDeclarationKind(pos + 8); + node.exportKind = 'value'; + parent = previousParent; + return node; +} + +function deserializeExportAllDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportAllDeclaration', + exported: null, + source: null, + attributes: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + parent, + }, + withClause = deserializeOptionBoxWithClause(pos + 112); + node.exported = deserializeOptionModuleExportName(pos + 8); + node.source = deserializeStringLiteral(pos + 64); + node.attributes = withClause === null ? [] : withClause.attributes; + parent = previousParent; + return node; +} + +function deserializeExportSpecifier(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'ExportSpecifier', + local: null, + exported: null, + exportKind: deserializeImportOrExportKind(pos + 120), + start, + end, + range: [start, end], + parent, + }; + node.local = deserializeModuleExportName(pos + 8); + node.exported = deserializeModuleExportName(pos + 64); + parent = previousParent; + return node; +} + +function deserializeExportDefaultDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeBoxFunction(pos + 8); + case 65: + return deserializeBoxClass(pos + 8); + case 66: + return deserializeBoxTSInterfaceDeclaration(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportDefaultDeclarationKind`); + } +} + +function deserializeModuleExportName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeIdentifierName(pos + 8); + case 1: + return deserializeIdentifierReference(pos + 8); + case 2: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleExportName`); + } +} + +function deserializeV8IntrinsicExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'V8IntrinsicExpression', + name: null, + arguments: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeIdentifierName(pos + 8); + node.arguments = deserializeVecArgument(pos + 32); + parent = previousParent; + return node; +} + +function deserializeBooleanLiteral(pos) { + let value = deserializeBool(pos + 8), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value, + raw: null, + start, + end, + range: [start, end], + parent, + }; + node.raw = start === 0 && end === 0 ? null : value + ''; + parent = previousParent; + return node; +} + +function deserializeNullLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: null, + start, + end, + range: [start, end], + parent, + }; + node.value = null; + node.raw = start === 0 && end === 0 ? null : 'null'; + parent = previousParent; + return node; +} + +function deserializeNumericLiteral(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'Literal', + value: deserializeF64(pos + 8), + raw: deserializeOptionStr(pos + 16), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeStringLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + parent, + }, + value = deserializeStr(pos + 8); + deserializeBool(pos + 40) && + (value = value.replace(/\uFFFD(.{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))); + node.value = value; + parent = previousParent; + return node; +} + +function deserializeBigIntLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 24), + bigint: null, + start, + end, + range: [start, end], + parent, + }, + bigint = deserializeStr(pos + 8); + node.value = BigInt(bigint); + node.bigint = bigint; + parent = previousParent; + return node; +} + +function deserializeRegExpLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Literal', + value: null, + raw: deserializeOptionStr(pos + 40), + regex: null, + start, + end, + range: [start, end], + parent, + }, + regex = deserializeRegExp(pos + 8), + value = null; + try { + value = new RegExp(regex.pattern, regex.flags); + } catch {} + node.value = value; + node.regex = regex; + parent = previousParent; + return node; +} + +function deserializeRegExp(pos) { + return { + pattern: deserializeStr(pos), + flags: deserializeRegExpFlags(pos + 24), + }; +} + +function deserializeRegExpFlags(pos) { + let flagBits = deserializeU8(pos), flags = ''; + // Alphabetical order + flagBits & 64 && (flags += 'd'); + flagBits & 1 && (flags += 'g'); + flagBits & 2 && (flags += 'i'); + flagBits & 4 && (flags += 'm'); + flagBits & 8 && (flags += 's'); + flagBits & 16 && (flags += 'u'); + flagBits & 128 && (flags += 'v'); + flagBits & 32 && (flags += 'y'); + return flags; +} + +function deserializeJSXElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXElement', + openingElement: null, + children: null, + closingElement: null, + start, + end, + range: [start, end], + parent, + }, + closingElement = deserializeOptionBoxJSXClosingElement(pos + 40), + openingElement = deserializeBoxJSXOpeningElement(pos + 8); + closingElement === null && (openingElement.selfClosing = true); + node.openingElement = openingElement; + node.children = deserializeVecJSXChild(pos + 16); + node.closingElement = closingElement; + parent = previousParent; + return node; +} + +function deserializeJSXOpeningElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningElement', + name: null, + typeArguments: null, + attributes: null, + selfClosing: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + node.attributes = deserializeVecJSXAttributeItem(pos + 32); + node.selfClosing = false; + parent = previousParent; + return node; +} + +function deserializeJSXClosingElement(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXClosingElement', + name: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXElementName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXFragment', + openingFragment: null, + children: null, + closingFragment: null, + start, + end, + range: [start, end], + parent, + }; + node.openingFragment = deserializeJSXOpeningFragment(pos + 8); + node.children = deserializeVecJSXChild(pos + 16); + node.closingFragment = deserializeJSXClosingFragment(pos + 40); + parent = previousParent; + return node; +} + +function deserializeJSXOpeningFragment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXOpeningFragment', + start, + end, + range: [start, end], + parent, + }; + parent = previousParent; + return node; +} + +function deserializeJSXClosingFragment(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXClosingFragment', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXElementName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + range: ident.range, + parent, + }; + case 2: + return deserializeBoxJSXNamespacedName(pos + 8); + case 3: + return deserializeBoxJSXMemberExpression(pos + 8); + case 4: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + range: thisExpr.range, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXElementName`); + } +} + +function deserializeJSXNamespacedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXNamespacedName', + namespace: null, + name: null, + start, + end, + range: [start, end], + parent, + }; + node.namespace = deserializeJSXIdentifier(pos + 8); + node.name = deserializeJSXIdentifier(pos + 32); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXMemberExpression', + object: null, + property: null, + start, + end, + range: [start, end], + parent, + }; + node.object = deserializeJSXMemberExpressionObject(pos + 8); + node.property = deserializeJSXIdentifier(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXMemberExpressionObject(pos) { + switch (uint8[pos]) { + case 0: + let ident = deserializeBoxIdentifierReference(pos + 8); + return { + type: 'JSXIdentifier', + name: ident.name, + start: ident.start, + end: ident.end, + range: ident.range, + parent, + }; + case 1: + return deserializeBoxJSXMemberExpression(pos + 8); + case 2: + let thisExpr = deserializeBoxThisExpression(pos + 8); + return { + type: 'JSXIdentifier', + name: 'this', + start: thisExpr.start, + end: thisExpr.end, + range: thisExpr.range, + parent, + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXMemberExpressionObject`); + } +} + +function deserializeJSXExpressionContainer(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXExpressionContainer', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeJSXExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXExpression(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNullLiteral(pos + 8); + case 2: + return deserializeBoxNumericLiteral(pos + 8); + case 3: + return deserializeBoxBigIntLiteral(pos + 8); + case 4: + return deserializeBoxRegExpLiteral(pos + 8); + case 5: + return deserializeBoxStringLiteral(pos + 8); + case 6: + return deserializeBoxTemplateLiteral(pos + 8); + case 7: + return deserializeBoxIdentifierReference(pos + 8); + case 8: + return deserializeBoxMetaProperty(pos + 8); + case 9: + return deserializeBoxSuper(pos + 8); + case 10: + return deserializeBoxArrayExpression(pos + 8); + case 11: + return deserializeBoxArrowFunctionExpression(pos + 8); + case 12: + return deserializeBoxAssignmentExpression(pos + 8); + case 13: + return deserializeBoxAwaitExpression(pos + 8); + case 14: + return deserializeBoxBinaryExpression(pos + 8); + case 15: + return deserializeBoxCallExpression(pos + 8); + case 16: + return deserializeBoxChainExpression(pos + 8); + case 17: + return deserializeBoxClass(pos + 8); + case 18: + return deserializeBoxConditionalExpression(pos + 8); + case 19: + return deserializeBoxFunction(pos + 8); + case 20: + return deserializeBoxImportExpression(pos + 8); + case 21: + return deserializeBoxLogicalExpression(pos + 8); + case 22: + return deserializeBoxNewExpression(pos + 8); + case 23: + return deserializeBoxObjectExpression(pos + 8); + case 24: + return deserializeBoxParenthesizedExpression(pos + 8); + case 25: + return deserializeBoxSequenceExpression(pos + 8); + case 26: + return deserializeBoxTaggedTemplateExpression(pos + 8); + case 27: + return deserializeBoxThisExpression(pos + 8); + case 28: + return deserializeBoxUnaryExpression(pos + 8); + case 29: + return deserializeBoxUpdateExpression(pos + 8); + case 30: + return deserializeBoxYieldExpression(pos + 8); + case 31: + return deserializeBoxPrivateInExpression(pos + 8); + case 32: + return deserializeBoxJSXElement(pos + 8); + case 33: + return deserializeBoxJSXFragment(pos + 8); + case 34: + return deserializeBoxTSAsExpression(pos + 8); + case 35: + return deserializeBoxTSSatisfiesExpression(pos + 8); + case 36: + return deserializeBoxTSTypeAssertion(pos + 8); + case 37: + return deserializeBoxTSNonNullExpression(pos + 8); + case 38: + return deserializeBoxTSInstantiationExpression(pos + 8); + case 39: + return deserializeBoxV8IntrinsicExpression(pos + 8); + case 48: + return deserializeBoxComputedMemberExpression(pos + 8); + case 49: + return deserializeBoxStaticMemberExpression(pos + 8); + case 50: + return deserializeBoxPrivateFieldExpression(pos + 8); + case 64: + return deserializeJSXEmptyExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXExpression`); + } +} + +function deserializeJSXEmptyExpression(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXEmptyExpression', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXAttributeItem(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXAttribute(pos + 8); + case 1: + return deserializeBoxJSXSpreadAttribute(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeItem`); + } +} + +function deserializeJSXAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXAttribute', + name: null, + value: null, + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeJSXAttributeName(pos + 8); + node.value = deserializeOptionJSXAttributeValue(pos + 24); + parent = previousParent; + return node; +} + +function deserializeJSXSpreadAttribute(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadAttribute', + argument: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXAttributeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXIdentifier(pos + 8); + case 1: + return deserializeBoxJSXNamespacedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeName`); + } +} + +function deserializeJSXAttributeValue(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxStringLiteral(pos + 8); + case 1: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 2: + return deserializeBoxJSXElement(pos + 8); + case 3: + return deserializeBoxJSXFragment(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXAttributeValue`); + } +} + +function deserializeJSXIdentifier(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXIdentifier', + name: deserializeStr(pos + 8), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeJSXChild(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxJSXText(pos + 8); + case 1: + return deserializeBoxJSXElement(pos + 8); + case 2: + return deserializeBoxJSXFragment(pos + 8); + case 3: + return deserializeBoxJSXExpressionContainer(pos + 8); + case 4: + return deserializeBoxJSXSpreadChild(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for JSXChild`); + } +} + +function deserializeJSXSpreadChild(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'JSXSpreadChild', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSXText(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'JSXText', + value: deserializeStr(pos + 8), + raw: deserializeOptionStr(pos + 24), + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSThisParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: null, + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.name = 'this'; + node.optional = false; + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 16); + parent = previousParent; + return node; +} + +function deserializeTSEnumDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumDeclaration', + id: null, + body: null, + const: deserializeBool(pos + 76), + declare: deserializeBool(pos + 77), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.body = deserializeTSEnumBody(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSEnumBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumBody', + members: null, + start, + end, + range: [start, end], + parent, + }; + node.members = deserializeVecTSEnumMember(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSEnumMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSEnumMember', + id: null, + initializer: null, + computed: null, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeTSEnumMemberName(pos + 8); + node.initializer = deserializeOptionExpression(pos + 24); + node.computed = deserializeU8(pos + 8) > 1; + parent = previousParent; + return node; +} + +function deserializeTSEnumMemberName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxStringLiteral(pos + 8); + case 2: + return deserializeBoxStringLiteral(pos + 8); + case 3: + return deserializeBoxTemplateLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSEnumMemberName`); + } +} + +function deserializeTSTypeAnnotation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAnnotation', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSLiteralType', + literal: null, + start, + end, + range: [start, end], + parent, + }; + node.literal = deserializeTSLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSLiteral(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxBooleanLiteral(pos + 8); + case 1: + return deserializeBoxNumericLiteral(pos + 8); + case 2: + return deserializeBoxBigIntLiteral(pos + 8); + case 3: + return deserializeBoxStringLiteral(pos + 8); + case 4: + return deserializeBoxTemplateLiteral(pos + 8); + case 5: + return deserializeBoxUnaryExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSLiteral`); + } +} + +function deserializeTSType(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSType`); + } +} + +function deserializeTSConditionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConditionalType', + checkType: null, + extendsType: null, + trueType: null, + falseType: null, + start, + end, + range: [start, end], + parent, + }; + node.checkType = deserializeTSType(pos + 8); + node.extendsType = deserializeTSType(pos + 24); + node.trueType = deserializeTSType(pos + 40); + node.falseType = deserializeTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSUnionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSUnionType', + types: null, + start, + end, + range: [start, end], + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIntersectionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIntersectionType', + types: null, + start, + end, + range: [start, end], + parent, + }; + node.types = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSParenthesizedType(pos) { + let node; + { + let start, end, previousParent = parent; + node = parent = { + type: 'TSParenthesizedType', + typeAnnotation: null, + start: start = deserializeU32(pos), + end: end = deserializeU32(pos + 4), + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + } + return node; +} + +function deserializeTSTypeOperator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeOperator', + operator: deserializeTSTypeOperatorOperator(pos + 24), + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeOperatorOperator(pos) { + switch (uint8[pos]) { + case 0: + return 'keyof'; + case 1: + return 'unique'; + case 2: + return 'readonly'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeOperatorOperator`); + } +} + +function deserializeTSArrayType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSArrayType', + elementType: null, + start, + end, + range: [start, end], + parent, + }; + node.elementType = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSIndexedAccessType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexedAccessType', + objectType: null, + indexType: null, + start, + end, + range: [start, end], + parent, + }; + node.objectType = deserializeTSType(pos + 8); + node.indexType = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTupleType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTupleType', + elementTypes: null, + start, + end, + range: [start, end], + parent, + }; + node.elementTypes = deserializeVecTSTupleElement(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamedTupleMember(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamedTupleMember', + label: null, + elementType: null, + optional: deserializeBool(pos + 48), + start, + end, + range: [start, end], + parent, + }; + node.label = deserializeIdentifierName(pos + 8); + node.elementType = deserializeTSTupleElement(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSOptionalType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSOptionalType', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSRestType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSRestType', + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTupleElement(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSAnyKeyword(pos + 8); + case 1: + return deserializeBoxTSBigIntKeyword(pos + 8); + case 2: + return deserializeBoxTSBooleanKeyword(pos + 8); + case 3: + return deserializeBoxTSIntrinsicKeyword(pos + 8); + case 4: + return deserializeBoxTSNeverKeyword(pos + 8); + case 5: + return deserializeBoxTSNullKeyword(pos + 8); + case 6: + return deserializeBoxTSNumberKeyword(pos + 8); + case 7: + return deserializeBoxTSObjectKeyword(pos + 8); + case 8: + return deserializeBoxTSStringKeyword(pos + 8); + case 9: + return deserializeBoxTSSymbolKeyword(pos + 8); + case 10: + return deserializeBoxTSThisType(pos + 8); + case 11: + return deserializeBoxTSUndefinedKeyword(pos + 8); + case 12: + return deserializeBoxTSUnknownKeyword(pos + 8); + case 13: + return deserializeBoxTSVoidKeyword(pos + 8); + case 14: + return deserializeBoxTSArrayType(pos + 8); + case 15: + return deserializeBoxTSConditionalType(pos + 8); + case 16: + return deserializeBoxTSConstructorType(pos + 8); + case 17: + return deserializeBoxTSFunctionType(pos + 8); + case 18: + return deserializeBoxTSImportType(pos + 8); + case 19: + return deserializeBoxTSIndexedAccessType(pos + 8); + case 20: + return deserializeBoxTSInferType(pos + 8); + case 21: + return deserializeBoxTSIntersectionType(pos + 8); + case 22: + return deserializeBoxTSLiteralType(pos + 8); + case 23: + return deserializeBoxTSMappedType(pos + 8); + case 24: + return deserializeBoxTSNamedTupleMember(pos + 8); + case 26: + return deserializeBoxTSTemplateLiteralType(pos + 8); + case 27: + return deserializeBoxTSTupleType(pos + 8); + case 28: + return deserializeBoxTSTypeLiteral(pos + 8); + case 29: + return deserializeBoxTSTypeOperator(pos + 8); + case 30: + return deserializeBoxTSTypePredicate(pos + 8); + case 31: + return deserializeBoxTSTypeQuery(pos + 8); + case 32: + return deserializeBoxTSTypeReference(pos + 8); + case 33: + return deserializeBoxTSUnionType(pos + 8); + case 34: + return deserializeBoxTSParenthesizedType(pos + 8); + case 35: + return deserializeBoxJSDocNullableType(pos + 8); + case 36: + return deserializeBoxJSDocNonNullableType(pos + 8); + case 37: + return deserializeBoxJSDocUnknownType(pos + 8); + case 64: + return deserializeBoxTSOptionalType(pos + 8); + case 65: + return deserializeBoxTSRestType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTupleElement`); + } +} + +function deserializeTSAnyKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSAnyKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSStringKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSStringKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSBooleanKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBooleanKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNumberKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNumberKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNeverKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNeverKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSIntrinsicKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSIntrinsicKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSUnknownKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUnknownKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSNullKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSNullKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSUndefinedKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSUndefinedKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSVoidKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSVoidKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSSymbolKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSSymbolKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSThisType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSThisType', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSObjectKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSObjectKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSBigIntKeyword(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSBigIntKeyword', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeTSTypeReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeReference', + typeName: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.typeName = deserializeTSTypeName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeName`); + } +} + +function deserializeTSQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeTSTypeName(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterInstantiation(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterInstantiation', + params: null, + start, + end, + range: [start, end], + parent, + }; + node.params = deserializeVecTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameter(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameter', + name: null, + constraint: null, + default: null, + in: deserializeBool(pos + 72), + out: deserializeBool(pos + 73), + const: deserializeBool(pos + 74), + start, + end, + range: [start, end], + parent, + }; + node.name = deserializeBindingIdentifier(pos + 8); + node.constraint = deserializeOptionTSType(pos + 40); + node.default = deserializeOptionTSType(pos + 56); + parent = previousParent; + return node; +} + +function deserializeTSTypeParameterDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeParameterDeclaration', + params: null, + start, + end, + range: [start, end], + parent, + }; + node.params = deserializeVecTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeAliasDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAliasDeclaration', + id: null, + typeParameters: null, + typeAnnotation: null, + declare: deserializeBool(pos + 68), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.typeAnnotation = deserializeTSType(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSAccessibility(pos) { + switch (uint8[pos]) { + case 0: + return 'private'; + case 1: + return 'protected'; + case 2: + return 'public'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSAccessibility`); + } +} + +function deserializeTSClassImplements(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSClassImplements', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }, + expression = deserializeTSTypeName(pos + 8); + if (expression.type === 'TSQualifiedName') { + let object = expression.left, + { right } = expression, + start, + end, + previous = expression = { + type: 'MemberExpression', + object, + property: right, + optional: false, + computed: false, + start: start = expression.start, + end: end = expression.end, + range: [start, end], + parent, + }; + right.parent = previous; + for (;;) { + if (object.type !== 'TSQualifiedName') { + object.parent = previous; + break; + } + let { left, right } = object; + previous = previous.object = { + type: 'MemberExpression', + object: left, + property: right, + optional: false, + computed: false, + start: start = object.start, + end: end = object.end, + range: [start, end], + parent: previous, + }; + right.parent = previous; + object = left; + } + } + node.expression = expression; + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceDeclaration', + id: null, + typeParameters: null, + extends: null, + body: null, + declare: deserializeBool(pos + 84), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 40); + node.extends = deserializeVecTSInterfaceHeritage(pos + 48); + node.body = deserializeBoxTSInterfaceBody(pos + 72); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceBody(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceBody', + body: null, + start, + end, + range: [start, end], + parent, + }; + node.body = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSPropertySignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSPropertySignature', + computed: deserializeBool(pos + 32), + optional: deserializeBool(pos + 33), + readonly: deserializeBool(pos + 34), + key: null, + typeAnnotation: null, + accessibility: null, + static: null, + start, + end, + range: [start, end], + parent, + }; + node.key = deserializePropertyKey(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + node.accessibility = null; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSSignature(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSIndexSignature(pos + 8); + case 1: + return deserializeBoxTSPropertySignature(pos + 8); + case 2: + return deserializeBoxTSCallSignatureDeclaration(pos + 8); + case 3: + return deserializeBoxTSConstructSignatureDeclaration(pos + 8); + case 4: + return deserializeBoxTSMethodSignature(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSSignature`); + } +} + +function deserializeTSIndexSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSIndexSignature', + parameters: null, + typeAnnotation: null, + readonly: deserializeBool(pos + 40), + static: deserializeBool(pos + 41), + accessibility: null, + start, + end, + range: [start, end], + parent, + }; + node.parameters = deserializeVecTSIndexSignatureName(pos + 8); + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 32); + node.accessibility = null; + parent = previousParent; + return node; +} + +function deserializeTSCallSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSCallSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSMethodSignatureKind(pos) { + switch (uint8[pos]) { + case 0: + return 'method'; + case 1: + return 'get'; + case 2: + return 'set'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMethodSignatureKind`); + } +} + +function deserializeTSMethodSignature(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMethodSignature', + key: null, + computed: deserializeBool(pos + 60), + optional: deserializeBool(pos + 61), + kind: deserializeTSMethodSignatureKind(pos + 62), + typeParameters: null, + params: null, + returnType: null, + accessibility: null, + readonly: null, + static: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 40), + thisParam = deserializeOptionBoxTSThisParameter(pos + 32); + thisParam !== null && params.unshift(thisParam); + node.key = deserializePropertyKey(pos + 8); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 24); + node.params = params; + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 48); + node.accessibility = null; + node.readonly = false; + node.static = false; + parent = previousParent; + return node; +} + +function deserializeTSConstructSignatureDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructSignatureDeclaration', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSIndexSignatureName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Identifier', + decorators: null, + name: deserializeStr(pos + 8), + optional: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.decorators = []; + node.optional = false; + node.typeAnnotation = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSInterfaceHeritage(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInterfaceHeritage', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicate(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypePredicate', + parameterName: null, + asserts: deserializeBool(pos + 32), + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.parameterName = deserializeTSTypePredicateName(pos + 8); + node.typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypePredicateName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeTSThisType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypePredicateName`); + } +} + +function deserializeTSModuleDeclaration(pos) { + let kind = deserializeTSModuleDeclarationKind(pos + 84), + global = kind === 'global', + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + declare = deserializeBool(pos + 85), + node, + previousParent = parent, + body = deserializeOptionTSModuleDeclarationBody(pos + 64); + if (body === null) { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + kind, + declare, + global, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeTSModuleDeclarationName(pos + 8); + } else { + node = parent = { + type: 'TSModuleDeclaration', + id: null, + body, + kind, + declare, + global, + start, + end, + range: [start, end], + parent, + }; + let id = deserializeTSModuleDeclarationName(pos + 8); + if (body.type === 'TSModuleBlock') { + node.id = id; + body.parent = node; + } else { + let innerId = body.id; + if (innerId.type === 'Identifier') { + let start, end; + id.parent = + innerId.parent = + node.id = + parent = + { + type: 'TSQualifiedName', + left: id, + right: innerId, + start: start = id.start, + end: end = innerId.end, + range: [start, end], + parent: node, + }; + } else { + // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of + // this module on left, and previous `left` of innermost `TSQualifiedName` on right + node.id = innerId; + innerId.parent = node; + let { start } = id; + for (;;) { + innerId.start = innerId.range[0] = start; + if (innerId.left.type === 'Identifier') break; + innerId = innerId.left; + } + let end, right = innerId.left; + id.parent = right.parent = innerId.left = { + type: 'TSQualifiedName', + left: id, + right, + start, + end: end = right.end, + range: [start, end], + parent: innerId, + }; + } + if (Object.hasOwn(body, 'body')) { + body = body.body; + node.body = body; + body.parent = node; + } else body = null; + } + } + parent = previousParent; + return node; +} + +function deserializeTSModuleDeclarationKind(pos) { + switch (uint8[pos]) { + case 0: + return 'global'; + case 1: + return 'module'; + case 2: + return 'namespace'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationKind`); + } +} + +function deserializeTSModuleDeclarationName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBindingIdentifier(pos + 8); + case 1: + return deserializeStringLiteral(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationName`); + } +} + +function deserializeTSModuleDeclarationBody(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxTSModuleDeclaration(pos + 8); + case 1: + return deserializeBoxTSModuleBlock(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleDeclarationBody`); + } +} + +function deserializeTSModuleBlock(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSModuleBlock', + body: null, + start, + end, + range: [start, end], + parent, + }, + body = deserializeVecDirective(pos + 8); + body.push(...deserializeVecStatement(pos + 32)); + node.body = body; + parent = previousParent; + return node; +} + +function deserializeTSTypeLiteral(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeLiteral', + members: null, + start, + end, + range: [start, end], + parent, + }; + node.members = deserializeVecTSSignature(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInferType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInferType', + typeParameter: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameter = deserializeBoxTSTypeParameter(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSTypeQuery(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeQuery', + exprName: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.exprName = deserializeTSTypeQueryExprName(pos + 8); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeQueryExprName(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSImportType(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSTypeQueryExprName`); + } +} + +function deserializeTSImportType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportType', + argument: null, + options: null, + qualifier: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.argument = deserializeTSType(pos + 8); + node.options = deserializeOptionBoxObjectExpression(pos + 24); + node.qualifier = deserializeOptionTSImportTypeQualifier(pos + 32); + node.typeArguments = deserializeOptionBoxTSTypeParameterInstantiation(pos + 48); + parent = previousParent; + return node; +} + +function deserializeTSImportTypeQualifier(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierName(pos + 8); + case 1: + return deserializeBoxTSImportTypeQualifiedName(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSImportTypeQualifier`); + } +} + +function deserializeTSImportTypeQualifiedName(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSQualifiedName', + left: null, + right: null, + start, + end, + range: [start, end], + parent, + }; + node.left = deserializeTSImportTypeQualifier(pos + 8); + node.right = deserializeIdentifierName(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSFunctionType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSFunctionType', + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }, + params = deserializeBoxFormalParameters(pos + 24), + thisParam = deserializeOptionBoxTSThisParameter(pos + 16); + thisParam !== null && params.unshift(thisParam); + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = params; + node.returnType = deserializeBoxTSTypeAnnotation(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSConstructorType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSConstructorType', + abstract: deserializeBool(pos + 32), + typeParameters: null, + params: null, + returnType: null, + start, + end, + range: [start, end], + parent, + }; + node.typeParameters = deserializeOptionBoxTSTypeParameterDeclaration(pos + 8); + node.params = deserializeBoxFormalParameters(pos + 16); + node.returnType = deserializeBoxTSTypeAnnotation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSMappedType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSMappedType', + key: null, + constraint: null, + nameType: null, + typeAnnotation: null, + optional: null, + readonly: deserializeOptionTSMappedTypeModifierOperator(pos + 53), + start, + end, + range: [start, end], + parent, + }, + typeParameter = deserializeBoxTSTypeParameter(pos + 8), + key = typeParameter.name; + key.parent = parent; + let { constraint } = typeParameter; + constraint !== null && (constraint.parent = parent); + let optional = deserializeOptionTSMappedTypeModifierOperator(pos + 52); + optional === null && (optional = false); + node.key = key; + node.constraint = constraint; + node.nameType = deserializeOptionTSType(pos + 16); + node.typeAnnotation = deserializeOptionTSType(pos + 32); + node.optional = optional; + parent = previousParent; + return node; +} + +function deserializeTSMappedTypeModifierOperator(pos) { + switch (uint8[pos]) { + case 0: + return true; + case 1: + return '+'; + case 2: + return '-'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSMappedTypeModifierOperator`); + } +} + +function deserializeTSTemplateLiteralType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTemplateLiteralType', + quasis: null, + types: null, + start, + end, + range: [start, end], + parent, + }; + node.quasis = deserializeVecTemplateElement(pos + 8); + node.types = deserializeVecTSType(pos + 32); + parent = previousParent; + return node; +} + +function deserializeTSAsExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSAsExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSSatisfiesExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSSatisfiesExpression', + expression: null, + typeAnnotation: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeAnnotation = deserializeTSType(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSTypeAssertion(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSTypeAssertion', + typeAnnotation: null, + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + node.expression = deserializeExpression(pos + 24); + parent = previousParent; + return node; +} + +function deserializeTSImportEqualsDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSImportEqualsDeclaration', + id: null, + moduleReference: null, + importKind: deserializeImportOrExportKind(pos + 56), + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeBindingIdentifier(pos + 8); + node.moduleReference = deserializeTSModuleReference(pos + 40); + parent = previousParent; + return node; +} + +function deserializeTSModuleReference(pos) { + switch (uint8[pos]) { + case 0: + return deserializeBoxIdentifierReference(pos + 8); + case 1: + return deserializeBoxTSQualifiedName(pos + 8); + case 2: + return deserializeBoxThisExpression(pos + 8); + case 3: + return deserializeBoxTSExternalModuleReference(pos + 8); + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for TSModuleReference`); + } +} + +function deserializeTSExternalModuleReference(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExternalModuleReference', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeStringLiteral(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNonNullExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNonNullExpression', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeDecorator(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'Decorator', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSExportAssignment(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSExportAssignment', + expression: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSNamespaceExportDeclaration(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSNamespaceExportDeclaration', + id: null, + start, + end, + range: [start, end], + parent, + }; + node.id = deserializeIdentifierName(pos + 8); + parent = previousParent; + return node; +} + +function deserializeTSInstantiationExpression(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSInstantiationExpression', + expression: null, + typeArguments: null, + start, + end, + range: [start, end], + parent, + }; + node.expression = deserializeExpression(pos + 8); + node.typeArguments = deserializeBoxTSTypeParameterInstantiation(pos + 24); + parent = previousParent; + return node; +} + +function deserializeImportOrExportKind(pos) { + switch (uint8[pos]) { + case 0: + return 'value'; + case 1: + return 'type'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportOrExportKind`); + } +} + +function deserializeJSDocNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocNonNullableType(pos) { + let start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type: 'TSJSDocNonNullableType', + typeAnnotation: null, + postfix: deserializeBool(pos + 24), + start, + end, + range: [start, end], + parent, + }; + node.typeAnnotation = deserializeTSType(pos + 8); + parent = previousParent; + return node; +} + +function deserializeJSDocUnknownType(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + type: 'TSJSDocUnknownType', + start, + end, + range: [start, end], + parent, + }; +} + +function deserializeCommentKind(pos) { + switch (uint8[pos]) { + case 0: + return 'Line'; + case 1: + return 'Block'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for CommentKind`); + } +} + +function deserializeComment(pos) { + let type = deserializeCommentKind(pos + 12), + start = deserializeU32(pos), + end = deserializeU32(pos + 4), + previousParent = parent, + node = parent = { + type, + value: null, + start, + end, + range: [start, end], + parent, + }, + endCut = type === 'Line' ? 0 : 2; + node.value = sourceText.slice(start + 2, end - endCut); + parent = previousParent; + return node; +} + +function deserializeNameSpan(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + value: deserializeStr(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeImportEntry(pos) { + return { + importName: deserializeImportImportName(pos + 32), + localName: deserializeNameSpan(pos + 64), + isType: deserializeBool(pos + 88), + }; +} + +function deserializeImportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + return { + kind: 'NamespaceObject', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 2: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + range: [start, end], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ImportImportName`); + } +} + +function deserializeExportEntry(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeOptionNameSpan(pos + 16), + importName: deserializeExportImportName(pos + 40), + exportName: deserializeExportExportName(pos + 72), + localName: deserializeExportLocalName(pos + 104), + isType: deserializeBool(pos + 136), + start, + end, + range: [start, end], + }; +} + +function deserializeExportImportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + return { + kind: 'All', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 2: + return { + kind: 'AllButDefault', + name: null, + start: null, + end: null, + range: [null, null], + }; + case 3: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportImportName`); + } +} + +function deserializeExportExportName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + var { start, end } = deserializeSpan(pos + 8); + return { + kind: 'Default', + name: null, + start, + end, + range: [start, end], + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportExportName`); + } +} + +function deserializeExportLocalName(pos) { + switch (uint8[pos]) { + case 0: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Name', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 1: + var nameSpan = deserializeNameSpan(pos + 8); + return { + kind: 'Default', + name: nameSpan.value, + start: nameSpan.start, + end: nameSpan.end, + range: nameSpan.range, + }; + case 2: + return { + kind: 'None', + name: null, + start: null, + end: null, + range: [null, null], + }; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ExportLocalName`); + } +} + +function deserializeDynamicImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeSpan(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeAssignmentOperator(pos) { + switch (uint8[pos]) { + case 0: + return '='; + case 1: + return '+='; + case 2: + return '-='; + case 3: + return '*='; + case 4: + return '/='; + case 5: + return '%='; + case 6: + return '**='; + case 7: + return '<<='; + case 8: + return '>>='; + case 9: + return '>>>='; + case 10: + return '|='; + case 11: + return '^='; + case 12: + return '&='; + case 13: + return '||='; + case 14: + return '&&='; + case 15: + return '??='; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for AssignmentOperator`); + } +} + +function deserializeBinaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '=='; + case 1: + return '!='; + case 2: + return '==='; + case 3: + return '!=='; + case 4: + return '<'; + case 5: + return '<='; + case 6: + return '>'; + case 7: + return '>='; + case 8: + return '+'; + case 9: + return '-'; + case 10: + return '*'; + case 11: + return '/'; + case 12: + return '%'; + case 13: + return '**'; + case 14: + return '<<'; + case 15: + return '>>'; + case 16: + return '>>>'; + case 17: + return '|'; + case 18: + return '^'; + case 19: + return '&'; + case 20: + return 'in'; + case 21: + return 'instanceof'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for BinaryOperator`); + } +} + +function deserializeLogicalOperator(pos) { + switch (uint8[pos]) { + case 0: + return '||'; + case 1: + return '&&'; + case 2: + return '??'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for LogicalOperator`); + } +} + +function deserializeUnaryOperator(pos) { + switch (uint8[pos]) { + case 0: + return '+'; + case 1: + return '-'; + case 2: + return '!'; + case 3: + return '~'; + case 4: + return 'typeof'; + case 5: + return 'void'; + case 6: + return 'delete'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UnaryOperator`); + } +} + +function deserializeUpdateOperator(pos) { + switch (uint8[pos]) { + case 0: + return '++'; + case 1: + return '--'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for UpdateOperator`); + } +} + +function deserializeSpan(pos) { + return { + start: deserializeU32(pos), + end: deserializeU32(pos + 4), + }; +} + +function deserializeModuleKind(pos) { + switch (uint8[pos]) { + case 0: + return 'script'; + case 1: + return 'module'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ModuleKind`); + } +} + +function deserializeRawTransferData(pos) { + return { + program: deserializeProgram(pos), + comments: deserializeVecComment(pos + 128), + module: deserializeEcmaScriptModule(pos + 152), + errors: deserializeVecError(pos + 256), + }; +} + +function deserializeError(pos) { + return { + severity: deserializeErrorSeverity(pos + 72), + message: deserializeStr(pos), + labels: deserializeVecErrorLabel(pos + 16), + helpMessage: deserializeOptionStr(pos + 40), + codeframe: deserializeStr(pos + 56), + }; +} + +function deserializeErrorSeverity(pos) { + switch (uint8[pos]) { + case 0: + return 'Error'; + case 1: + return 'Warning'; + case 2: + return 'Advice'; + default: + throw Error(`Unexpected discriminant ${uint8[pos]} for ErrorSeverity`); + } +} + +function deserializeErrorLabel(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + message: deserializeOptionStr(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeEcmaScriptModule(pos) { + return { + hasModuleSyntax: deserializeBool(pos + 96), + staticImports: deserializeVecStaticImport(pos), + staticExports: deserializeVecStaticExport(pos + 24), + dynamicImports: deserializeVecDynamicImport(pos + 48), + importMetas: deserializeVecSpan(pos + 72), + }; +} + +function deserializeStaticImport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + moduleRequest: deserializeNameSpan(pos + 8), + entries: deserializeVecImportEntry(pos + 32), + start, + end, + range: [start, end], + }; +} + +function deserializeStaticExport(pos) { + let start = deserializeU32(pos), end = deserializeU32(pos + 4); + return { + entries: deserializeVecExportEntry(pos + 8), + start, + end, + range: [start, end], + }; +} + +function deserializeU32(pos) { + return uint32[pos >> 2]; +} + +function deserializeU8(pos) { + return uint8[pos]; +} + +function deserializeStr(pos) { + let pos32 = pos >> 2, len = uint32[pos32 + 2]; + if (len === 0) return ''; + pos = uint32[pos32]; + if (sourceIsAscii && pos < sourceByteLen) return sourceText.substr(pos, len); + // Longer strings use `TextDecoder` + // TODO: Find best switch-over point + let end = pos + len; + if (len > 50) return decodeStr(uint8.subarray(pos, end)); + // Shorter strings decode by hand to avoid native call + let out = '', c; + do { + c = uint8[pos++]; + if (c < 128) out += fromCodePoint(c); + else { + out += decodeStr(uint8.subarray(pos - 1, end)); + break; + } + } while (pos < end); + return out; +} + +function deserializeVecComment(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeComment(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionHashbang(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeHashbang(pos); +} + +function deserializeVecDirective(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeDirective(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecStatement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeStatement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxBooleanLiteral(pos) { + return deserializeBooleanLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNullLiteral(pos) { + return deserializeNullLiteral(uint32[pos >> 2]); +} + +function deserializeBoxNumericLiteral(pos) { + return deserializeNumericLiteral(uint32[pos >> 2]); +} + +function deserializeBoxBigIntLiteral(pos) { + return deserializeBigIntLiteral(uint32[pos >> 2]); +} + +function deserializeBoxRegExpLiteral(pos) { + return deserializeRegExpLiteral(uint32[pos >> 2]); +} + +function deserializeBoxStringLiteral(pos) { + return deserializeStringLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTemplateLiteral(pos) { + return deserializeTemplateLiteral(uint32[pos >> 2]); +} + +function deserializeBoxIdentifierReference(pos) { + return deserializeIdentifierReference(uint32[pos >> 2]); +} + +function deserializeBoxMetaProperty(pos) { + return deserializeMetaProperty(uint32[pos >> 2]); +} + +function deserializeBoxSuper(pos) { + return deserializeSuper(uint32[pos >> 2]); +} + +function deserializeBoxArrayExpression(pos) { + return deserializeArrayExpression(uint32[pos >> 2]); +} + +function deserializeBoxArrowFunctionExpression(pos) { + return deserializeArrowFunctionExpression(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentExpression(pos) { + return deserializeAssignmentExpression(uint32[pos >> 2]); +} + +function deserializeBoxAwaitExpression(pos) { + return deserializeAwaitExpression(uint32[pos >> 2]); +} + +function deserializeBoxBinaryExpression(pos) { + return deserializeBinaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxCallExpression(pos) { + return deserializeCallExpression(uint32[pos >> 2]); +} + +function deserializeBoxChainExpression(pos) { + return deserializeChainExpression(uint32[pos >> 2]); +} + +function deserializeBoxClass(pos) { + return deserializeClass(uint32[pos >> 2]); +} + +function deserializeBoxConditionalExpression(pos) { + return deserializeConditionalExpression(uint32[pos >> 2]); +} + +function deserializeBoxFunction(pos) { + return deserializeFunction(uint32[pos >> 2]); +} + +function deserializeBoxImportExpression(pos) { + return deserializeImportExpression(uint32[pos >> 2]); +} + +function deserializeBoxLogicalExpression(pos) { + return deserializeLogicalExpression(uint32[pos >> 2]); +} + +function deserializeBoxNewExpression(pos) { + return deserializeNewExpression(uint32[pos >> 2]); +} + +function deserializeBoxObjectExpression(pos) { + return deserializeObjectExpression(uint32[pos >> 2]); +} + +function deserializeBoxParenthesizedExpression(pos) { + return deserializeParenthesizedExpression(uint32[pos >> 2]); +} + +function deserializeBoxSequenceExpression(pos) { + return deserializeSequenceExpression(uint32[pos >> 2]); +} + +function deserializeBoxTaggedTemplateExpression(pos) { + return deserializeTaggedTemplateExpression(uint32[pos >> 2]); +} + +function deserializeBoxThisExpression(pos) { + return deserializeThisExpression(uint32[pos >> 2]); +} + +function deserializeBoxUnaryExpression(pos) { + return deserializeUnaryExpression(uint32[pos >> 2]); +} + +function deserializeBoxUpdateExpression(pos) { + return deserializeUpdateExpression(uint32[pos >> 2]); +} + +function deserializeBoxYieldExpression(pos) { + return deserializeYieldExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateInExpression(pos) { + return deserializePrivateInExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXElement(pos) { + return deserializeJSXElement(uint32[pos >> 2]); +} + +function deserializeBoxJSXFragment(pos) { + return deserializeJSXFragment(uint32[pos >> 2]); +} + +function deserializeBoxTSAsExpression(pos) { + return deserializeTSAsExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSSatisfiesExpression(pos) { + return deserializeTSSatisfiesExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAssertion(pos) { + return deserializeTSTypeAssertion(uint32[pos >> 2]); +} + +function deserializeBoxTSNonNullExpression(pos) { + return deserializeTSNonNullExpression(uint32[pos >> 2]); +} + +function deserializeBoxTSInstantiationExpression(pos) { + return deserializeTSInstantiationExpression(uint32[pos >> 2]); +} + +function deserializeBoxV8IntrinsicExpression(pos) { + return deserializeV8IntrinsicExpression(uint32[pos >> 2]); +} + +function deserializeVecArrayExpressionElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArrayExpressionElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxSpreadElement(pos) { + return deserializeSpreadElement(uint32[pos >> 2]); +} + +function deserializeVecObjectPropertyKind(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeObjectPropertyKind(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxObjectProperty(pos) { + return deserializeObjectProperty(uint32[pos >> 2]); +} + +function deserializeBool(pos) { + return uint8[pos] === 1; +} + +function deserializeBoxIdentifierName(pos) { + return deserializeIdentifierName(uint32[pos >> 2]); +} + +function deserializeBoxPrivateIdentifier(pos) { + return deserializePrivateIdentifier(uint32[pos >> 2]); +} + +function deserializeVecTemplateElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeTemplateElement(pos)); + pos += 48; + } + return arr; +} + +function deserializeVecExpression(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeExpression(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSTypeParameterInstantiation(pos) { + return deserializeTSTypeParameterInstantiation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterInstantiation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterInstantiation(pos); +} + +function deserializeOptionStr(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeStr(pos); +} + +function deserializeBoxComputedMemberExpression(pos) { + return deserializeComputedMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxStaticMemberExpression(pos) { + return deserializeStaticMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxPrivateFieldExpression(pos) { + return deserializePrivateFieldExpression(uint32[pos >> 2]); +} + +function deserializeVecArgument(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeArgument(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxArrayAssignmentTarget(pos) { + return deserializeArrayAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeBoxObjectAssignmentTarget(pos) { + return deserializeObjectAssignmentTarget(uint32[pos >> 2]); +} + +function deserializeOptionAssignmentTargetMaybeDefault(pos) { + if (uint8[pos] === 51) return null; + return deserializeAssignmentTargetMaybeDefault(pos); +} + +function deserializeVecOptionAssignmentTargetMaybeDefault(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeOptionAssignmentTargetMaybeDefault(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetRest(pos) { + return deserializeAssignmentTargetRest(uint32[pos >> 2]); +} + +function deserializeOptionBoxAssignmentTargetRest(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxAssignmentTargetRest(pos); +} + +function deserializeVecAssignmentTargetProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeAssignmentTargetProperty(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxAssignmentTargetWithDefault(pos) { + return deserializeAssignmentTargetWithDefault(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyIdentifier(pos) { + return deserializeAssignmentTargetPropertyIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentTargetPropertyProperty(pos) { + return deserializeAssignmentTargetPropertyProperty(uint32[pos >> 2]); +} + +function deserializeOptionExpression(pos) { + if (uint8[pos] === 51) return null; + return deserializeExpression(pos); +} + +function deserializeBoxBlockStatement(pos) { + return deserializeBlockStatement(uint32[pos >> 2]); +} + +function deserializeBoxBreakStatement(pos) { + return deserializeBreakStatement(uint32[pos >> 2]); +} + +function deserializeBoxContinueStatement(pos) { + return deserializeContinueStatement(uint32[pos >> 2]); +} + +function deserializeBoxDebuggerStatement(pos) { + return deserializeDebuggerStatement(uint32[pos >> 2]); +} + +function deserializeBoxDoWhileStatement(pos) { + return deserializeDoWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxEmptyStatement(pos) { + return deserializeEmptyStatement(uint32[pos >> 2]); +} + +function deserializeBoxExpressionStatement(pos) { + return deserializeExpressionStatement(uint32[pos >> 2]); +} + +function deserializeBoxForInStatement(pos) { + return deserializeForInStatement(uint32[pos >> 2]); +} + +function deserializeBoxForOfStatement(pos) { + return deserializeForOfStatement(uint32[pos >> 2]); +} + +function deserializeBoxForStatement(pos) { + return deserializeForStatement(uint32[pos >> 2]); +} + +function deserializeBoxIfStatement(pos) { + return deserializeIfStatement(uint32[pos >> 2]); +} + +function deserializeBoxLabeledStatement(pos) { + return deserializeLabeledStatement(uint32[pos >> 2]); +} + +function deserializeBoxReturnStatement(pos) { + return deserializeReturnStatement(uint32[pos >> 2]); +} + +function deserializeBoxSwitchStatement(pos) { + return deserializeSwitchStatement(uint32[pos >> 2]); +} + +function deserializeBoxThrowStatement(pos) { + return deserializeThrowStatement(uint32[pos >> 2]); +} + +function deserializeBoxTryStatement(pos) { + return deserializeTryStatement(uint32[pos >> 2]); +} + +function deserializeBoxWhileStatement(pos) { + return deserializeWhileStatement(uint32[pos >> 2]); +} + +function deserializeBoxWithStatement(pos) { + return deserializeWithStatement(uint32[pos >> 2]); +} + +function deserializeBoxVariableDeclaration(pos) { + return deserializeVariableDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeAliasDeclaration(pos) { + return deserializeTSTypeAliasDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSInterfaceDeclaration(pos) { + return deserializeTSInterfaceDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSEnumDeclaration(pos) { + return deserializeTSEnumDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSModuleDeclaration(pos) { + return deserializeTSModuleDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSImportEqualsDeclaration(pos) { + return deserializeTSImportEqualsDeclaration(uint32[pos >> 2]); +} + +function deserializeVecVariableDeclarator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeVariableDeclarator(pos)); + pos += 64; + } + return arr; +} + +function deserializeOptionStatement(pos) { + if (uint8[pos] === 70) return null; + return deserializeStatement(pos); +} + +function deserializeOptionForStatementInit(pos) { + if (uint8[pos] === 65) return null; + return deserializeForStatementInit(pos); +} + +function deserializeOptionLabelIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeLabelIdentifier(pos); +} + +function deserializeVecSwitchCase(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 48; + for (; pos !== endPos;) { + arr.push(deserializeSwitchCase(pos)); + pos += 48; + } + return arr; +} + +function deserializeBoxCatchClause(pos) { + return deserializeCatchClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxCatchClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxCatchClause(pos); +} + +function deserializeOptionBoxBlockStatement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBlockStatement(pos); +} + +function deserializeOptionCatchParameter(pos) { + if (uint8[pos + 32] === 2) return null; + return deserializeCatchParameter(pos); +} + +function deserializeBoxTSTypeAnnotation(pos) { + return deserializeTSTypeAnnotation(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeAnnotation(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeAnnotation(pos); +} + +function deserializeBoxBindingIdentifier(pos) { + return deserializeBindingIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxObjectPattern(pos) { + return deserializeObjectPattern(uint32[pos >> 2]); +} + +function deserializeBoxArrayPattern(pos) { + return deserializeArrayPattern(uint32[pos >> 2]); +} + +function deserializeBoxAssignmentPattern(pos) { + return deserializeAssignmentPattern(uint32[pos >> 2]); +} + +function deserializeVecBindingProperty(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 64; + for (; pos !== endPos;) { + arr.push(deserializeBindingProperty(pos)); + pos += 64; + } + return arr; +} + +function deserializeBoxBindingRestElement(pos) { + return deserializeBindingRestElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxBindingRestElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxBindingRestElement(pos); +} + +function deserializeOptionBindingPattern(pos) { + if (uint8[pos + 24] === 2) return null; + return deserializeBindingPattern(pos); +} + +function deserializeVecOptionBindingPattern(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeOptionBindingPattern(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionBindingIdentifier(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeBindingIdentifier(pos); +} + +function deserializeBoxTSTypeParameterDeclaration(pos) { + return deserializeTSTypeParameterDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSTypeParameterDeclaration(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSTypeParameterDeclaration(pos); +} + +function deserializeBoxTSThisParameter(pos) { + return deserializeTSThisParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxTSThisParameter(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxTSThisParameter(pos); +} + +function deserializeBoxFormalParameters(pos) { + return deserializeFormalParameters(uint32[pos >> 2]); +} + +function deserializeBoxFunctionBody(pos) { + return deserializeFunctionBody(uint32[pos >> 2]); +} + +function deserializeOptionBoxFunctionBody(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxFunctionBody(pos); +} + +function deserializeVecFormalParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 72; + for (; pos !== endPos;) { + arr.push(deserializeFormalParameter(pos)); + pos += 72; + } + return arr; +} + +function deserializeVecDecorator(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeDecorator(pos)); + pos += 24; + } + return arr; +} + +function deserializeOptionTSAccessibility(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSAccessibility(pos); +} + +function deserializeVecTSClassImplements(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSClassImplements(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxClassBody(pos) { + return deserializeClassBody(uint32[pos >> 2]); +} + +function deserializeVecClassElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeClassElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxStaticBlock(pos) { + return deserializeStaticBlock(uint32[pos >> 2]); +} + +function deserializeBoxMethodDefinition(pos) { + return deserializeMethodDefinition(uint32[pos >> 2]); +} + +function deserializeBoxPropertyDefinition(pos) { + return deserializePropertyDefinition(uint32[pos >> 2]); +} + +function deserializeBoxAccessorProperty(pos) { + return deserializeAccessorProperty(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexSignature(pos) { + return deserializeTSIndexSignature(uint32[pos >> 2]); +} + +function deserializeBoxImportDeclaration(pos) { + return deserializeImportDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportAllDeclaration(pos) { + return deserializeExportAllDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportDefaultDeclaration(pos) { + return deserializeExportDefaultDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxExportNamedDeclaration(pos) { + return deserializeExportNamedDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSExportAssignment(pos) { + return deserializeTSExportAssignment(uint32[pos >> 2]); +} + +function deserializeBoxTSNamespaceExportDeclaration(pos) { + return deserializeTSNamespaceExportDeclaration(uint32[pos >> 2]); +} + +function deserializeOptionImportPhase(pos) { + if (uint8[pos] === 2) return null; + return deserializeImportPhase(pos); +} + +function deserializeVecImportDeclarationSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeImportDeclarationSpecifier(pos)); + pos += 16; + } + return arr; +} + +function deserializeOptionVecImportDeclarationSpecifier(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeVecImportDeclarationSpecifier(pos); +} + +function deserializeBoxWithClause(pos) { + return deserializeWithClause(uint32[pos >> 2]); +} + +function deserializeOptionBoxWithClause(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxWithClause(pos); +} + +function deserializeBoxImportSpecifier(pos) { + return deserializeImportSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportDefaultSpecifier(pos) { + return deserializeImportDefaultSpecifier(uint32[pos >> 2]); +} + +function deserializeBoxImportNamespaceSpecifier(pos) { + return deserializeImportNamespaceSpecifier(uint32[pos >> 2]); +} + +function deserializeVecImportAttribute(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 112; + for (; pos !== endPos;) { + arr.push(deserializeImportAttribute(pos)); + pos += 112; + } + return arr; +} + +function deserializeOptionDeclaration(pos) { + if (uint8[pos] === 31) return null; + return deserializeDeclaration(pos); +} + +function deserializeVecExportSpecifier(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 128; + for (; pos !== endPos;) { + arr.push(deserializeExportSpecifier(pos)); + pos += 128; + } + return arr; +} + +function deserializeOptionStringLiteral(pos) { + if (uint8[pos + 40] === 2) return null; + return deserializeStringLiteral(pos); +} + +function deserializeOptionModuleExportName(pos) { + if (uint8[pos] === 3) return null; + return deserializeModuleExportName(pos); +} + +function deserializeF64(pos) { + return float64[pos >> 3]; +} + +function deserializeBoxJSXOpeningElement(pos) { + return deserializeJSXOpeningElement(uint32[pos >> 2]); +} + +function deserializeVecJSXChild(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXChild(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXClosingElement(pos) { + return deserializeJSXClosingElement(uint32[pos >> 2]); +} + +function deserializeOptionBoxJSXClosingElement(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxJSXClosingElement(pos); +} + +function deserializeVecJSXAttributeItem(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeJSXAttributeItem(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxJSXIdentifier(pos) { + return deserializeJSXIdentifier(uint32[pos >> 2]); +} + +function deserializeBoxJSXNamespacedName(pos) { + return deserializeJSXNamespacedName(uint32[pos >> 2]); +} + +function deserializeBoxJSXMemberExpression(pos) { + return deserializeJSXMemberExpression(uint32[pos >> 2]); +} + +function deserializeBoxJSXAttribute(pos) { + return deserializeJSXAttribute(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadAttribute(pos) { + return deserializeJSXSpreadAttribute(uint32[pos >> 2]); +} + +function deserializeOptionJSXAttributeValue(pos) { + if (uint8[pos] === 4) return null; + return deserializeJSXAttributeValue(pos); +} + +function deserializeBoxJSXExpressionContainer(pos) { + return deserializeJSXExpressionContainer(uint32[pos >> 2]); +} + +function deserializeBoxJSXText(pos) { + return deserializeJSXText(uint32[pos >> 2]); +} + +function deserializeBoxJSXSpreadChild(pos) { + return deserializeJSXSpreadChild(uint32[pos >> 2]); +} + +function deserializeVecTSEnumMember(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 40; + for (; pos !== endPos;) { + arr.push(deserializeTSEnumMember(pos)); + pos += 40; + } + return arr; +} + +function deserializeBoxTSAnyKeyword(pos) { + return deserializeTSAnyKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBigIntKeyword(pos) { + return deserializeTSBigIntKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSBooleanKeyword(pos) { + return deserializeTSBooleanKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSIntrinsicKeyword(pos) { + return deserializeTSIntrinsicKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNeverKeyword(pos) { + return deserializeTSNeverKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNullKeyword(pos) { + return deserializeTSNullKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSNumberKeyword(pos) { + return deserializeTSNumberKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSObjectKeyword(pos) { + return deserializeTSObjectKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSStringKeyword(pos) { + return deserializeTSStringKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSSymbolKeyword(pos) { + return deserializeTSSymbolKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUndefinedKeyword(pos) { + return deserializeTSUndefinedKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSUnknownKeyword(pos) { + return deserializeTSUnknownKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSVoidKeyword(pos) { + return deserializeTSVoidKeyword(uint32[pos >> 2]); +} + +function deserializeBoxTSArrayType(pos) { + return deserializeTSArrayType(uint32[pos >> 2]); +} + +function deserializeBoxTSConditionalType(pos) { + return deserializeTSConditionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructorType(pos) { + return deserializeTSConstructorType(uint32[pos >> 2]); +} + +function deserializeBoxTSFunctionType(pos) { + return deserializeTSFunctionType(uint32[pos >> 2]); +} + +function deserializeBoxTSImportType(pos) { + return deserializeTSImportType(uint32[pos >> 2]); +} + +function deserializeBoxTSIndexedAccessType(pos) { + return deserializeTSIndexedAccessType(uint32[pos >> 2]); +} + +function deserializeBoxTSInferType(pos) { + return deserializeTSInferType(uint32[pos >> 2]); +} + +function deserializeBoxTSIntersectionType(pos) { + return deserializeTSIntersectionType(uint32[pos >> 2]); +} + +function deserializeBoxTSLiteralType(pos) { + return deserializeTSLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSMappedType(pos) { + return deserializeTSMappedType(uint32[pos >> 2]); +} + +function deserializeBoxTSNamedTupleMember(pos) { + return deserializeTSNamedTupleMember(uint32[pos >> 2]); +} + +function deserializeBoxTSTemplateLiteralType(pos) { + return deserializeTSTemplateLiteralType(uint32[pos >> 2]); +} + +function deserializeBoxTSThisType(pos) { + return deserializeTSThisType(uint32[pos >> 2]); +} + +function deserializeBoxTSTupleType(pos) { + return deserializeTSTupleType(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeLiteral(pos) { + return deserializeTSTypeLiteral(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeOperator(pos) { + return deserializeTSTypeOperator(uint32[pos >> 2]); +} + +function deserializeBoxTSTypePredicate(pos) { + return deserializeTSTypePredicate(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeQuery(pos) { + return deserializeTSTypeQuery(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeReference(pos) { + return deserializeTSTypeReference(uint32[pos >> 2]); +} + +function deserializeBoxTSUnionType(pos) { + return deserializeTSUnionType(uint32[pos >> 2]); +} + +function deserializeBoxTSParenthesizedType(pos) { + return deserializeTSParenthesizedType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNullableType(pos) { + return deserializeJSDocNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocNonNullableType(pos) { + return deserializeJSDocNonNullableType(uint32[pos >> 2]); +} + +function deserializeBoxJSDocUnknownType(pos) { + return deserializeJSDocUnknownType(uint32[pos >> 2]); +} + +function deserializeVecTSType(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSType(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecTSTupleElement(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSTupleElement(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSOptionalType(pos) { + return deserializeTSOptionalType(uint32[pos >> 2]); +} + +function deserializeBoxTSRestType(pos) { + return deserializeTSRestType(uint32[pos >> 2]); +} + +function deserializeBoxTSQualifiedName(pos) { + return deserializeTSQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSType(pos) { + if (uint8[pos] === 38) return null; + return deserializeTSType(pos); +} + +function deserializeVecTSTypeParameter(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeTSTypeParameter(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecTSInterfaceHeritage(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSInterfaceHeritage(pos)); + pos += 32; + } + return arr; +} + +function deserializeBoxTSInterfaceBody(pos) { + return deserializeTSInterfaceBody(uint32[pos >> 2]); +} + +function deserializeVecTSSignature(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeTSSignature(pos)); + pos += 16; + } + return arr; +} + +function deserializeBoxTSPropertySignature(pos) { + return deserializeTSPropertySignature(uint32[pos >> 2]); +} + +function deserializeBoxTSCallSignatureDeclaration(pos) { + return deserializeTSCallSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSConstructSignatureDeclaration(pos) { + return deserializeTSConstructSignatureDeclaration(uint32[pos >> 2]); +} + +function deserializeBoxTSMethodSignature(pos) { + return deserializeTSMethodSignature(uint32[pos >> 2]); +} + +function deserializeVecTSIndexSignatureName(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeTSIndexSignatureName(pos)); + pos += 32; + } + return arr; +} + +function deserializeOptionTSModuleDeclarationBody(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSModuleDeclarationBody(pos); +} + +function deserializeBoxTSModuleBlock(pos) { + return deserializeTSModuleBlock(uint32[pos >> 2]); +} + +function deserializeBoxTSTypeParameter(pos) { + return deserializeTSTypeParameter(uint32[pos >> 2]); +} + +function deserializeOptionBoxObjectExpression(pos) { + if (uint32[pos >> 2] === 0 && uint32[pos + 4 >> 2] === 0) return null; + return deserializeBoxObjectExpression(pos); +} + +function deserializeOptionTSImportTypeQualifier(pos) { + if (uint8[pos] === 2) return null; + return deserializeTSImportTypeQualifier(pos); +} + +function deserializeBoxTSImportTypeQualifiedName(pos) { + return deserializeTSImportTypeQualifiedName(uint32[pos >> 2]); +} + +function deserializeOptionTSMappedTypeModifierOperator(pos) { + if (uint8[pos] === 3) return null; + return deserializeTSMappedTypeModifierOperator(pos); +} + +function deserializeBoxTSExternalModuleReference(pos) { + return deserializeTSExternalModuleReference(uint32[pos >> 2]); +} + +function deserializeOptionNameSpan(pos) { + if (uint32[pos + 8 >> 2] === 0 && uint32[pos + 12 >> 2] === 0) return null; + return deserializeNameSpan(pos); +} + +function deserializeVecError(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 80; + for (; pos !== endPos;) { + arr.push(deserializeError(pos)); + pos += 80; + } + return arr; +} + +function deserializeVecErrorLabel(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 24; + for (; pos !== endPos;) { + arr.push(deserializeErrorLabel(pos)); + pos += 24; + } + return arr; +} + +function deserializeVecStaticImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 56; + for (; pos !== endPos;) { + arr.push(deserializeStaticImport(pos)); + pos += 56; + } + return arr; +} + +function deserializeVecStaticExport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 32; + for (; pos !== endPos;) { + arr.push(deserializeStaticExport(pos)); + pos += 32; + } + return arr; +} + +function deserializeVecDynamicImport(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 16; + for (; pos !== endPos;) { + arr.push(deserializeDynamicImport(pos)); + pos += 16; + } + return arr; +} + +function deserializeVecSpan(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 8; + for (; pos !== endPos;) { + arr.push(deserializeSpan(pos)); + pos += 8; + } + return arr; +} + +function deserializeVecImportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 96; + for (; pos !== endPos;) { + arr.push(deserializeImportEntry(pos)); + pos += 96; + } + return arr; +} + +function deserializeVecExportEntry(pos) { + let arr = [], pos32 = pos >> 2; + pos = uint32[pos32]; + let endPos = pos + uint32[pos32 + 2] * 144; + for (; pos !== endPos;) { + arr.push(deserializeExportEntry(pos)); + pos += 144; + } + return arr; +} diff --git a/napi/parser/src-js/raw-transfer/common.js b/napi/parser/src-js/raw-transfer/common.js index c4ef8522af017..fe0151104cc2a 100644 --- a/napi/parser/src-js/raw-transfer/common.js +++ b/napi/parser/src-js/raw-transfer/common.js @@ -35,7 +35,7 @@ if (!rawTransferSupported()) { export function parseSyncRawImpl(filename, sourceText, options, convert) { const { buffer, sourceByteLen } = prepareRaw(sourceText); parseSyncRawBinding(filename, buffer, sourceByteLen, options); - return convert(buffer, sourceText, sourceByteLen, !!options.range); + return convert(buffer, sourceText, sourceByteLen, options); } // User should not schedule more async tasks than there are available CPUs, as it hurts performance, @@ -115,7 +115,7 @@ export async function parseAsyncRawImpl(filename, sourceText, options, convert) // Parse const { buffer, sourceByteLen } = prepareRaw(sourceText); await parseAsyncRawBinding(filename, buffer, sourceByteLen, options); - const data = convert(buffer, sourceText, sourceByteLen, !!options.range); + const data = convert(buffer, sourceText, sourceByteLen, options); // Free the CPU core if (queue.length > 0) { diff --git a/napi/parser/src-js/raw-transfer/eager.js b/napi/parser/src-js/raw-transfer/eager.js index 0c62eb185b3eb..f09a6d19538aa 100644 --- a/napi/parser/src-js/raw-transfer/eager.js +++ b/napi/parser/src-js/raw-transfer/eager.js @@ -43,9 +43,18 @@ export function parseAsyncRaw(filename, sourceText, options) { // Deserializers are large files, so lazy-loaded. // `deserialize` functions are stored in this array once loaded. -// Index into these arrays is `isJs * 1 + range * 2`. -const deserializers = [null, null, null, null]; -const deserializerNames = ['ts', 'js', 'ts_range', 'js_range']; +// Index into these arrays is `isJs * 1 + range * 2 + experimentalParent * 4`. +const deserializers = [null, null, null, null, null, null, null, null]; +const deserializerNames = [ + 'ts', + 'js', + 'ts_range', + 'js_range', + 'ts_parent', + 'js_parent', + 'ts_range_parent', + 'js_range_parent', +]; /** * Deserialize whole AST from buffer. @@ -53,14 +62,16 @@ const deserializerNames = ['ts', 'js', 'ts_range', 'js_range']; * @param {Uint8Array} buffer - Buffer containing AST in raw form * @param {string} sourceText - Source for the file * @param {number} sourceByteLen - Length of source text in UTF-8 bytes - * @param {boolean} range - `true` if AST should contain `range` fields + * @param {Object} options - Parsing options * @returns {Object} - Object with property getters for `program`, `module`, `comments`, and `errors` */ -function deserialize(buffer, sourceText, sourceByteLen, range) { - const isJs = isJsAst(buffer); +function deserialize(buffer, sourceText, sourceByteLen, options) { + const isJs = isJsAst(buffer), + range = !!options.range, + parent = !!options.experimentalParent; // Lazy load deserializer, and deserialize buffer to JS objects - const deserializerIndex = (+isJs) | ((+range) << 1); + const deserializerIndex = (+isJs) | ((+range) << 1) | ((+parent) << 2); let deserializeThis = deserializers[deserializerIndex]; if (deserializeThis === null) { deserializeThis = deserializers[deserializerIndex] = require( diff --git a/napi/parser/src-js/raw-transfer/lazy.js b/napi/parser/src-js/raw-transfer/lazy.js index d14dc899f5dc9..475c0514c31fb 100644 --- a/napi/parser/src-js/raw-transfer/lazy.js +++ b/napi/parser/src-js/raw-transfer/lazy.js @@ -87,10 +87,11 @@ const bufferRecycleRegistry = typeof FinalizationRegistry === 'undefined' * @param {Uint8Array} buffer - Buffer containing AST in raw form * @param {string} sourceText - Source for the file * @param {number} sourceByteLen - Length of source text in UTF-8 bytes + * @param {Object} _options - Parsing options * @returns {Object} - Object with property getters for `program`, `module`, `comments`, and `errors`, * and `dispose` and `visit` methods */ -function construct(buffer, sourceText, sourceByteLen) { +function construct(buffer, sourceText, sourceByteLen, _options) { // Create AST object const sourceIsAscii = sourceText.length === sourceByteLen; const ast = { buffer, sourceText, sourceByteLen, sourceIsAscii, nodes: new Map(), token: TOKEN }; diff --git a/napi/parser/test/parse-raw-common.js b/napi/parser/test/parse-raw-common.js index 1e7938f598833..8551f1cd57e36 100644 --- a/napi/parser/test/parse-raw-common.js +++ b/napi/parser/test/parse-raw-common.js @@ -9,8 +9,9 @@ export const TEST_TYPE_FIXTURE = 3; export const TEST_TYPE_INLINE_FIXTURE = 4; export const TEST_TYPE_MAIN_MASK = 7; -export const TEST_TYPE_LAZY = 8; -export const TEST_TYPE_PRETTY = 16; +export const TEST_TYPE_RANGE_PARENT = 8; +export const TEST_TYPE_LAZY = 16; +export const TEST_TYPE_PRETTY = 32; export const ROOT_DIR_PATH = pathJoin(import.meta.dirname, '../../..'); export const TARGET_DIR_PATH = pathJoin(ROOT_DIR_PATH, 'target'); diff --git a/napi/parser/test/parse-raw-worker.js b/napi/parser/test/parse-raw-worker.js index 93f505c7ff5d2..e07c2cb8f8d41 100644 --- a/napi/parser/test/parse-raw-worker.js +++ b/napi/parser/test/parse-raw-worker.js @@ -15,6 +15,7 @@ import { TEST_TYPE_LAZY, TEST_TYPE_MAIN_MASK, TEST_TYPE_PRETTY, + TEST_TYPE_RANGE_PARENT, TEST_TYPE_TEST262, TEST_TYPE_TS, TS_DIR_PATH, @@ -22,6 +23,9 @@ import { } from './parse-raw-common.js'; import { makeUnitsFromTest } from './typescript-make-units-from-test.js'; +const { hasOwn } = Object, + { isArray } = Array; + // Run test case and return whether it passes. // This is the entry point when run as a worker. export default async function(data) { @@ -37,25 +41,26 @@ export default async function(data) { // If test fails, will throw an error. // Can be called from main thread. export async function runCase({ type, props }, expect) { - const lazy = (type & TEST_TYPE_LAZY) !== 0, + const rangeParent = (type & TEST_TYPE_RANGE_PARENT) !== 0, + lazy = (type & TEST_TYPE_LAZY) !== 0, pretty = (type & TEST_TYPE_PRETTY) !== 0; type &= TEST_TYPE_MAIN_MASK; switch (type) { case TEST_TYPE_TEST262: - await runTest262Case(props, lazy, expect); + await runTest262Case(props, rangeParent, lazy, expect); break; case TEST_TYPE_JSX: - await runJsxCase(props, lazy, expect); + await runJsxCase(props, rangeParent, lazy, expect); break; case TEST_TYPE_TS: - await runTsCase(props, lazy, expect); + await runTsCase(props, rangeParent, lazy, expect); break; case TEST_TYPE_FIXTURE: - await runFixture(props, lazy, pretty, expect); + await runFixture(props, rangeParent, lazy, pretty, expect); break; case TEST_TYPE_INLINE_FIXTURE: - await runInlineFixture(props, lazy, pretty, expect); + await runInlineFixture(props, rangeParent, lazy, pretty, expect); break; default: throw new Error('Unexpected test type'); @@ -63,7 +68,7 @@ export async function runCase({ type, props }, expect) { } // Run Test262 test case -async function runTest262Case(path, lazy, expect) { +async function runTest262Case(path, rangeParent, lazy, expect) { const filename = basename(path); const [sourceText, acornJson] = await Promise.all([ readFile(pathJoin(TEST262_DIR_PATH, path), 'utf8'), @@ -72,6 +77,10 @@ async function runTest262Case(path, lazy, expect) { const sourceType = getSourceTypeFromJSON(acornJson); + if (rangeParent) { + testRangeParent(filename, sourceText, { sourceType }, expect); + return; + } if (lazy) { testLazy(filename, sourceText, { sourceType }); return; @@ -84,7 +93,7 @@ async function runTest262Case(path, lazy, expect) { } // Run JSX test case -async function runJsxCase(filename, lazy, expect) { +async function runJsxCase(filename, rangeParent, lazy, expect) { const sourcePath = pathJoin(JSX_DIR_PATH, filename), jsonPath = sourcePath.slice(0, -1) + 'on'; // `.jsx` -> `.json` const [sourceText, acornJson] = await Promise.all([ @@ -94,6 +103,10 @@ async function runJsxCase(filename, lazy, expect) { const sourceType = getSourceTypeFromJSON(acornJson); + if (rangeParent) { + testRangeParent(filename, sourceText, { sourceType }, expect); + return; + } if (lazy) { testLazy(filename, sourceText, { sourceType }); return; @@ -110,7 +123,7 @@ const TS_CASE_HEADER = '__ESTREE_TEST__:PASS:\n```json\n'; const TS_CASE_FOOTER = '\n```\n'; const TS_CASE_FOOTER_LEN = TS_CASE_FOOTER.length; -async function runTsCase(path, lazy, expect) { +async function runTsCase(path, rangeParent, lazy, expect) { const tsPath = path.slice(0, -3); // Trim off `.md` let [sourceText, casesJson] = await Promise.all([ readFile(pathJoin(TS_DIR_PATH, tsPath), 'utf8'), @@ -136,6 +149,10 @@ async function runTsCase(path, lazy, expect) { experimentalRawTransfer: true, }; + if (rangeParent) { + testRangeParent(filename, sourceText, options, expect); + continue; + } if (lazy) { testLazy(filename, sourceText, options); continue; @@ -168,26 +185,81 @@ async function runTsCase(path, lazy, expect) { } // Test raw transfer output matches standard (via JSON) output for a fixture file -async function runFixture(path, lazy, pretty, expect) { +async function runFixture(path, rangeParent, lazy, pretty, expect) { const filename = basename(path); const sourceText = await readFile(pathJoin(ROOT_DIR_PATH, path), 'utf8'); - if (lazy) { - testLazy(filename, sourceText); + if (rangeParent) { + testRangeParent(filename, sourceText, null, expect); + } else if (lazy) { + testLazy(filename, sourceText, null); } else { assertRawAndStandardMatch(filename, sourceText, pretty, expect); } } // Test raw transfer output matches standard (via JSON) output for a fixture, with provided source text -async function runInlineFixture({ filename, sourceText }, lazy, pretty, expect) { - if (lazy) { - testLazy(filename, sourceText); +async function runInlineFixture({ filename, sourceText }, rangeParent, lazy, pretty, expect) { + if (rangeParent) { + testRangeParent(filename, sourceText, null, expect); + } else if (lazy) { + testLazy(filename, sourceText, null); } else { assertRawAndStandardMatch(filename, sourceText, pretty, expect); } } +// Test `range` and `parent` fields are correct on all AST nodes. +function testRangeParent(filename, sourceText, options, expect) { + // @ts-ignore + const ret = parseSync(filename, sourceText, { + ...options, + range: true, + experimentalRawTransfer: true, + experimentalParent: true, + }); + + let parent = null; + function walk(node) { + if (node === null || typeof node !== 'object') return; + + if (isArray(node)) { + for (const child of node) { + walk(child); + } + return; + } + + // Check `range` + if (hasOwn(node, 'start')) { + const { range } = node; + expect(isArray(range)).toBe(true); + expect(range.length).toBe(2); + expect(range[0]).toBe(node.start); + expect(range[1]).toBe(node.end); + } + + // Check `parent` + let previousParent = parent; + const isNode = hasOwn(node, 'type'); + if (isNode) { + expect(node.parent).toBe(parent); + parent = node; + } + + // Walk children + for (const key in node) { + if (!hasOwn(node, key)) continue; + if (key === 'type' || key === 'start' || key === 'end' || key === 'range' || key === 'parent') continue; + walk(node[key]); + } + + if (isNode) parent = previousParent; + } + + walk(ret.program); +} + // Test lazy deserialization does not throw an error. // We don't test the correctness of the output. function testLazy(filename, sourceText, options) { @@ -296,12 +368,11 @@ function removeNullProperties(obj) { } // Very simple `expect` implementation. -// Only supports `expect(x).toEqual(y)`, and uses only a simple `===` comparison. +// Only supports `expect(x).toEqual(y)` and `expect(x).toBe(y)`, and both use only a simple `===` comparison. // Therefore, only works for primitive values e.g. strings. function simpleExpect(value) { - return { - toEqual(expected) { - if (value !== expected) throw new Error('Mismatch'); - }, + const toBe = (expected) => { + if (value !== expected) throw new Error('Mismatch'); }; + return { toEqual: toBe, toBe }; } diff --git a/napi/parser/test/parse-raw.test.ts b/napi/parser/test/parse-raw.test.ts index a667b47956dc6..4d1ccd24ea240 100644 --- a/napi/parser/test/parse-raw.test.ts +++ b/napi/parser/test/parse-raw.test.ts @@ -21,6 +21,7 @@ import { TEST_TYPE_JSX, TEST_TYPE_LAZY, TEST_TYPE_PRETTY, + TEST_TYPE_RANGE_PARENT, TEST_TYPE_TEST262, TEST_TYPE_TS, TS_ESTREE_DIR_PATH, @@ -28,7 +29,14 @@ import { TS_SNAPSHOT_PATH, } from './parse-raw-common.js'; -const [describeLazy, itLazy] = process.env.RUN_LAZY_TESTS === 'true' +const { env } = process; +const isEnabled = envValue => envValue === 'true' || envValue === '1'; + +const [describeRangeParent, itRangeParent] = isEnabled(env.RUN_RAW_RANGE_TESTS) + ? [describe, it] + : (noop => [noop, noop])(Object.assign(() => {}, { concurrent() {} })); + +const [describeLazy, itLazy] = isEnabled(env.RUN_LAZY_TESTS) ? [describe, it] : (noop => [noop, noop])(Object.assign(() => {}, { concurrent() {} })); @@ -103,6 +111,11 @@ describe.concurrent('test262', () => { it.each(test262FixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_TEST262, path)); }); +describeRangeParent.concurrent('range & parent test262', () => { + // oxlint-disable-next-line jest/expect-expect + it.each(test262FixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_TEST262 | TEST_TYPE_RANGE_PARENT, path)); +}); + // Check lazy deserialization doesn't throw describeLazy.concurrent('lazy test262', () => { // oxlint-disable-next-line jest/expect-expect @@ -122,6 +135,11 @@ describe.concurrent('JSX', () => { it.each(jsxFixturePaths)('%s', filename => runCaseInWorker(TEST_TYPE_JSX, filename)); }); +describeRangeParent.concurrent('range & parent JSX', () => { + // oxlint-disable-next-line jest/expect-expect + it.each(jsxFixturePaths)('%s', filename => runCaseInWorker(TEST_TYPE_JSX | TEST_TYPE_RANGE_PARENT, filename)); +}); + // Check lazy deserialization doesn't throw describeLazy.concurrent('lazy JSX', () => { // oxlint-disable-next-line jest/expect-expect @@ -145,6 +163,11 @@ describe.concurrent('TypeScript', () => { it.each(tsFixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_TS, path)); }); +describeRangeParent.concurrent('range & parent TypeScript', () => { + // oxlint-disable-next-line jest/expect-expect + it.each(tsFixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_TS | TEST_TYPE_RANGE_PARENT, path)); +}); + // Check lazy deserialization doesn't throw describeLazy.concurrent('lazy TypeScript', () => { // oxlint-disable-next-line jest/expect-expect @@ -176,12 +199,21 @@ describe.concurrent('edge cases', () => { // oxlint-disable-next-line jest/expect-expect it('TS', () => runCaseInWorker(TEST_TYPE_INLINE_FIXTURE, { filename: 'dummy.ts', sourceText })); + itRangeParent( + 'JS range & parent', + () => runCaseInWorker(TEST_TYPE_INLINE_FIXTURE | TEST_TYPE_RANGE_PARENT, { filename: 'dummy.js', sourceText }), + ); + itRangeParent( + 'TS range & parent', + () => runCaseInWorker(TEST_TYPE_INLINE_FIXTURE | TEST_TYPE_RANGE_PARENT, { filename: 'dummy.ts', sourceText }), + ); + itLazy( - 'JS', + 'JS lazy', () => runCaseInWorker(TEST_TYPE_INLINE_FIXTURE | TEST_TYPE_LAZY, { filename: 'dummy.js', sourceText }), ); itLazy( - 'TS', + 'TS lazy', () => runCaseInWorker(TEST_TYPE_INLINE_FIXTURE | TEST_TYPE_LAZY, { filename: 'dummy.ts', sourceText }), ); }); @@ -193,6 +225,11 @@ describe.concurrent('fixtures', () => { it.each(benchFixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_FIXTURE, path)); }); +describeRangeParent.concurrent('range & parent fixtures', () => { + // oxlint-disable-next-line jest/expect-expect + it.each(benchFixturePaths)('%s', path => runCaseInWorker(TEST_TYPE_FIXTURE | TEST_TYPE_RANGE_PARENT, path)); +}); + // Check lazy deserialization doesn't throw describeLazy.concurrent('lazy fixtures', () => { // oxlint-disable-next-line jest/expect-expect @@ -384,3 +421,73 @@ describe.concurrent('`range` option', () => { }); }); }); + +describe.concurrent('`experimentalParent` option', () => { + describe.concurrent('should not include `parent` fields when false', () => { + it.concurrent('JS', async () => { + const code = 'let x = 1;'; + + // @ts-ignore + let ret = parseSync('test.js', code, { experimentalRawTransfer: true, experimentalParent: false }); + expect(ret.errors.length).toBe(0); + const { program } = ret; + expect(program).not.toHaveProperty('parent'); + const stmt = ret.program.body[0] as VariableDeclaration; + expect(stmt).not.toHaveProperty('parent'); + const declaration = stmt.declarations[0]; + expect(declaration).not.toHaveProperty('parent'); + expect(declaration.id).not.toHaveProperty('parent'); + expect(declaration.init).not.toHaveProperty('parent'); + }); + + it.concurrent('TS', async () => { + const code = 'let x = 1;'; + + // @ts-ignore + let ret = parseSync('test.ts', code, { experimentalRawTransfer: true, experimentalParent: false }); + expect(ret.errors.length).toBe(0); + const { program } = ret; + expect(program).not.toHaveProperty('parent'); + const stmt = ret.program.body[0] as VariableDeclaration; + expect(stmt).not.toHaveProperty('parent'); + const declaration = stmt.declarations[0]; + expect(declaration).not.toHaveProperty('parent'); + expect(declaration.id).not.toHaveProperty('parent'); + expect(declaration.init).not.toHaveProperty('parent'); + }); + }); + + describe.concurrent('should include `parent` fields when true', () => { + it.concurrent('JS', async () => { + const code = 'let x = 1;'; + + // @ts-ignore + let ret = parseSync('test.js', code, { experimentalRawTransfer: true, experimentalParent: true }); + expect(ret.errors.length).toBe(0); + const { program } = ret; + expect(program.parent).toBe(null); + const stmt = ret.program.body[0] as VariableDeclaration; + expect(stmt.parent).toBe(program); + const declaration = stmt.declarations[0]; + expect(declaration.parent).toBe(stmt); + expect(declaration.id.parent).toBe(declaration); + expect(declaration.init.parent).toBe(declaration); + }); + + it.concurrent('TS', async () => { + const code = 'let x = 1;'; + + // @ts-ignore + let ret = parseSync('test.ts', code, { experimentalRawTransfer: true, experimentalParent: true }); + expect(ret.errors.length).toBe(0); + const { program } = ret; + expect(program.parent).toBe(null); + const stmt = ret.program.body[0] as VariableDeclaration; + expect(stmt.parent).toBe(program); + const declaration = stmt.declarations[0]; + expect(declaration.parent).toBe(stmt); + expect(declaration.id.parent).toBe(declaration); + expect(declaration.init.parent).toBe(declaration); + }); + }); +}); diff --git a/napi/parser/vitest.config.ts b/napi/parser/vitest.config.ts index a4d79ecda6b3f..e211976510ba1 100644 --- a/napi/parser/vitest.config.ts +++ b/napi/parser/vitest.config.ts @@ -1,10 +1,11 @@ import { defineConfig } from 'vitest/config'; const { env } = process; +const isEnabled = envValue => envValue === 'true' || envValue === '1'; let exclude; -if (env.RUN_LAZY_TESTS !== 'true') { +if (!isEnabled(env.RUN_LAZY_TESTS)) { exclude = ['lazy-deserialization.test.ts']; - if (env.RUN_RAW_TESTS !== 'true') exclude.push('parse-raw.test.ts'); + if (!isEnabled(env.RUN_RAW_TESTS) && !isEnabled(env.RUN_RAW_RANGE_TESTS)) exclude.push('parse-raw.test.ts'); } export default defineConfig({ diff --git a/npm/oxc-types/types.d.ts b/npm/oxc-types/types.d.ts index 93dc12b7bfe25..3b61e71c909f4 100644 --- a/npm/oxc-types/types.d.ts +++ b/npm/oxc-types/types.d.ts @@ -6,6 +6,7 @@ export interface Program extends Span { body: Array; sourceType: ModuleKind; hashbang: Hashbang | null; + parent?: null; } export type Expression = @@ -57,6 +58,7 @@ export interface IdentifierName extends Span { name: string; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface IdentifierReference extends Span { @@ -65,6 +67,7 @@ export interface IdentifierReference extends Span { name: string; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface BindingIdentifier extends Span { @@ -73,6 +76,7 @@ export interface BindingIdentifier extends Span { name: string; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface LabelIdentifier extends Span { @@ -81,15 +85,18 @@ export interface LabelIdentifier extends Span { name: string; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface ThisExpression extends Span { type: 'ThisExpression'; + parent?: Node; } export interface ArrayExpression extends Span { type: 'ArrayExpression'; elements: Array; + parent?: Node; } export type ArrayExpressionElement = SpreadElement | null | Expression; @@ -97,6 +104,7 @@ export type ArrayExpressionElement = SpreadElement | null | Expression; export interface ObjectExpression extends Span { type: 'ObjectExpression'; properties: Array; + parent?: Node; } export type ObjectPropertyKind = ObjectProperty | SpreadElement; @@ -110,6 +118,7 @@ export interface ObjectProperty extends Span { shorthand: boolean; computed: boolean; optional?: false; + parent?: Node; } export type PropertyKey = IdentifierName | PrivateIdentifier | Expression; @@ -120,6 +129,7 @@ export interface TemplateLiteral extends Span { type: 'TemplateLiteral'; quasis: Array; expressions: Array; + parent?: Node; } export interface TaggedTemplateExpression extends Span { @@ -127,12 +137,14 @@ export interface TaggedTemplateExpression extends Span { tag: Expression; typeArguments?: TSTypeParameterInstantiation | null; quasi: TemplateLiteral; + parent?: Node; } export interface TemplateElement extends Span { type: 'TemplateElement'; value: TemplateElementValue; tail: boolean; + parent?: Node; } export interface TemplateElementValue { @@ -148,6 +160,7 @@ export interface ComputedMemberExpression extends Span { property: Expression; optional: boolean; computed: true; + parent?: Node; } export interface StaticMemberExpression extends Span { @@ -156,6 +169,7 @@ export interface StaticMemberExpression extends Span { property: IdentifierName; optional: boolean; computed: false; + parent?: Node; } export interface PrivateFieldExpression extends Span { @@ -164,6 +178,7 @@ export interface PrivateFieldExpression extends Span { property: PrivateIdentifier; optional: boolean; computed: false; + parent?: Node; } export interface CallExpression extends Span { @@ -172,6 +187,7 @@ export interface CallExpression extends Span { typeArguments?: TSTypeParameterInstantiation | null; arguments: Array; optional: boolean; + parent?: Node; } export interface NewExpression extends Span { @@ -179,17 +195,20 @@ export interface NewExpression extends Span { callee: Expression; typeArguments?: TSTypeParameterInstantiation | null; arguments: Array; + parent?: Node; } export interface MetaProperty extends Span { type: 'MetaProperty'; meta: IdentifierName; property: IdentifierName; + parent?: Node; } export interface SpreadElement extends Span { type: 'SpreadElement'; argument: Expression; + parent?: Node; } export type Argument = SpreadElement | Expression; @@ -199,6 +218,7 @@ export interface UpdateExpression extends Span { operator: UpdateOperator; prefix: boolean; argument: SimpleAssignmentTarget; + parent?: Node; } export interface UnaryExpression extends Span { @@ -206,6 +226,7 @@ export interface UnaryExpression extends Span { operator: UnaryOperator; argument: Expression; prefix: true; + parent?: Node; } export interface BinaryExpression extends Span { @@ -213,6 +234,7 @@ export interface BinaryExpression extends Span { left: Expression; operator: BinaryOperator; right: Expression; + parent?: Node; } export interface PrivateInExpression extends Span { @@ -220,6 +242,7 @@ export interface PrivateInExpression extends Span { left: PrivateIdentifier; operator: 'in'; right: Expression; + parent?: Node; } export interface LogicalExpression extends Span { @@ -227,6 +250,7 @@ export interface LogicalExpression extends Span { left: Expression; operator: LogicalOperator; right: Expression; + parent?: Node; } export interface ConditionalExpression extends Span { @@ -234,6 +258,7 @@ export interface ConditionalExpression extends Span { test: Expression; consequent: Expression; alternate: Expression; + parent?: Node; } export interface AssignmentExpression extends Span { @@ -241,6 +266,7 @@ export interface AssignmentExpression extends Span { operator: AssignmentOperator; left: AssignmentTarget; right: Expression; + parent?: Node; } export type AssignmentTarget = SimpleAssignmentTarget | AssignmentTargetPattern; @@ -261,6 +287,7 @@ export interface ArrayAssignmentTarget extends Span { elements: Array; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface ObjectAssignmentTarget extends Span { @@ -269,6 +296,7 @@ export interface ObjectAssignmentTarget extends Span { properties: Array; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface AssignmentTargetRest extends Span { @@ -278,6 +306,7 @@ export interface AssignmentTargetRest extends Span { optional?: false; typeAnnotation?: null; value?: null; + parent?: Node; } export type AssignmentTargetMaybeDefault = AssignmentTargetWithDefault | AssignmentTarget; @@ -289,6 +318,7 @@ export interface AssignmentTargetWithDefault extends Span { right: Expression; optional?: false; typeAnnotation?: null; + parent?: Node; } export type AssignmentTargetProperty = AssignmentTargetPropertyIdentifier | AssignmentTargetPropertyProperty; @@ -302,6 +332,7 @@ export interface AssignmentTargetPropertyIdentifier extends Span { shorthand: true; computed: false; optional?: false; + parent?: Node; } export interface AssignmentTargetPropertyProperty extends Span { @@ -313,25 +344,30 @@ export interface AssignmentTargetPropertyProperty extends Span { shorthand: false; computed: boolean; optional?: false; + parent?: Node; } export interface SequenceExpression extends Span { type: 'SequenceExpression'; expressions: Array; + parent?: Node; } export interface Super extends Span { type: 'Super'; + parent?: Node; } export interface AwaitExpression extends Span { type: 'AwaitExpression'; argument: Expression; + parent?: Node; } export interface ChainExpression extends Span { type: 'ChainExpression'; expression: ChainElement; + parent?: Node; } export type ChainElement = CallExpression | TSNonNullExpression | MemberExpression; @@ -339,6 +375,7 @@ export type ChainElement = CallExpression | TSNonNullExpression | MemberExpressi export interface ParenthesizedExpression extends Span { type: 'ParenthesizedExpression'; expression: Expression; + parent?: Node; } export type Statement = @@ -367,16 +404,19 @@ export interface Directive extends Span { type: 'ExpressionStatement'; expression: StringLiteral; directive: string; + parent?: Node; } export interface Hashbang extends Span { type: 'Hashbang'; value: string; + parent?: Node; } export interface BlockStatement extends Span { type: 'BlockStatement'; body: Array; + parent?: Node; } export type Declaration = @@ -394,6 +434,7 @@ export interface VariableDeclaration extends Span { kind: VariableDeclarationKind; declarations: Array; declare?: boolean; + parent?: Node; } export type VariableDeclarationKind = 'var' | 'let' | 'const' | 'using' | 'await using'; @@ -403,16 +444,19 @@ export interface VariableDeclarator extends Span { id: BindingPattern; init: Expression | null; definite?: boolean; + parent?: Node; } export interface EmptyStatement extends Span { type: 'EmptyStatement'; + parent?: Node; } export interface ExpressionStatement extends Span { type: 'ExpressionStatement'; expression: Expression; directive?: string | null; + parent?: Node; } export interface IfStatement extends Span { @@ -420,18 +464,21 @@ export interface IfStatement extends Span { test: Expression; consequent: Statement; alternate: Statement | null; + parent?: Node; } export interface DoWhileStatement extends Span { type: 'DoWhileStatement'; body: Statement; test: Expression; + parent?: Node; } export interface WhileStatement extends Span { type: 'WhileStatement'; test: Expression; body: Statement; + parent?: Node; } export interface ForStatement extends Span { @@ -440,6 +487,7 @@ export interface ForStatement extends Span { test: Expression | null; update: Expression | null; body: Statement; + parent?: Node; } export type ForStatementInit = VariableDeclaration | Expression; @@ -449,6 +497,7 @@ export interface ForInStatement extends Span { left: ForStatementLeft; right: Expression; body: Statement; + parent?: Node; } export type ForStatementLeft = VariableDeclaration | AssignmentTarget; @@ -459,50 +508,59 @@ export interface ForOfStatement extends Span { left: ForStatementLeft; right: Expression; body: Statement; + parent?: Node; } export interface ContinueStatement extends Span { type: 'ContinueStatement'; label: LabelIdentifier | null; + parent?: Node; } export interface BreakStatement extends Span { type: 'BreakStatement'; label: LabelIdentifier | null; + parent?: Node; } export interface ReturnStatement extends Span { type: 'ReturnStatement'; argument: Expression | null; + parent?: Node; } export interface WithStatement extends Span { type: 'WithStatement'; object: Expression; body: Statement; + parent?: Node; } export interface SwitchStatement extends Span { type: 'SwitchStatement'; discriminant: Expression; cases: Array; + parent?: Node; } export interface SwitchCase extends Span { type: 'SwitchCase'; test: Expression | null; consequent: Array; + parent?: Node; } export interface LabeledStatement extends Span { type: 'LabeledStatement'; label: LabelIdentifier; body: Statement; + parent?: Node; } export interface ThrowStatement extends Span { type: 'ThrowStatement'; argument: Expression; + parent?: Node; } export interface TryStatement extends Span { @@ -510,16 +568,19 @@ export interface TryStatement extends Span { block: BlockStatement; handler: CatchClause | null; finalizer: BlockStatement | null; + parent?: Node; } export interface CatchClause extends Span { type: 'CatchClause'; param: BindingPattern | null; body: BlockStatement; + parent?: Node; } export interface DebuggerStatement extends Span { type: 'DebuggerStatement'; + parent?: Node; } export type BindingPattern = @@ -538,6 +599,7 @@ export interface AssignmentPattern extends Span { right: Expression; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface ObjectPattern extends Span { @@ -546,6 +608,7 @@ export interface ObjectPattern extends Span { properties: Array; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface BindingProperty extends Span { @@ -557,6 +620,7 @@ export interface BindingProperty extends Span { shorthand: boolean; computed: boolean; optional?: false; + parent?: Node; } export interface ArrayPattern extends Span { @@ -565,6 +629,7 @@ export interface ArrayPattern extends Span { elements: Array; optional?: false; typeAnnotation?: null; + parent?: Node; } export interface BindingRestElement extends Span { @@ -574,6 +639,7 @@ export interface BindingRestElement extends Span { optional?: false; typeAnnotation?: null; value?: null; + parent?: Node; } export interface Function extends Span { @@ -587,6 +653,7 @@ export interface Function extends Span { returnType?: TSTypeAnnotation | null; body: FunctionBody | null; expression: false; + parent?: Node; } export type ParamPattern = FormalParameter | TSParameterProperty | FormalParameterRest; @@ -625,6 +692,7 @@ export interface TSParameterProperty extends Span { export interface FunctionBody extends Span { type: 'BlockStatement'; body: Array; + parent?: Node; } export interface ArrowFunctionExpression extends Span { @@ -637,12 +705,14 @@ export interface ArrowFunctionExpression extends Span { body: FunctionBody | Expression; id: null; generator: false; + parent?: Node; } export interface YieldExpression extends Span { type: 'YieldExpression'; delegate: boolean; argument: Expression | null; + parent?: Node; } export interface Class extends Span { @@ -656,6 +726,7 @@ export interface Class extends Span { body: ClassBody; abstract?: boolean; declare?: boolean; + parent?: Node; } export type ClassType = 'ClassDeclaration' | 'ClassExpression'; @@ -663,6 +734,7 @@ export type ClassType = 'ClassDeclaration' | 'ClassExpression'; export interface ClassBody extends Span { type: 'ClassBody'; body: Array; + parent?: Node; } export type ClassElement = StaticBlock | MethodDefinition | PropertyDefinition | AccessorProperty | TSIndexSignature; @@ -678,6 +750,7 @@ export interface MethodDefinition extends Span { override?: boolean; optional?: boolean; accessibility?: TSAccessibility | null; + parent?: Node; } export type MethodDefinitionType = 'MethodDefinition' | 'TSAbstractMethodDefinition'; @@ -696,6 +769,7 @@ export interface PropertyDefinition extends Span { definite?: boolean; readonly?: boolean; accessibility?: TSAccessibility | null; + parent?: Node; } export type PropertyDefinitionType = 'PropertyDefinition' | 'TSAbstractPropertyDefinition'; @@ -705,11 +779,13 @@ export type MethodDefinitionKind = 'constructor' | 'method' | 'get' | 'set'; export interface PrivateIdentifier extends Span { type: 'PrivateIdentifier'; name: string; + parent?: Node; } export interface StaticBlock extends Span { type: 'StaticBlock'; body: Array; + parent?: Node; } export type ModuleDeclaration = @@ -736,6 +812,7 @@ export interface AccessorProperty extends Span { declare?: false; optional?: false; readonly?: false; + parent?: Node; } export interface ImportExpression extends Span { @@ -743,6 +820,7 @@ export interface ImportExpression extends Span { source: Expression; options: Expression | null; phase: ImportPhase | null; + parent?: Node; } export interface ImportDeclaration extends Span { @@ -752,6 +830,7 @@ export interface ImportDeclaration extends Span { phase: ImportPhase | null; attributes: Array; importKind?: ImportOrExportKind; + parent?: Node; } export type ImportPhase = 'source' | 'defer'; @@ -763,22 +842,26 @@ export interface ImportSpecifier extends Span { imported: ModuleExportName; local: BindingIdentifier; importKind?: ImportOrExportKind; + parent?: Node; } export interface ImportDefaultSpecifier extends Span { type: 'ImportDefaultSpecifier'; local: BindingIdentifier; + parent?: Node; } export interface ImportNamespaceSpecifier extends Span { type: 'ImportNamespaceSpecifier'; local: BindingIdentifier; + parent?: Node; } export interface ImportAttribute extends Span { type: 'ImportAttribute'; key: ImportAttributeKey; value: StringLiteral; + parent?: Node; } export type ImportAttributeKey = IdentifierName | StringLiteral; @@ -790,12 +873,14 @@ export interface ExportNamedDeclaration extends Span { source: StringLiteral | null; exportKind?: ImportOrExportKind; attributes: Array; + parent?: Node; } export interface ExportDefaultDeclaration extends Span { type: 'ExportDefaultDeclaration'; declaration: ExportDefaultDeclarationKind; exportKind?: 'value'; + parent?: Node; } export interface ExportAllDeclaration extends Span { @@ -804,6 +889,7 @@ export interface ExportAllDeclaration extends Span { source: StringLiteral; attributes: Array; exportKind?: ImportOrExportKind; + parent?: Node; } export interface ExportSpecifier extends Span { @@ -811,6 +897,7 @@ export interface ExportSpecifier extends Span { local: ModuleExportName; exported: ModuleExportName; exportKind?: ImportOrExportKind; + parent?: Node; } export type ExportDefaultDeclarationKind = Function | Class | TSInterfaceDeclaration | Expression; @@ -821,30 +908,35 @@ export interface V8IntrinsicExpression extends Span { type: 'V8IntrinsicExpression'; name: IdentifierName; arguments: Array; + parent?: Node; } export interface BooleanLiteral extends Span { type: 'Literal'; value: boolean; raw: string | null; + parent?: Node; } export interface NullLiteral extends Span { type: 'Literal'; value: null; raw: 'null' | null; + parent?: Node; } export interface NumericLiteral extends Span { type: 'Literal'; value: number; raw: string | null; + parent?: Node; } export interface StringLiteral extends Span { type: 'Literal'; value: string; raw: string | null; + parent?: Node; } export interface BigIntLiteral extends Span { @@ -852,6 +944,7 @@ export interface BigIntLiteral extends Span { value: bigint; raw: string | null; bigint: string; + parent?: Node; } export interface RegExpLiteral extends Span { @@ -859,6 +952,7 @@ export interface RegExpLiteral extends Span { value: RegExp | null; raw: string | null; regex: { pattern: string; flags: string }; + parent?: Node; } export interface JSXElement extends Span { @@ -866,6 +960,7 @@ export interface JSXElement extends Span { openingElement: JSXOpeningElement; children: Array; closingElement: JSXClosingElement | null; + parent?: Node; } export interface JSXOpeningElement extends Span { @@ -874,11 +969,13 @@ export interface JSXOpeningElement extends Span { typeArguments?: TSTypeParameterInstantiation | null; attributes: Array; selfClosing: boolean; + parent?: Node; } export interface JSXClosingElement extends Span { type: 'JSXClosingElement'; name: JSXElementName; + parent?: Node; } export interface JSXFragment extends Span { @@ -886,16 +983,19 @@ export interface JSXFragment extends Span { openingFragment: JSXOpeningFragment; children: Array; closingFragment: JSXClosingFragment; + parent?: Node; } export interface JSXOpeningFragment extends Span { type: 'JSXOpeningFragment'; attributes?: []; selfClosing?: false; + parent?: Node; } export interface JSXClosingFragment extends Span { type: 'JSXClosingFragment'; + parent?: Node; } export type JSXElementName = JSXIdentifier | JSXNamespacedName | JSXMemberExpression; @@ -904,12 +1004,14 @@ export interface JSXNamespacedName extends Span { type: 'JSXNamespacedName'; namespace: JSXIdentifier; name: JSXIdentifier; + parent?: Node; } export interface JSXMemberExpression extends Span { type: 'JSXMemberExpression'; object: JSXMemberExpressionObject; property: JSXIdentifier; + parent?: Node; } export type JSXMemberExpressionObject = JSXIdentifier | JSXMemberExpression; @@ -917,12 +1019,14 @@ export type JSXMemberExpressionObject = JSXIdentifier | JSXMemberExpression; export interface JSXExpressionContainer extends Span { type: 'JSXExpressionContainer'; expression: JSXExpression; + parent?: Node; } export type JSXExpression = JSXEmptyExpression | Expression; export interface JSXEmptyExpression extends Span { type: 'JSXEmptyExpression'; + parent?: Node; } export type JSXAttributeItem = JSXAttribute | JSXSpreadAttribute; @@ -931,11 +1035,13 @@ export interface JSXAttribute extends Span { type: 'JSXAttribute'; name: JSXAttributeName; value: JSXAttributeValue | null; + parent?: Node; } export interface JSXSpreadAttribute extends Span { type: 'JSXSpreadAttribute'; argument: Expression; + parent?: Node; } export type JSXAttributeName = JSXIdentifier | JSXNamespacedName; @@ -945,6 +1051,7 @@ export type JSXAttributeValue = StringLiteral | JSXExpressionContainer | JSXElem export interface JSXIdentifier extends Span { type: 'JSXIdentifier'; name: string; + parent?: Node; } export type JSXChild = JSXText | JSXElement | JSXFragment | JSXExpressionContainer | JSXSpreadChild; @@ -952,12 +1059,14 @@ export type JSXChild = JSXText | JSXElement | JSXFragment | JSXExpressionContain export interface JSXSpreadChild extends Span { type: 'JSXSpreadChild'; expression: Expression; + parent?: Node; } export interface JSXText extends Span { type: 'JSXText'; value: string; raw: string | null; + parent?: Node; } export interface TSThisParameter extends Span { @@ -966,6 +1075,7 @@ export interface TSThisParameter extends Span { name: 'this'; optional: false; typeAnnotation: TSTypeAnnotation | null; + parent?: Node; } export interface TSEnumDeclaration extends Span { @@ -974,11 +1084,13 @@ export interface TSEnumDeclaration extends Span { body: TSEnumBody; const: boolean; declare: boolean; + parent?: Node; } export interface TSEnumBody extends Span { type: 'TSEnumBody'; members: Array; + parent?: Node; } export interface TSEnumMember extends Span { @@ -986,6 +1098,7 @@ export interface TSEnumMember extends Span { id: TSEnumMemberName; initializer: Expression | null; computed: boolean; + parent?: Node; } export type TSEnumMemberName = IdentifierName | StringLiteral | TemplateLiteral; @@ -993,11 +1106,13 @@ export type TSEnumMemberName = IdentifierName | StringLiteral | TemplateLiteral; export interface TSTypeAnnotation extends Span { type: 'TSTypeAnnotation'; typeAnnotation: TSType; + parent?: Node; } export interface TSLiteralType extends Span { type: 'TSLiteralType'; literal: TSLiteral; + parent?: Node; } export type TSLiteral = @@ -1053,27 +1168,32 @@ export interface TSConditionalType extends Span { extendsType: TSType; trueType: TSType; falseType: TSType; + parent?: Node; } export interface TSUnionType extends Span { type: 'TSUnionType'; types: Array; + parent?: Node; } export interface TSIntersectionType extends Span { type: 'TSIntersectionType'; types: Array; + parent?: Node; } export interface TSParenthesizedType extends Span { type: 'TSParenthesizedType'; typeAnnotation: TSType; + parent?: Node; } export interface TSTypeOperator extends Span { type: 'TSTypeOperator'; operator: TSTypeOperatorOperator; typeAnnotation: TSType; + parent?: Node; } export type TSTypeOperatorOperator = 'keyof' | 'unique' | 'readonly'; @@ -1081,17 +1201,20 @@ export type TSTypeOperatorOperator = 'keyof' | 'unique' | 'readonly'; export interface TSArrayType extends Span { type: 'TSArrayType'; elementType: TSType; + parent?: Node; } export interface TSIndexedAccessType extends Span { type: 'TSIndexedAccessType'; objectType: TSType; indexType: TSType; + parent?: Node; } export interface TSTupleType extends Span { type: 'TSTupleType'; elementTypes: Array; + parent?: Node; } export interface TSNamedTupleMember extends Span { @@ -1099,80 +1222,98 @@ export interface TSNamedTupleMember extends Span { label: IdentifierName; elementType: TSTupleElement; optional: boolean; + parent?: Node; } export interface TSOptionalType extends Span { type: 'TSOptionalType'; typeAnnotation: TSType; + parent?: Node; } export interface TSRestType extends Span { type: 'TSRestType'; typeAnnotation: TSType; + parent?: Node; } export type TSTupleElement = TSOptionalType | TSRestType | TSType; export interface TSAnyKeyword extends Span { type: 'TSAnyKeyword'; + parent?: Node; } export interface TSStringKeyword extends Span { type: 'TSStringKeyword'; + parent?: Node; } export interface TSBooleanKeyword extends Span { type: 'TSBooleanKeyword'; + parent?: Node; } export interface TSNumberKeyword extends Span { type: 'TSNumberKeyword'; + parent?: Node; } export interface TSNeverKeyword extends Span { type: 'TSNeverKeyword'; + parent?: Node; } export interface TSIntrinsicKeyword extends Span { type: 'TSIntrinsicKeyword'; + parent?: Node; } export interface TSUnknownKeyword extends Span { type: 'TSUnknownKeyword'; + parent?: Node; } export interface TSNullKeyword extends Span { type: 'TSNullKeyword'; + parent?: Node; } export interface TSUndefinedKeyword extends Span { type: 'TSUndefinedKeyword'; + parent?: Node; } export interface TSVoidKeyword extends Span { type: 'TSVoidKeyword'; + parent?: Node; } export interface TSSymbolKeyword extends Span { type: 'TSSymbolKeyword'; + parent?: Node; } export interface TSThisType extends Span { type: 'TSThisType'; + parent?: Node; } export interface TSObjectKeyword extends Span { type: 'TSObjectKeyword'; + parent?: Node; } export interface TSBigIntKeyword extends Span { type: 'TSBigIntKeyword'; + parent?: Node; } export interface TSTypeReference extends Span { type: 'TSTypeReference'; typeName: TSTypeName; typeArguments: TSTypeParameterInstantiation | null; + parent?: Node; } export type TSTypeName = IdentifierReference | TSQualifiedName | ThisExpression; @@ -1181,11 +1322,13 @@ export interface TSQualifiedName extends Span { type: 'TSQualifiedName'; left: TSTypeName; right: IdentifierName; + parent?: Node; } export interface TSTypeParameterInstantiation extends Span { type: 'TSTypeParameterInstantiation'; params: Array; + parent?: Node; } export interface TSTypeParameter extends Span { @@ -1196,11 +1339,13 @@ export interface TSTypeParameter extends Span { in: boolean; out: boolean; const: boolean; + parent?: Node; } export interface TSTypeParameterDeclaration extends Span { type: 'TSTypeParameterDeclaration'; params: Array; + parent?: Node; } export interface TSTypeAliasDeclaration extends Span { @@ -1209,6 +1354,7 @@ export interface TSTypeAliasDeclaration extends Span { typeParameters: TSTypeParameterDeclaration | null; typeAnnotation: TSType; declare: boolean; + parent?: Node; } export type TSAccessibility = 'private' | 'protected' | 'public'; @@ -1217,6 +1363,7 @@ export interface TSClassImplements extends Span { type: 'TSClassImplements'; expression: IdentifierReference | ThisExpression | MemberExpression; typeArguments: TSTypeParameterInstantiation | null; + parent?: Node; } export interface TSInterfaceDeclaration extends Span { @@ -1226,11 +1373,13 @@ export interface TSInterfaceDeclaration extends Span { extends: Array; body: TSInterfaceBody; declare: boolean; + parent?: Node; } export interface TSInterfaceBody extends Span { type: 'TSInterfaceBody'; body: Array; + parent?: Node; } export interface TSPropertySignature extends Span { @@ -1242,6 +1391,7 @@ export interface TSPropertySignature extends Span { typeAnnotation: TSTypeAnnotation | null; accessibility: null; static: false; + parent?: Node; } export type TSSignature = @@ -1258,6 +1408,7 @@ export interface TSIndexSignature extends Span { readonly: boolean; static: boolean; accessibility: null; + parent?: Node; } export interface TSCallSignatureDeclaration extends Span { @@ -1265,6 +1416,7 @@ export interface TSCallSignatureDeclaration extends Span { typeParameters: TSTypeParameterDeclaration | null; params: ParamPattern[]; returnType: TSTypeAnnotation | null; + parent?: Node; } export type TSMethodSignatureKind = 'method' | 'get' | 'set'; @@ -1281,6 +1433,7 @@ export interface TSMethodSignature extends Span { accessibility: null; readonly: false; static: false; + parent?: Node; } export interface TSConstructSignatureDeclaration extends Span { @@ -1288,6 +1441,7 @@ export interface TSConstructSignatureDeclaration extends Span { typeParameters: TSTypeParameterDeclaration | null; params: ParamPattern[]; returnType: TSTypeAnnotation | null; + parent?: Node; } export interface TSIndexSignatureName extends Span { @@ -1296,12 +1450,14 @@ export interface TSIndexSignatureName extends Span { name: string; optional: false; typeAnnotation: TSTypeAnnotation; + parent?: Node; } export interface TSInterfaceHeritage extends Span { type: 'TSInterfaceHeritage'; expression: Expression; typeArguments: TSTypeParameterInstantiation | null; + parent?: Node; } export interface TSTypePredicate extends Span { @@ -1309,6 +1465,7 @@ export interface TSTypePredicate extends Span { parameterName: TSTypePredicateName; asserts: boolean; typeAnnotation: TSTypeAnnotation | null; + parent?: Node; } export type TSTypePredicateName = IdentifierName | TSThisType; @@ -1320,6 +1477,7 @@ export interface TSModuleDeclaration extends Span { kind: TSModuleDeclarationKind; declare: boolean; global: boolean; + parent?: Node; } export type TSModuleDeclarationKind = 'global' | 'module' | 'namespace'; @@ -1327,22 +1485,26 @@ export type TSModuleDeclarationKind = 'global' | 'module' | 'namespace'; export interface TSModuleBlock extends Span { type: 'TSModuleBlock'; body: Array; + parent?: Node; } export interface TSTypeLiteral extends Span { type: 'TSTypeLiteral'; members: Array; + parent?: Node; } export interface TSInferType extends Span { type: 'TSInferType'; typeParameter: TSTypeParameter; + parent?: Node; } export interface TSTypeQuery extends Span { type: 'TSTypeQuery'; exprName: TSTypeQueryExprName; typeArguments: TSTypeParameterInstantiation | null; + parent?: Node; } export type TSTypeQueryExprName = TSImportType | TSTypeName; @@ -1353,6 +1515,7 @@ export interface TSImportType extends Span { options: ObjectExpression | null; qualifier: TSImportTypeQualifier | null; typeArguments: TSTypeParameterInstantiation | null; + parent?: Node; } export type TSImportTypeQualifier = IdentifierName | TSImportTypeQualifiedName; @@ -1361,6 +1524,7 @@ export interface TSImportTypeQualifiedName extends Span { type: 'TSQualifiedName'; left: TSImportTypeQualifier; right: IdentifierName; + parent?: Node; } export interface TSFunctionType extends Span { @@ -1368,6 +1532,7 @@ export interface TSFunctionType extends Span { typeParameters: TSTypeParameterDeclaration | null; params: ParamPattern[]; returnType: TSTypeAnnotation; + parent?: Node; } export interface TSConstructorType extends Span { @@ -1376,6 +1541,7 @@ export interface TSConstructorType extends Span { typeParameters: TSTypeParameterDeclaration | null; params: ParamPattern[]; returnType: TSTypeAnnotation; + parent?: Node; } export interface TSMappedType extends Span { @@ -1386,6 +1552,7 @@ export interface TSMappedType extends Span { typeAnnotation: TSType | null; optional: TSMappedTypeModifierOperator | false; readonly: TSMappedTypeModifierOperator | null; + parent?: Node; } export type TSMappedTypeModifierOperator = true | '+' | '-'; @@ -1394,24 +1561,28 @@ export interface TSTemplateLiteralType extends Span { type: 'TSTemplateLiteralType'; quasis: Array; types: Array; + parent?: Node; } export interface TSAsExpression extends Span { type: 'TSAsExpression'; expression: Expression; typeAnnotation: TSType; + parent?: Node; } export interface TSSatisfiesExpression extends Span { type: 'TSSatisfiesExpression'; expression: Expression; typeAnnotation: TSType; + parent?: Node; } export interface TSTypeAssertion extends Span { type: 'TSTypeAssertion'; typeAnnotation: TSType; expression: Expression; + parent?: Node; } export interface TSImportEqualsDeclaration extends Span { @@ -1419,6 +1590,7 @@ export interface TSImportEqualsDeclaration extends Span { id: BindingIdentifier; moduleReference: TSModuleReference; importKind: ImportOrExportKind; + parent?: Node; } export type TSModuleReference = TSExternalModuleReference | TSTypeName; @@ -1426,32 +1598,38 @@ export type TSModuleReference = TSExternalModuleReference | TSTypeName; export interface TSExternalModuleReference extends Span { type: 'TSExternalModuleReference'; expression: StringLiteral; + parent?: Node; } export interface TSNonNullExpression extends Span { type: 'TSNonNullExpression'; expression: Expression; + parent?: Node; } export interface Decorator extends Span { type: 'Decorator'; expression: Expression; + parent?: Node; } export interface TSExportAssignment extends Span { type: 'TSExportAssignment'; expression: Expression; + parent?: Node; } export interface TSNamespaceExportDeclaration extends Span { type: 'TSNamespaceExportDeclaration'; id: IdentifierName; + parent?: Node; } export interface TSInstantiationExpression extends Span { type: 'TSInstantiationExpression'; expression: Expression; typeArguments: TSTypeParameterInstantiation; + parent?: Node; } export type ImportOrExportKind = 'value' | 'type'; @@ -1460,16 +1638,19 @@ export interface JSDocNullableType extends Span { type: 'TSJSDocNullableType'; typeAnnotation: TSType; postfix: boolean; + parent?: Node; } export interface JSDocNonNullableType extends Span { type: 'TSJSDocNonNullableType'; typeAnnotation: TSType; postfix: boolean; + parent?: Node; } export interface JSDocUnknownType extends Span { type: 'TSJSDocUnknownType'; + parent?: Node; } export type AssignmentOperator = diff --git a/tasks/ast_tools/src/generators/raw_transfer.rs b/tasks/ast_tools/src/generators/raw_transfer.rs index f74fa88165778..170556a1b6321 100644 --- a/tasks/ast_tools/src/generators/raw_transfer.rs +++ b/tasks/ast_tools/src/generators/raw_transfer.rs @@ -143,12 +143,15 @@ fn generate_deserializers( const IS_TS = false; const RANGE = false; + const PARENT = false; const PRESERVE_PARENS = false; const textDecoder = new TextDecoder('utf-8', {{ ignoreBOM: true }}), decodeStr = textDecoder.decode.bind(textDecoder), {{ fromCodePoint }} = String; + let parent = null; + export function deserialize(buffer, sourceText, sourceByteLen) {{ return deserializeWith(buffer, sourceText, sourceByteLen, deserializeRawTransferData); }} @@ -214,10 +217,11 @@ fn generate_deserializers( // Create deserializers with various settings, by setting `IS_TS`, `RANGE` and `PRESERVE_PARENS` consts, // and running through minifier to shake out irrelevant code let mut deserializers = vec![]; - let mut create_deserializer = |is_ts, range, preserve_parens| { + let mut create_deserializer = |is_ts, range, parent, preserve_parens| { let mut program = program.clone_in(&allocator); replace_const(&mut program, "IS_TS", is_ts); replace_const(&mut program, "RANGE", range); + replace_const(&mut program, "PARENT", parent); replace_const(&mut program, "PRESERVE_PARENS", preserve_parens); let code = print_minified(&mut program, &allocator); @@ -225,6 +229,9 @@ fn generate_deserializers( if range { name.push_str("_range"); } + if parent { + name.push_str("_parent"); + } if !preserve_parens { name.push_str("_no_parens"); } @@ -234,12 +241,14 @@ fn generate_deserializers( for is_ts in [false, true] { for range in [false, true] { - create_deserializer(is_ts, range, true); + for parent in [false, true] { + create_deserializer(is_ts, range, parent, true); + } } } // `PRESERVE_PARENS = false` is only required for linter - create_deserializer(true, true, false); + create_deserializer(true, true, false, false); deserializers } @@ -285,21 +294,27 @@ fn generate_struct( }); let body = body.unwrap_or_else(|| { - let mut preamble_str = String::new(); + let mut inline_preamble_str = String::new(); let mut fields_str = String::new(); + let mut assignments_preamble_str = String::new(); + let mut assignments_str = String::new(); generator.generate_struct_fields(struct_def, 0, DeserializerType::Both); - for (field_name, StructFieldValue { value, deser_type }) in generator.fields { + let has_type_field = generator.fields.contains_key("type"); + + let mut all_fields_inline = true; + for (field_name, StructFieldValue { value, deser_type, inline }) in generator.fields { if let Some(value) = value.strip_prefix("...") { + assert!(inline, "Spread fields must be inlined"); match deser_type { DeserializerType::Both => write_it!(fields_str, "...{value},"), DeserializerType::JsOnly => write_it!(fields_str, "...(!IS_TS && {value}),"), DeserializerType::TsOnly => write_it!(fields_str, "...(IS_TS && {value}),"), } - } else { + } else if inline || !has_type_field { let value = if generator.dependent_field_names.contains(&field_name) { - write_it!(preamble_str, "const {field_name} = {value};\n"); + write_it!(inline_preamble_str, "const {field_name} = {value};\n"); &field_name } else { &value @@ -315,19 +330,55 @@ fn generate_struct( }; write_it!(fields_str, "...({condition} && {{ {field_name}: {value} }}),"); } + } else { + all_fields_inline = false; + + let value = if generator.dependent_field_names.contains(&field_name) { + write_it!(assignments_preamble_str, "const {field_name} = {value};\n"); + &field_name + } else { + &value + }; + + if deser_type == DeserializerType::Both { + write_it!(fields_str, "{field_name}: null,"); + write_it!(assignments_str, "node.{field_name} = {value};"); + } else { + let condition = match deser_type { + DeserializerType::JsOnly => "!IS_TS", + DeserializerType::TsOnly => "IS_TS", + DeserializerType::Both => unreachable!(), + }; + write_it!(fields_str, "...({condition} && {{ {field_name}: null }}),"); + write_it!(assignments_str, "if ({condition}) node.{field_name} = {value};"); + } } } for preamble_part in generator.preamble { - preamble_str.push_str(preamble_part.trim()); + assignments_preamble_str.push_str(preamble_part.trim()); + } + + let mut parent_assignment_str = ""; + if has_type_field { + fields_str.push_str("...(PARENT && { parent }),\n"); + + if !all_fields_inline { + inline_preamble_str.push_str("const previousParent = parent;\n"); + parent_assignment_str = "parent = "; + assignments_str.push_str("if (PARENT) parent = previousParent;\n"); + } } format!( " - {preamble_str} - return {{ + {inline_preamble_str} + const node = {parent_assignment_str} {{ {fields_str} }}; + {assignments_preamble_str} + {assignments_str} + return node; " ) }); @@ -358,6 +409,8 @@ struct StructFieldValue { value: String, /// Which deserializer(s) should include this field deser_type: DeserializerType, + /// `true` if value can be inlined in object definition + inline: bool, } impl<'s> StructDeserializerGenerator<'s> { @@ -404,6 +457,7 @@ impl<'s> StructDeserializerGenerator<'s> { StructFieldValue { value: format!("'{struct_name}'"), deser_type: DeserializerType::Both, + inline: true, }, ); } @@ -448,6 +502,7 @@ impl<'s> StructDeserializerGenerator<'s> { StructFieldValue { value: "...(RANGE && { range: [start, end] })".to_string(), deser_type, + inline: true, }, ); @@ -470,6 +525,7 @@ impl<'s> StructDeserializerGenerator<'s> { concat_field_count += 1; } + let mut inline = false; let value = if concat_field_count > 1 { // Concatenate fields for (index, &field) in concat_fields[..concat_field_count].iter().enumerate() { @@ -509,12 +565,20 @@ impl<'s> StructDeserializerGenerator<'s> { let converter = self.schema.meta_by_name(converter_name); self.apply_converter(converter, struct_def, struct_offset).unwrap() } else { + // Primitives and fieldless enums can be inlined into object literal, + // because they don't have a `parent` field + inline = match field_type.innermost_type(self.schema) { + TypeDef::Primitive(_) => true, + TypeDef::Enum(enum_def) => enum_def.is_fieldless(), + _ => false, + }; + let value_fn = field_type.deser_name(self.schema); let pos = pos_offset(field_offset); format!("{value_fn}({pos})") }; - self.fields.insert(field_name, StructFieldValue { value, deser_type }); + self.fields.insert(field_name, StructFieldValue { value, deser_type, inline }); } fn generate_struct_field_added( @@ -534,7 +598,8 @@ impl<'s> StructDeserializerGenerator<'s> { } let value = self.apply_converter(converter, struct_def, struct_offset).unwrap(); - self.fields.insert(field_name.to_string(), StructFieldValue { value, deser_type }); + self.fields + .insert(field_name.to_string(), StructFieldValue { value, deser_type, inline: false }); } fn apply_converter( diff --git a/tasks/ast_tools/src/generators/typescript.rs b/tasks/ast_tools/src/generators/typescript.rs index 38cfae77b60ff..fbb124b71573d 100644 --- a/tasks/ast_tools/src/generators/typescript.rs +++ b/tasks/ast_tools/src/generators/typescript.rs @@ -11,7 +11,7 @@ use crate::{ should_skip_enum_variant, should_skip_field, }, output::Output, - schema::{Def, EnumDef, FieldDef, Schema, StructDef, TypeDef}, + schema::{Def, EnumDef, FieldDef, Schema, StructDef, TypeDef, TypeId}, utils::{FxIndexSet, format_cow, write_it}, }; @@ -26,12 +26,19 @@ impl Generator for TypescriptGenerator { /// Generate Typescript type definitions for all AST types. fn generate(&self, schema: &Schema, codegen: &Codegen) -> Output { let estree_derive_id = codegen.get_derive_id_by_name("ESTree"); + let program_type_id = schema.type_names["Program"]; let mut code = String::new(); let mut ast_node_names: Vec = vec![]; for type_def in &schema.types { if type_def.generates_derive(estree_derive_id) { - generate_ts_type_def(type_def, &mut code, &mut ast_node_names, schema); + generate_ts_type_def( + type_def, + &mut code, + &mut ast_node_names, + program_type_id, + schema, + ); } } @@ -52,6 +59,7 @@ fn generate_ts_type_def( type_def: &TypeDef, code: &mut String, ast_node_names: &mut Vec, + program_type_id: TypeId, schema: &Schema, ) { // Skip TS def generation if `#[estree(no_ts_def)]` attribute @@ -64,7 +72,7 @@ fn generate_ts_type_def( if !no_ts_def { let ts_def = match type_def { TypeDef::Struct(struct_def) => { - generate_ts_type_def_for_struct(struct_def, ast_node_names, schema) + generate_ts_type_def_for_struct(struct_def, ast_node_names, program_type_id, schema) } TypeDef::Enum(enum_def) => generate_ts_type_def_for_enum(enum_def, schema), _ => unreachable!(), @@ -90,6 +98,7 @@ fn generate_ts_type_def( fn generate_ts_type_def_for_struct( struct_def: &StructDef, ast_node_names: &mut Vec, + program_type_id: TypeId, schema: &Schema, ) -> Option { // If struct marked with `#[estree(ts_alias = "...")]`, then it needs no type def @@ -150,6 +159,11 @@ fn generate_ts_type_def_for_struct( } } + if !struct_def.estree.no_type { + let parent_type = if struct_def.id == program_type_id { "null" } else { "Node" }; + write_it!(fields_str, "\n\tparent?: {parent_type};"); + } + let ts_def = if extends.is_empty() { format!("export interface {type_name} {{{fields_str}\n}}") } else if output_as_type {