summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jsparagus-ast
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/jsparagus-ast
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/jsparagus-ast')
-rw-r--r--third_party/rust/jsparagus-ast/.cargo-checksum.json1
-rw-r--r--third_party/rust/jsparagus-ast/Cargo.toml24
-rw-r--r--third_party/rust/jsparagus-ast/ast.json728
-rwxr-xr-xthird_party/rust/jsparagus-ast/generate_ast.py1061
-rw-r--r--third_party/rust/jsparagus-ast/src/arena.rs85
-rw-r--r--third_party/rust/jsparagus-ast/src/associated_data.rs143
-rw-r--r--third_party/rust/jsparagus-ast/src/dump_generated.rs2269
-rw-r--r--third_party/rust/jsparagus-ast/src/lib.rs30
-rw-r--r--third_party/rust/jsparagus-ast/src/source_atom_set.rs221
-rw-r--r--third_party/rust/jsparagus-ast/src/source_location.rs32
-rw-r--r--third_party/rust/jsparagus-ast/src/source_location_accessor_generated.rs2047
-rw-r--r--third_party/rust/jsparagus-ast/src/source_slice_list.rs49
-rw-r--r--third_party/rust/jsparagus-ast/src/type_id_generated.rs712
-rw-r--r--third_party/rust/jsparagus-ast/src/types_generated.rs1055
-rw-r--r--third_party/rust/jsparagus-ast/src/visit_generated.rs5423
15 files changed, 13880 insertions, 0 deletions
diff --git a/third_party/rust/jsparagus-ast/.cargo-checksum.json b/third_party/rust/jsparagus-ast/.cargo-checksum.json
new file mode 100644
index 0000000000..24a6ac623d
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"a2ec3cc2de80074959295ecce7a6c5a491377c73ba5751ccbf59953cf2d0667a","ast.json":"e9c358aedb77bf02059f44179140d900c705af592069f269022bc9b52dc30ac4","generate_ast.py":"0c24431d9c07af42d7d17739c2e21465964151562437cfca093ceddde898bc93","src/arena.rs":"03ef07c963556160a6f1a85fd901833d7322f8a5f265c20d3e3543432dd2a96d","src/associated_data.rs":"5e0d830b0c6db4dcb85ba21ead87d31cd386e2517804333a6f46a1bd1bf59355","src/dump_generated.rs":"8ca0736952ee41fc932807e8450c6eb68e081b3fd5f7a0f701cae8b35dc0c13e","src/lib.rs":"b35553bedec9f6d88cc5194592f857dc13669559cbc8b206048c35299c4f86be","src/source_atom_set.rs":"24ec99be098cab6aa433d7b2e0a2cbc074204276d6c90b17174e50f8003244ee","src/source_location.rs":"3832440ecec6de726262837072810410bddb45c075288386509511c153f6afd9","src/source_location_accessor_generated.rs":"2669efcc5447229429f8fab6123bbd9dec8ed4c69232992af05aca3a59f1c710","src/source_slice_list.rs":"c82413b3081e091a3c4ce5d2c3624e54ecbeb0bb9952f10d373d10faf589955a","src/type_id_generated.rs":"a1e88f0d9d97d61339d0bedd0f6a8472bd39ea13968531ebce7140ca47edbaeb","src/types_generated.rs":"eda341459f8356dc46a6f8ed993740bcf1536c6b6601d885f2a20f4a7a4d4e4a","src/visit_generated.rs":"90ae82f2db8b33f5b23eae1b1b21f1ce4c14a79719bc46e44a838a04c7d838e4"},"package":null} \ No newline at end of file
diff --git a/third_party/rust/jsparagus-ast/Cargo.toml b/third_party/rust/jsparagus-ast/Cargo.toml
new file mode 100644
index 0000000000..e4556efb63
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/Cargo.toml
@@ -0,0 +1,24 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+name = "jsparagus-ast"
+version = "0.1.0"
+authors = ["khyperia <khyperia@live.com>"]
+license = "MIT/Apache-2.0"
+
+[dependencies]
+indexmap = "2.0"
+
+[dependencies.bumpalo]
+version = "3.4.0"
+features = ["collections"]
diff --git a/third_party/rust/jsparagus-ast/ast.json b/third_party/rust/jsparagus-ast/ast.json
new file mode 100644
index 0000000000..669a7b3256
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/ast.json
@@ -0,0 +1,728 @@
+{
+ "Void": {
+ "_type": "enum"
+ },
+ "Argument": {
+ "_type": "enum",
+ "SpreadElement": "Box<Expression>",
+ "Expression": "Box<Expression>"
+ },
+ "Arguments": {
+ "_type": "struct",
+ "args": "Vec<Argument>"
+ },
+ "Identifier": {
+ "_type": "struct",
+ "value": "SourceAtomSetIndex"
+ },
+ "IdentifierName": {
+ "_type": "struct",
+ "value": "SourceAtomSetIndex"
+ },
+ "PrivateIdentifier": {
+ "_type": "struct",
+ "value": "SourceAtomSetIndex"
+ },
+ "Label": {
+ "_type": "struct",
+ "value": "SourceAtomSetIndex"
+ },
+ "VariableDeclarationKind": {
+ "_type": "enum",
+ "Var": null,
+ "Let": null,
+ "Const": null
+ },
+ "CompoundAssignmentOperator": {
+ "_type": "enum",
+ "LogicalOr": null,
+ "LogicalAnd": null,
+ "Coalesce": null,
+ "Add": null,
+ "Sub": null,
+ "Mul": null,
+ "Div": null,
+ "Mod": null,
+ "Pow": null,
+ "LeftShift": null,
+ "RightShift": null,
+ "RightShiftExt": null,
+ "Or": null,
+ "Xor": null,
+ "And": null
+ },
+ "BinaryOperator": {
+ "_type": "enum",
+ "Equals": null,
+ "NotEquals": null,
+ "StrictEquals": null,
+ "StrictNotEquals": null,
+ "LessThan": null,
+ "LessThanOrEqual": null,
+ "GreaterThan": null,
+ "GreaterThanOrEqual": null,
+ "In": null,
+ "Instanceof": null,
+ "LeftShift": null,
+ "RightShift": null,
+ "RightShiftExt": null,
+ "Add": null,
+ "Sub": null,
+ "Mul": null,
+ "Div": null,
+ "Mod": null,
+ "Pow": null,
+ "Comma": null,
+ "Coalesce": null,
+ "LogicalOr": null,
+ "LogicalAnd": null,
+ "BitwiseOr": null,
+ "BitwiseXor": null,
+ "BitwiseAnd": null
+ },
+ "UnaryOperator": {
+ "_type": "enum",
+ "Plus": null,
+ "Minus": null,
+ "LogicalNot": null,
+ "BitwiseNot": null,
+ "Typeof": null,
+ "Void": null,
+ "Delete": null
+ },
+ "UpdateOperator": {
+ "_type": "enum",
+ "Increment": null,
+ "Decrement": null
+ },
+ "Function": {
+ "_type": "struct",
+ "name": "Option<BindingIdentifier>",
+ "is_async": "bool",
+ "is_generator": "bool",
+ "params": "FormalParameters",
+ "body": "FunctionBody"
+ },
+ "Program": {
+ "_type": "enum",
+ "Module": "Module",
+ "Script": "Script"
+ },
+ "IfStatement": {
+ "_type": "struct",
+ "test": "Box<Expression>",
+ "consequent": "Box<Statement>",
+ "alternate": "Option<Box<Statement>>"
+ },
+ "Statement": {
+ "_type": "enum",
+ "BlockStatement": {
+ "block": "Block"
+ },
+ "BreakStatement": {
+ "label": "Option<Label>"
+ },
+ "ContinueStatement": {
+ "label": "Option<Label>"
+ },
+ "DebuggerStatement": null,
+ "DoWhileStatement": {
+ "block": "Box<Statement>",
+ "test": "Box<Expression>"
+ },
+ "EmptyStatement": null,
+ "ExpressionStatement": "Box<Expression>",
+ "ForInStatement": {
+ "left": "VariableDeclarationOrAssignmentTarget",
+ "right": "Box<Expression>",
+ "block": "Box<Statement>"
+ },
+ "ForOfStatement": {
+ "left": "VariableDeclarationOrAssignmentTarget",
+ "right": "Box<Expression>",
+ "block": "Box<Statement>"
+ },
+ "ForStatement": {
+ "init": "Option<VariableDeclarationOrExpression>",
+ "test": "Option<Box<Expression>>",
+ "update": "Option<Box<Expression>>",
+ "block": "Box<Statement>"
+ },
+ "IfStatement": "IfStatement",
+ "LabelledStatement": {
+ "label": "Label",
+ "body": "Box<Statement>"
+ },
+ "ReturnStatement": {
+ "expression": "Option<Box<Expression>>"
+ },
+ "SwitchStatement": {
+ "discriminant": "Box<Expression>",
+ "cases": "Vec<SwitchCase>"
+ },
+ "SwitchStatementWithDefault": {
+ "discriminant": "Box<Expression>",
+ "pre_default_cases": "Vec<SwitchCase>",
+ "default_case": "SwitchDefault",
+ "post_default_cases": "Vec<SwitchCase>"
+ },
+ "ThrowStatement": {
+ "expression": "Box<Expression>"
+ },
+ "TryCatchStatement": {
+ "body": "Block",
+ "catch_clause": "CatchClause"
+ },
+ "TryFinallyStatement": {
+ "body": "Block",
+ "catch_clause": "Option<CatchClause>",
+ "finalizer": "Block"
+ },
+ "WhileStatement": {
+ "test": "Box<Expression>",
+ "block": "Box<Statement>"
+ },
+ "WithStatement": {
+ "object": "Box<Expression>",
+ "body": "Box<Statement>"
+ },
+ "VariableDeclarationStatement": "VariableDeclaration",
+ "FunctionDeclaration": "Function",
+ "ClassDeclaration": "ClassDeclaration"
+ },
+ "Expression": {
+ "_type": "enum",
+ "MemberExpression": "MemberExpression",
+ "ClassExpression": "ClassExpression",
+ "LiteralBooleanExpression": {
+ "value": "bool"
+ },
+ "LiteralInfinityExpression": null,
+ "LiteralNullExpression": null,
+ "LiteralNumericExpression": "NumericLiteral",
+ "LiteralRegExpExpression": {
+ "pattern": "SourceSliceIndex",
+ "global": "bool",
+ "ignore_case": "bool",
+ "multi_line": "bool",
+ "dot_all": "bool",
+ "sticky": "bool",
+ "unicode": "bool"
+ },
+ "LiteralStringExpression": {
+ "value": "SourceAtomSetIndex"
+ },
+ "ArrayExpression": "ArrayExpression",
+ "ArrowExpression": {
+ "is_async": "bool",
+ "params": "FormalParameters",
+ "body": "ArrowExpressionBody"
+ },
+ "AssignmentExpression": {
+ "binding": "AssignmentTarget",
+ "expression": "Box<Expression>"
+ },
+ "BinaryExpression": {
+ "operator": "BinaryOperator",
+ "left": "Box<Expression>",
+ "right": "Box<Expression>"
+ },
+ "CallExpression": "CallExpression",
+ "CompoundAssignmentExpression": {
+ "operator": "CompoundAssignmentOperator",
+ "binding": "SimpleAssignmentTarget",
+ "expression": "Box<Expression>"
+ },
+ "ConditionalExpression": {
+ "test": "Box<Expression>",
+ "consequent": "Box<Expression>",
+ "alternate": "Box<Expression>"
+ },
+ "FunctionExpression": "Function",
+ "IdentifierExpression": "IdentifierExpression",
+ "NewExpression": {
+ "callee": "Box<Expression>",
+ "arguments": "Arguments"
+ },
+ "NewTargetExpression": null,
+ "ObjectExpression": "ObjectExpression",
+ "OptionalExpression": {
+ "object": "ExpressionOrSuper",
+ "tail": "Box<Expression>"
+ },
+ "OptionalChain": "OptionalChain",
+ "UnaryExpression": {
+ "operator": "UnaryOperator",
+ "operand": "Box<Expression>"
+ },
+ "TemplateExpression": "TemplateExpression",
+ "ThisExpression": null,
+ "UpdateExpression": {
+ "is_prefix": "bool",
+ "operator": "UpdateOperator",
+ "operand": "SimpleAssignmentTarget"
+ },
+ "YieldExpression": {
+ "expression": "Option<Box<Expression>>"
+ },
+ "YieldGeneratorExpression": {
+ "expression": "Box<Expression>"
+ },
+ "AwaitExpression": {
+ "expression": "Box<Expression>"
+ },
+ "ImportCallExpression": {
+ "argument": "Box<Expression>"
+ }
+ },
+ "MemberExpression": {
+ "_type": "enum",
+ "ComputedMemberExpression": "ComputedMemberExpression",
+ "StaticMemberExpression": "StaticMemberExpression",
+ "PrivateFieldExpression": "PrivateFieldExpression"
+ },
+ "OptionalChain": {
+ "_type": "enum",
+ "ComputedMemberExpressionTail": {
+ "expression": "Box<Expression>"
+ },
+ "StaticMemberExpressionTail": {
+ "property": "IdentifierName"
+ },
+ "PrivateFieldExpressionTail": {
+ "field": "PrivateIdentifier"
+ },
+ "CallExpressionTail": {
+ "arguments": "Arguments"
+ },
+ "ComputedMemberExpression": "ComputedMemberExpression",
+ "StaticMemberExpression": "StaticMemberExpression",
+ "PrivateFieldExpression": "PrivateFieldExpression",
+ "CallExpression": "CallExpression"
+ },
+ "PropertyName": {
+ "_type": "enum",
+ "ComputedPropertyName": "ComputedPropertyName",
+ "StaticPropertyName": "StaticPropertyName",
+ "StaticNumericPropertyName": "NumericLiteral"
+ },
+ "CallExpression": {
+ "_type": "struct",
+ "callee": "ExpressionOrSuper",
+ "arguments": "Arguments"
+ },
+ "ClassElementName": {
+ "_type": "enum",
+ "ComputedPropertyName": "ComputedPropertyName",
+ "StaticPropertyName": "StaticPropertyName",
+ "StaticNumericPropertyName": "NumericLiteral",
+ "PrivateFieldName": "PrivateIdentifier"
+ },
+ "ObjectProperty": {
+ "_type": "enum",
+ "NamedObjectProperty": "NamedObjectProperty",
+ "ShorthandProperty": "ShorthandProperty",
+ "SpreadProperty": "Box<Expression>"
+ },
+ "NamedObjectProperty": {
+ "_type": "enum",
+ "MethodDefinition": "MethodDefinition",
+ "DataProperty": "DataProperty"
+ },
+ "MethodDefinition": {
+ "_type": "enum",
+ "Method": "Method",
+ "Getter": "Getter",
+ "Setter": "Setter"
+ },
+ "ImportDeclaration": {
+ "_type": "enum",
+ "Import": "Import",
+ "ImportNamespace": "ImportNamespace"
+ },
+ "ExportDeclaration": {
+ "_type": "enum",
+ "ExportAllFrom": "ExportAllFrom",
+ "ExportFrom": "ExportFrom",
+ "ExportLocals": "ExportLocals",
+ "Export": "Export",
+ "ExportDefault": "ExportDefault"
+ },
+ "VariableReference": {
+ "_type": "enum",
+ "BindingIdentifier": "BindingIdentifier",
+ "AssignmentTargetIdentifier": "AssignmentTargetIdentifier"
+ },
+ "BindingPattern": {
+ "_type": "enum",
+ "ObjectBinding": "ObjectBinding",
+ "ArrayBinding": "ArrayBinding"
+ },
+ "Binding": {
+ "_type": "enum",
+ "BindingPattern": "BindingPattern",
+ "BindingIdentifier": "BindingIdentifier"
+ },
+ "SimpleAssignmentTarget": {
+ "_type": "enum",
+ "AssignmentTargetIdentifier": "AssignmentTargetIdentifier",
+ "MemberAssignmentTarget": "MemberAssignmentTarget"
+ },
+ "AssignmentTargetPattern": {
+ "_type": "enum",
+ "ArrayAssignmentTarget": "ArrayAssignmentTarget",
+ "ObjectAssignmentTarget": "ObjectAssignmentTarget"
+ },
+ "AssignmentTarget": {
+ "_type": "enum",
+ "AssignmentTargetPattern": "AssignmentTargetPattern",
+ "SimpleAssignmentTarget": "SimpleAssignmentTarget"
+ },
+ "Parameter": {
+ "_type": "enum",
+ "Binding": "Binding",
+ "BindingWithDefault": "BindingWithDefault"
+ },
+ "BindingWithDefault": {
+ "_type": "struct",
+ "binding": "Binding",
+ "init": "Box<Expression>"
+ },
+ "BindingIdentifier": {
+ "_type": "struct",
+ "name": "Identifier"
+ },
+ "AssignmentTargetIdentifier": {
+ "_type": "struct",
+ "name": "Identifier"
+ },
+ "ExpressionOrSuper": {
+ "_type": "enum",
+ "Expression": "Box<Expression>",
+ "Super": null
+ },
+ "MemberAssignmentTarget": {
+ "_type": "enum",
+ "ComputedMemberAssignmentTarget": "ComputedMemberAssignmentTarget",
+ "PrivateFieldAssignmentTarget": "PrivateFieldAssignmentTarget",
+ "StaticMemberAssignmentTarget": "StaticMemberAssignmentTarget"
+ },
+ "ComputedMemberAssignmentTarget": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "expression": "Box<Expression>"
+ },
+ "PrivateFieldAssignmentTarget": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "field": "PrivateIdentifier"
+ },
+ "StaticMemberAssignmentTarget": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "property": "IdentifierName"
+ },
+ "ArrayBinding": {
+ "_type": "struct",
+ "elements": "Vec<Option<Parameter>>",
+ "rest": "Option<Box<Binding>>"
+ },
+ "ObjectBinding": {
+ "_type": "struct",
+ "properties": "Vec<BindingProperty>",
+ "rest": "Option<Box<BindingIdentifier>>"
+ },
+ "BindingProperty": {
+ "_type": "enum",
+ "BindingPropertyIdentifier": "BindingPropertyIdentifier",
+ "BindingPropertyProperty": "BindingPropertyProperty"
+ },
+ "BindingPropertyIdentifier": {
+ "_type": "struct",
+ "binding": "BindingIdentifier",
+ "init": "Option<Box<Expression>>"
+ },
+ "BindingPropertyProperty": {
+ "_type": "struct",
+ "name": "PropertyName",
+ "binding": "Parameter"
+ },
+ "AssignmentTargetWithDefault": {
+ "_type": "struct",
+ "binding": "AssignmentTarget",
+ "init": "Box<Expression>"
+ },
+ "AssignmentTargetMaybeDefault": {
+ "_type": "enum",
+ "AssignmentTarget": "AssignmentTarget",
+ "AssignmentTargetWithDefault": "AssignmentTargetWithDefault"
+ },
+ "ArrayAssignmentTarget": {
+ "_type": "struct",
+ "elements": "Vec<Option<AssignmentTargetMaybeDefault>>",
+ "rest": "Option<Box<AssignmentTarget>>"
+ },
+ "ObjectAssignmentTarget": {
+ "_type": "struct",
+ "properties": "Vec<AssignmentTargetProperty>",
+ "rest": "Option<Box<AssignmentTarget>>"
+ },
+ "AssignmentTargetProperty": {
+ "_type": "enum",
+ "AssignmentTargetPropertyIdentifier": "AssignmentTargetPropertyIdentifier",
+ "AssignmentTargetPropertyProperty": "AssignmentTargetPropertyProperty"
+ },
+ "AssignmentTargetPropertyIdentifier": {
+ "_type": "struct",
+ "binding": "AssignmentTargetIdentifier",
+ "init": "Option<Box<Expression>>"
+ },
+ "AssignmentTargetPropertyProperty": {
+ "_type": "struct",
+ "name": "PropertyName",
+ "binding": "AssignmentTargetMaybeDefault"
+ },
+ "ClassExpression": {
+ "_type": "struct",
+ "name": "Option<BindingIdentifier>",
+ "super_": "Option<Box<Expression>>",
+ "elements": "Vec<Box<ClassElement>>"
+ },
+ "ClassDeclaration": {
+ "_type": "struct",
+ "name": "BindingIdentifier",
+ "super_": "Option<Box<Expression>>",
+ "elements": "Vec<Box<ClassElement>>"
+ },
+ "ClassElement": {
+ "_type": "enum",
+ "MethodDefinition": {
+ "is_static": "bool",
+ "method": "MethodDefinition"
+ },
+ "FieldDefinition": {
+ "name": "ClassElementName",
+ "init": "Option<Box<Expression>>"
+ }
+ },
+ "ModuleItems": {
+ "_type": "enum",
+ "ImportDeclaration": "ImportDeclaration",
+ "ExportDeclaration": "ExportDeclaration",
+ "Statement": "Box<Statement>"
+ },
+ "Module": {
+ "_type": "struct",
+ "directives": "Vec<Directive>",
+ "items": "Vec<ModuleItems>"
+ },
+ "Import": {
+ "_type": "struct",
+ "module_specifier": "SourceAtomSetIndex",
+ "default_binding": "Option<BindingIdentifier>",
+ "named_imports": "Vec<ImportSpecifier>"
+ },
+ "ImportNamespace": {
+ "_type": "struct",
+ "module_specifier": "SourceAtomSetIndex",
+ "default_binding": "Option<BindingIdentifier>",
+ "namespace_binding": "BindingIdentifier"
+ },
+ "ImportSpecifier": {
+ "_type": "struct",
+ "name": "Option<IdentifierName>",
+ "binding": "BindingIdentifier"
+ },
+ "ExportAllFrom": {
+ "_type": "struct",
+ "module_specifier": "SourceAtomSetIndex"
+ },
+ "ExportFrom": {
+ "_type": "struct",
+ "named_exports": "Vec<ExportFromSpecifier>",
+ "module_specifier": "SourceAtomSetIndex"
+ },
+ "ExportLocals": {
+ "_type": "struct",
+ "named_exports": "Vec<ExportLocalSpecifier>"
+ },
+ "Export": {
+ "_type": "enum",
+ "FunctionDeclaration": "Function",
+ "ClassDeclaration": "ClassDeclaration",
+ "VariableDeclaration": "VariableDeclaration"
+ },
+ "ExportDefault": {
+ "_type": "enum",
+ "FunctionDeclaration": "Function",
+ "ClassDeclaration": "ClassDeclaration",
+ "Expression": "Box<Expression>"
+ },
+ "ExportFromSpecifier": {
+ "_type": "struct",
+ "name": "IdentifierName",
+ "exported_name": "Option<IdentifierName>"
+ },
+ "ExportLocalSpecifier": {
+ "_type": "struct",
+ "name": "IdentifierExpression",
+ "exported_name": "Option<IdentifierName>"
+ },
+ "Method": {
+ "_type": "struct",
+ "name": "ClassElementName",
+ "is_async": "bool",
+ "is_generator": "bool",
+ "params": "FormalParameters",
+ "body": "FunctionBody"
+ },
+ "Getter": {
+ "_type": "struct",
+ "property_name": "ClassElementName",
+ "body": "FunctionBody"
+ },
+ "Setter": {
+ "_type": "struct",
+ "property_name": "ClassElementName",
+ "param": "Parameter",
+ "body": "FunctionBody"
+ },
+ "DataProperty": {
+ "_type": "struct",
+ "property_name": "PropertyName",
+ "expression": "Box<Expression>"
+ },
+ "ShorthandProperty": {
+ "_type": "struct",
+ "name": "IdentifierExpression"
+ },
+ "ComputedPropertyName": {
+ "_type": "struct",
+ "expression": "Box<Expression>"
+ },
+ "StaticPropertyName": {
+ "_type": "struct",
+ "value": "SourceAtomSetIndex"
+ },
+ "NumericLiteral": {
+ "_type": "struct",
+ "value": "f64"
+ },
+ "ArrayExpressionElement": {
+ "_type": "enum",
+ "SpreadElement": "Box<Expression>",
+ "Expression": "Box<Expression>",
+ "Elision": null
+ },
+ "ArrayExpression": {
+ "_type": "struct",
+ "elements": "Vec<ArrayExpressionElement>"
+ },
+ "ArrowExpressionBody": {
+ "_type": "enum",
+ "FunctionBody": "FunctionBody",
+ "Expression": "Box<Expression>"
+ },
+ "ComputedMemberExpression": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "expression": "Box<Expression>"
+ },
+ "IdentifierExpression": {
+ "_type": "struct",
+ "name": "Identifier"
+ },
+ "ObjectExpression": {
+ "_type": "struct",
+ "properties": "Vec<Box<ObjectProperty>>"
+ },
+ "StaticMemberExpression": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "property": "IdentifierName"
+ },
+ "PrivateFieldExpression": {
+ "_type": "struct",
+ "object": "ExpressionOrSuper",
+ "field": "PrivateIdentifier"
+ },
+ "TemplateExpressionElement": {
+ "_type": "enum",
+ "Expression": "Box<Expression>",
+ "TemplateElement": "TemplateElement"
+ },
+ "TemplateExpression": {
+ "_type": "struct",
+ "tag": "Option<Box<Expression>>",
+ "elements": "Vec<TemplateExpressionElement>"
+ },
+ "VariableDeclarationOrAssignmentTarget": {
+ "_type": "enum",
+ "VariableDeclaration": "VariableDeclaration",
+ "AssignmentTarget": "AssignmentTarget"
+ },
+ "VariableDeclarationOrExpression": {
+ "_type": "enum",
+ "VariableDeclaration": "VariableDeclaration",
+ "Expression": "Box<Expression>"
+ },
+ "Block": {
+ "_type": "struct",
+ "statements": "Vec<Statement>",
+ "declarations": "Option<Vec<SourceAtomSetIndex>>"
+ },
+ "CatchClause": {
+ "_type": "struct",
+ "binding": "Option<Box<Binding>>",
+ "body": "Block"
+ },
+ "Directive": {
+ "_type": "struct",
+ "raw_value": "SourceAtomSetIndex"
+ },
+ "FormalParameters": {
+ "_type": "struct",
+ "items": "Vec<Parameter>",
+ "rest": "Option<Binding>"
+ },
+ "FunctionBody": {
+ "_type": "struct",
+ "directives": "Vec<Directive>",
+ "statements": "Vec<Statement>"
+ },
+ "Script": {
+ "_type": "struct",
+ "directives": "Vec<Directive>",
+ "statements": "Vec<Statement>"
+ },
+ "SwitchCase": {
+ "_type": "struct",
+ "test": "Box<Expression>",
+ "consequent": "Vec<Statement>"
+ },
+ "SwitchDefault": {
+ "_type": "struct",
+ "consequent": "Vec<Statement>"
+ },
+ "TemplateElement": {
+ "_type": "struct",
+ "raw_value": "SourceAtomSetIndex"
+ },
+ "VariableDeclaration": {
+ "_type": "struct",
+ "kind": "VariableDeclarationKind",
+ "declarators": "Vec<VariableDeclarator>"
+ },
+ "VariableDeclarator": {
+ "_type": "struct",
+ "binding": "Binding",
+ "init": "Option<Box<Expression>>"
+ },
+ "CoverParenthesized": {
+ "_type": "enum",
+ "Expression": {
+ "expression": "Box<Expression>"
+ },
+ "Parameters": "Box<FormalParameters>"
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/generate_ast.py b/third_party/rust/jsparagus-ast/generate_ast.py
new file mode 100755
index 0000000000..dab3f96aac
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/generate_ast.py
@@ -0,0 +1,1061 @@
+#!/usr/bin/env python3
+
+import json
+import os
+import re
+import collections
+import textwrap
+
+
+RUST_BUILTIN_TYPES = {
+ 'bool',
+ 'f64',
+}
+
+RUST_PARAMETERIZED_TYPES = {
+ 'Option',
+ 'Vec',
+}
+
+
+# name is a string; params is a tuple of 0 or more Types.
+TypeBase = collections.namedtuple("Type", "name params")
+
+
+class Type(TypeBase):
+ def __new__(cls, name, params=()):
+ params = tuple(params)
+ for p in params:
+ if not isinstance(p, Type):
+ raise ValueError("type parameters must be types, got {!r}".format(p))
+ return TypeBase.__new__(cls, name, params)
+
+ def __str__(self):
+ if self.params == ():
+ return self.name
+ return self.name + "<{}>".format(", ".join(map(str, self.params)))
+
+ def __repr__(self):
+ if self.params == ():
+ return 'Type({!r})'.format(self.name)
+ return 'Type({!r}, {!r})'.format(self.name, list(self.params))
+
+ def to_rust_type(self, ast):
+ params_str = ", ".join(p.to_rust_type(ast) for p in self.params)
+ if self.name == 'Option':
+ return "Option<{}>".format(params_str)
+ if self.name == 'Box':
+ return "arena::Box<'alloc, {}>".format(params_str)
+ if self.name == 'Vec':
+ return "arena::Vec<'alloc, {}>".format(params_str)
+ if self.name in RUST_PARAMETERIZED_TYPES:
+ return "{}<{}>".format(self.name, params_str)
+ if self.params:
+ return "{}<'alloc, {}>".format(self.name, params_str)
+ if self.name in RUST_BUILTIN_TYPES:
+ return self.name
+ if self.name == 'Token':
+ return "Token"
+ if self.name in ast.type_decls and ast.type_decls[self.name].has_lifetime:
+ return "{}<'alloc>".format(self.name)
+ return self.name
+
+ def rust_variant_name(self):
+ if self.name == 'Vec':
+ return 'Vec' + self.params[0].rust_variant_name()
+ if self.name == 'Box':
+ return self.params[0].rust_variant_name()
+ return self.name
+
+
+def parse_type(ty):
+ """Parse a type, in the minilanguage used by ast.json, into a Type object.
+
+ A simple type like String parses as `Type("String", ())`; a parameterized type
+ like `Vec<String>` parses as `Type("Vec", ("String",))`;
+ nested parameterized types parse as nested Type objects.
+ """
+ ident_re = re.compile(r'^(?:\w|_)+$')
+ token_re = re.compile(r'(?s)\s*((?:\w|_)+|.)\s*')
+ tokens = token_re.finditer(ty)
+
+ current = None
+
+ def consume(token=None):
+ nonlocal current
+ assert token is None or token == current
+ current = next(tokens, None)
+ if current is not None:
+ current = current.group(1)
+
+ consume(None) # load the first token into `current`
+
+ def is_ident():
+ """True if the current token is an identifier"""
+ return current is not None and ident_re.match(current) is not None
+
+ def parse_params():
+ params = []
+ while current != '>':
+ params.append(parse_ty())
+ if current == ',':
+ consume(',')
+ return params
+
+ def parse_ty():
+ if not is_ident():
+ raise ValueError("parse error in type {!r}".format(ty))
+ name = current
+ consume()
+ if current == '<':
+ consume('<')
+ params = parse_params()
+ if current != '>':
+ raise ValueError("parse error in type {!r} (expected `>`)".format(ty))
+ consume('>')
+ return Type(name, params)
+ return Type(name)
+
+ result = parse_ty()
+ if current is not None:
+ raise ValueError("parse error in type {!r} (extra stuff at end)".format(ty))
+ return result
+
+
+assert parse_type('Statement') == Type('Statement')
+assert parse_type('Box<T>') == Type('Box', [Type('T')])
+assert parse_type("Vec<Box<Expression>>") == Type('Vec', [Type('Box', [Type('Expression')])])
+
+
+def write_impl(f, indentation, string, *format_args):
+ if len(format_args) == 0:
+ formatted = string
+ if '\n' in formatted:
+ cut = formatted.rindex("\n")
+ if formatted[cut:].isspace():
+ formatted = formatted[:cut]
+ formatted = textwrap.dedent(formatted.rstrip())
+ else:
+ formatted = string.format(*format_args)
+ f.write(" " * indentation + formatted + "\n")
+
+
+def to_snek_case(ident):
+ # https://stackoverflow.com/questions/1175208
+ s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', ident)
+ return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
+
+
+EXTRA_STACK_VALUE_TYPE_NAMES = [
+ "Token",
+ "Vec<SwitchCase>",
+ "Vec<Statement>",
+ "Vec<VariableDeclarator>",
+ "Vec<ArrayExpressionElement>",
+ "Vec<Box<ClassElement>>",
+ "Vec<BindingProperty>",
+ "Vec<Option<Parameter>>",
+]
+
+
+def collect_stack_value_types(ast):
+ types = {}
+ for name, type_decl in ast.type_decls.items():
+ ty = parse_type(name)
+ if ty in types:
+ raise ValueError("type occurs twice with different spellings: {!r} and {!r}"
+ .format(name, types[ty]))
+ types[ty] = name
+
+ types = set(types.keys())
+ for name in EXTRA_STACK_VALUE_TYPE_NAMES:
+ types.add(parse_type(name))
+
+ return sorted(types)
+
+
+def stack_value(ast):
+ types = collect_stack_value_types(ast)
+ with open("../generated_parser/src/stack_value_generated.rs", "w+") as f:
+ def write(*args):
+ write_impl(f, *args)
+ write(0, """\
+ // WARNING: This file is auto-generated by crates/ast/generate_ast.py.
+
+ use crate::token::Token;
+ use ast::arena;
+ use ast::types::*;
+ use std::convert::Infallible;
+
+ pub type AstError = String;
+ type AstResult<'alloc, T> = Result<arena::Box<'alloc, T>, AstError>;
+
+ #[derive(Debug)]
+ pub enum StackValue<'alloc> {
+ """)
+
+ for ty in types:
+ write(1, "{}({}),", ty.rust_variant_name(), Type('Box', [ty]).to_rust_type(ast))
+
+ write(0, """\
+ }
+
+ impl<'alloc> StackValue<'alloc> {
+ pub fn to_ast<T: StackValueItem<'alloc>>(self) -> AstResult<'alloc, T> {
+ T::to_ast(self)
+ }
+ }
+
+ pub trait StackValueItem<'alloc>: Sized {
+ fn to_ast(sv: StackValue<'alloc>) -> AstResult<'alloc, Self>;
+ }
+
+ /// Values that can be converted to StackValues, fallibly.
+ pub trait TryIntoStack<'alloc> {
+ type Error;
+ fn try_into_stack(self) -> Result<StackValue<'alloc>, Self::Error>;
+ }
+ """)
+
+ for ty in types:
+ write(0, "impl<'alloc> StackValueItem<'alloc> for {} {{", ty.to_rust_type(ast))
+ write(1, "fn to_ast(sv: StackValue<'alloc>) -> AstResult<'alloc, Self> {")
+ write(2, "match sv {")
+ write(3, "StackValue::{}(v) => Ok(v),", ty.rust_variant_name())
+ write(3, "_ => Err(format!(\"StackValue expected {}, got {{:?}}\", sv)),", ty)
+ write(2, "}")
+ write(1, "}")
+ write(0, "}")
+ write(0, "")
+ for ty in types:
+ rust_ty = ty.to_rust_type(ast)
+ write(0, "impl<'alloc> TryIntoStack<'alloc> for arena::Box<'alloc, {}> {{", rust_ty)
+ write(1, "type Error = Infallible;")
+ write(1, "fn try_into_stack(self) -> Result<StackValue<'alloc>, Infallible> {")
+ write(2, "Ok(StackValue::{}(self))", ty.rust_variant_name())
+ write(1, "}")
+ write(0, "}")
+ write(0, "")
+ write(0, """\
+ impl<'alloc, T, E> TryIntoStack<'alloc> for Result<T, E>
+ where
+ T: TryIntoStack<'alloc>,
+ E: From<T::Error>,
+ {
+ type Error = E;
+ fn try_into_stack(self) -> Result<StackValue<'alloc>, E> {
+ Ok(self?.try_into_stack()?)
+ }
+ }
+ """)
+
+
+def loc_trait(ast):
+ types = collect_stack_value_types(ast)
+ with open("src/source_location_accessor_generated.rs", "w+") as f:
+ def write(*args):
+ write_impl(f, *args)
+ write(0, """\
+ // WARNING: This file is auto-generated by crates/ast/generate_ast.py.
+
+ use crate::SourceLocation;
+ use crate::arena;
+ use crate::types::*;
+ use std::borrow::{Borrow, BorrowMut};
+
+ pub trait SourceLocationAccessor {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation);
+ fn get_loc(&self) -> SourceLocation;
+ }
+
+ """)
+
+ extra_types = []
+
+ def define_accessor(ty):
+ if ty.name in ['Box', 'Token', 'Vec', 'Void']:
+ return
+
+ if ty.name not in ast.type_decls:
+ raise ValueError("unhandlable type {!r}".format(ty.name))
+
+ rust_ty = ty.to_rust_type(ast)
+ decl = ast.type_decls[ty.name]
+
+ write(0, "impl<'alloc> SourceLocationAccessor for {} {{", rust_ty)
+ if isinstance(decl, Struct):
+ write(1, "fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {")
+ write(2, "self.loc.start = start.start;")
+ write(2, "self.loc.end = end.end;")
+ write(1, "}")
+ write(0, "")
+ write(1, "fn get_loc(&self) -> SourceLocation {")
+ write(2, "self.loc")
+ write(1, "}")
+ elif isinstance(decl, Enum):
+ write(1, "fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {")
+ write(2, "match self {")
+ for variant_name, variant_ty in decl.variants.items():
+ if variant_ty is None:
+ write(3, "{}::{} {{ mut loc }} => {{", ty.name, variant_name)
+ write(4, "loc.start = start.start;")
+ write(4, "loc.end = end.end;")
+ write(3, "}}", ty.name, variant_name)
+ elif isinstance(variant_ty, dict):
+ write(3, "{}::{} {{ mut loc, .. }} => {{", ty.name, variant_name)
+ write(4, "loc.start = start.start;")
+ write(4, "loc.end = end.end;")
+ write(3, "}")
+ else:
+ write(3, "{}::{}(content) => {{ content.set_loc(start, end) }}",
+ ty.name, variant_name)
+ if variant_ty not in extra_types and variant_ty not in types:
+ extra_types.append(variant_ty)
+ write(2, "}")
+ write(1, "}")
+ write(0, "")
+ write(1, "fn get_loc(&self) -> SourceLocation {")
+ write(2, "match self {")
+ for variant_name, variant_ty in decl.variants.items():
+ if variant_ty is None:
+ write(3, "{}::{} {{ loc }} => {{", ty.name, variant_name)
+ write(4, "*loc")
+ write(3, "}}", ty.name, variant_name)
+ elif isinstance(variant_ty, dict):
+ write(3, "{}::{} {{ loc, .. }} => {{", ty.name, variant_name)
+ write(4, "*loc")
+ write(3, "}")
+ else:
+ write(3, "{}::{}(content) => {{ content.get_loc() }}",
+ ty.name, variant_name)
+ write(2, "}")
+ write(1, "}")
+ else:
+ raise ValueError("unhandlable type {!r}".format(types[ty]))
+
+ write(0, "}")
+ write(0, "")
+
+ for ty in types:
+ define_accessor(ty)
+
+ for ty in extra_types:
+ define_accessor(ty)
+
+ write(0, "impl<'alloc, T> SourceLocationAccessor for arena::Box<'alloc, T>")
+ write(0, "where")
+ write(1, "T: SourceLocationAccessor,")
+ write(0, "{")
+ write(1, "fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {")
+ write(2, "(self.borrow_mut() as &mut T).set_loc(start, end)")
+ write(1, "}")
+ write(0, "")
+ write(1, "fn get_loc(&self) -> SourceLocation {")
+ write(2, "(self.borrow() as &T).get_loc()")
+ write(1, "}")
+ write(0, "}")
+
+
+def pass_(ast):
+ with open("src/visit_generated.rs", "w+") as f:
+ def write(*args):
+ write_impl(f, *args)
+
+ def to_method_name(name):
+ return "visit_{}".format(to_snek_case(name))
+
+ def to_enum_method_name(enum_name, variant_name):
+ return "visit_enum_{}_variant_{}".format(to_snek_case(enum_name),
+ to_snek_case(variant_name))
+
+ def to_enter_method_name(name):
+ return "enter_{}".format(to_snek_case(name))
+
+ def to_enter_enum_method_name(enum_name, variant_name):
+ return "enter_enum_{}_variant_{}".format(to_snek_case(enum_name),
+ to_snek_case(variant_name))
+
+ def to_leave_method_name(name):
+ return "leave_{}".format(to_snek_case(name))
+
+ def to_leave_enum_method_name(enum_name, variant_name):
+ return "leave_enum_{}_variant_{}".format(to_snek_case(enum_name),
+ to_snek_case(variant_name))
+
+ # --- Pass ---
+
+ def emit_call(indent, ty, var):
+ if ty.name == 'Vec':
+ write(indent, "for item in {} {{", var)
+ emit_call(indent + 1, ty.params[0], "item")
+ write(indent, "}")
+ elif ty.name == 'Option':
+ write(indent, "if let Some(item) = {} {{", var)
+ emit_call(indent + 1, ty.params[0], "item")
+ write(indent, "}")
+ elif ty.name in RUST_BUILTIN_TYPES:
+ pass
+ elif ty.name == "SourceAtomSetIndex":
+ pass
+ elif ty.name == "SourceSliceIndex":
+ pass
+ elif ty.name == 'Box':
+ write(indent, "self.{}({});", to_method_name(ty.params[0].name), var)
+ else:
+ write(indent, "self.{}({});", to_method_name(ty.name), var)
+
+ def emit_variant_dict_call(indent, enum_name, variant_name,
+ variant_type):
+ write(indent, "self.{}(",
+ to_enum_method_name(enum_name, variant_name))
+ for field_name, field_ty in variant_type.items():
+ write(indent + 1, "{},", field_name)
+ write(indent, ")")
+
+ def emit_variant_tuple_call(indent, enum_name, variant_name, param):
+ write(indent, "self.{}({})",
+ to_enum_method_name(enum_name, variant_name),
+ param)
+
+ def emit_variant_none_call(indent, enum_name, variant_name):
+ write(indent, "self.{}()",
+ to_enum_method_name(enum_name, variant_name))
+
+ write(0, "// WARNING: This file is auto-generated.")
+ write(0, "")
+ write(0, "#![allow(unused_mut)]")
+ write(0, "#![allow(unused_parens)]")
+ write(0, "#![allow(unused_variables)]")
+ write(0, "#![allow(dead_code)]")
+ write(0, "")
+ write(0, "use crate::arena;")
+ write(0, "use crate::source_atom_set::SourceAtomSetIndex;")
+ write(0, "use crate::source_slice_list::SourceSliceIndex;")
+ write(0, "use crate::types::*;")
+ write(0, "")
+ write(0, "pub trait Pass<'alloc> {")
+ for name, type_decl in ast.type_decls.items():
+ if name == "Void":
+ # Hack in a quick fix
+ continue
+
+ write(1, "fn {}(&mut self, ast: &'alloc {}) {{",
+ to_method_name(type_decl.name), Type(name).to_rust_type(ast))
+
+ write(2, "self.{}(ast);",
+ to_enter_method_name(type_decl.name))
+
+ type_decl.write_rust_pass_method_body(write, emit_call,
+ emit_variant_dict_call,
+ emit_variant_tuple_call,
+ emit_variant_none_call)
+
+ write(2, "self.{}(ast);",
+ to_leave_method_name(type_decl.name))
+
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(&mut self, ast: &'alloc {}) {{",
+ to_enter_method_name(type_decl.name),
+ Type(name).to_rust_type(ast))
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(&mut self, ast: &'alloc {}) {{",
+ to_leave_method_name(type_decl.name),
+ Type(name).to_rust_type(ast))
+ write(1, "}")
+ write(0, "")
+
+ if isinstance(type_decl, Enum):
+ for variant_name, variant_type in type_decl.variants.items():
+ if variant_type is None:
+ write(1, "fn {}(&mut self) {{",
+ to_enum_method_name(type_decl.name,
+ variant_name)),
+ write(1, "}")
+ write(0, "")
+ elif isinstance(variant_type, dict):
+ def write_field_params(indent, write, variant_type,
+ ast):
+ for field_name, field_ty in variant_type.items():
+ write(2, "{}: &'alloc {},",
+ field_name, field_ty.to_rust_type(ast))
+
+ write(1, "fn {}(",
+ to_enum_method_name(type_decl.name,
+ variant_name)),
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+
+ write(2, "self.{}(",
+ to_enter_enum_method_name(type_decl.name,
+ variant_name))
+ for field_name, field_ty in variant_type.items():
+ write(3, "{},", field_name)
+ write(2, ");")
+
+ type_decl.write_rust_pass_variant_dict_method_body(
+ emit_call, variant_type)
+
+ write(2, "self.{}(",
+ to_leave_enum_method_name(type_decl.name,
+ variant_name))
+ for field_name, field_ty in variant_type.items():
+ write(3, "{},", field_name)
+ write(2, ");")
+
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(",
+ to_enter_enum_method_name(type_decl.name,
+ variant_name))
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(",
+ to_leave_enum_method_name(type_decl.name,
+ variant_name))
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+ write(1, "}")
+ write(0, "")
+ else:
+ def write_field_params(indent, write, variant_type,
+ ast):
+ write(2, "ast: &'alloc {},",
+ variant_type.to_rust_type(ast))
+
+ write(1, "fn {}(",
+ to_enum_method_name(type_decl.name,
+ variant_name)),
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+
+ write(2, "self.{}(ast);",
+ to_enter_enum_method_name(type_decl.name,
+ variant_name))
+
+ type_decl.write_rust_pass_variant_tuple_method_body(
+ emit_call, variant_type, "ast")
+
+ write(2, "self.{}(ast);",
+ to_leave_enum_method_name(type_decl.name,
+ variant_name))
+
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(",
+ to_enter_enum_method_name(type_decl.name,
+ variant_name))
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+ write(1, "}")
+ write(0, "")
+
+ write(1, "fn {}(",
+ to_leave_enum_method_name(type_decl.name,
+ variant_name))
+ write(2, "&mut self,")
+ write_field_params(2, write, variant_type, ast)
+ write(1, ") {")
+ write(1, "}")
+ write(0, "")
+
+ write(0, "}")
+ write(0, "")
+
+
+def ast_(ast):
+ with open("src/types_generated.rs", "w+") as f:
+ def write(*args):
+ write_impl(f, *args)
+ write(0, "// WARNING: This file is auto-generated.")
+ write(0, "")
+ write(0, "use crate::source_location::SourceLocation;")
+ write(0, "use crate::arena;")
+ write(0, "use crate::source_atom_set::SourceAtomSetIndex;")
+ write(0, "use crate::source_slice_list::SourceSliceIndex;")
+ write(0, "")
+ for type_decl in ast.type_decls.values():
+ type_decl.write_rust_type_decl(ast, write)
+
+
+def type_id(ast):
+ with open("src/type_id_generated.rs", "w+") as f:
+ def write(*args):
+ write_impl(f, *args)
+ write(0, "// WARNING: This file is auto-generated.")
+ write(0, "")
+ write(0, "use crate::types::*;")
+ write(0, "")
+
+ write(0, "#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]")
+ write(0, "pub enum NodeTypeId {")
+
+ for type_decl in ast.type_decls.values():
+ if type_decl.name in ['Box', 'Token', 'Vec', 'Void']:
+ continue
+
+ write(1, "{},", type_decl.name)
+
+ write(0, "}")
+ write(0, "")
+
+ write(0, "pub trait NodeTypeIdAccessor {")
+ write(1, "fn get_type_id(&self) -> NodeTypeId;")
+ write(0, "}")
+ write(0, "")
+
+ for type_decl in ast.type_decls.values():
+ if type_decl.name in ['Box', 'Token', 'Vec', 'Void']:
+ continue
+
+ write(0, "impl<'alloc> NodeTypeIdAccessor for {}{} {{",
+ type_decl.name,
+ type_decl.lifetime_params())
+ write(1, "fn get_type_id(&self) -> NodeTypeId {")
+ write(2, "NodeTypeId::{}", type_decl.name)
+ write(1, "}")
+ write(0, "}")
+ write(0, "")
+
+
+def dump(ast):
+ with open('src/dump_generated.rs', 'w+') as f:
+ def write(*args):
+ write_impl(f, *args)
+
+ write(0, """\
+ // WARNING: This file is auto-generated by crates/ast/generate_ast.py.
+
+ #![allow(unused_variables)]
+
+ use crate::arena;
+ use crate::source_atom_set::{SourceAtomSet, SourceAtomSetIndex};
+ use crate::source_slice_list::{SourceSliceList, SourceSliceIndex};
+ use crate::types::*;
+ use std::ops::Deref;
+ use std::io;
+
+ fn newline<W>(out: &mut W, depth: usize)
+ where
+ W: io::Write,
+ {
+ writeln!(out, "").expect("failed to dump");
+ for i in 0..depth {
+ write!(out, " ").expect("failed to dump");
+ }
+ }
+
+ pub trait ASTDump {
+ fn dump_with_atoms<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList
+ )
+ where
+ W: io::Write,
+ {
+ self.dump_with_atoms_at(out, atoms, slices, 0);
+ writeln!(out, "").expect("failed to dump");
+ }
+
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where W: io::Write;
+ }
+ """)
+
+ for type_decl in ast.type_decls.values():
+ if type_decl.name in ['Box', 'Token', 'Vec', 'Void']:
+ continue
+
+ write(0, 'impl<\'alloc> ASTDump for {}{} {{',
+ type_decl.name,
+ type_decl.lifetime_params())
+ write(1,
+ 'fn dump_with_atoms_at<W>(&self, out: &mut W, '
+ 'atoms: &SourceAtomSet, slices: &SourceSliceList, '
+ 'depth: usize)')
+ write(2, 'where W: io::Write')
+ write(1, '{')
+
+ type_decl.write_rust_dump_method_body(write)
+ write(1, '}')
+ write(0, '}')
+ write(0, '')
+
+ write(0, """\
+ impl<'alloc, T> ASTDump for arena::Vec<'alloc, T>
+ where
+ T: ASTDump,
+ {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "[").expect("failed to dump");
+ if self.len() > 0 {
+ for item in self {
+ newline(out, depth + 1);
+ item.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ }
+ newline(out, depth);
+ }
+ write!(out, "]").expect("failed to dump");
+ }
+ }
+
+ impl<T> ASTDump for Option<T>
+ where
+ T: ASTDump,
+ {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ match self {
+ Some(v) => {
+ v.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ None => {
+ write!(out, "None").expect("failed to dump");
+ }
+ }
+ }
+ }
+
+ impl<'alloc, T> ASTDump for arena::Box<'alloc, T>
+ where
+ T: ASTDump,
+ {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ self.deref().dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+
+ impl ASTDump for bool {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ if *self {
+ write!(out, "true").expect("failed to dump");
+ } else {
+ write!(out, "false").expect("failed to dump");
+ }
+ }
+ }
+
+ impl ASTDump for SourceAtomSetIndex {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{:?}", atoms.get(self.clone()))
+ .expect("failed to dump");
+ }
+ }
+
+ impl ASTDump for SourceSliceIndex {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{:?}", slices.get(self.clone()))
+ .expect("failed to dump");
+ }
+ }
+
+ impl ASTDump for f64 {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{}", self).expect("failed to dump");
+ }
+ }
+ """)
+
+
+class AggregateTypeDecl:
+ def __init__(self):
+ self.has_lifetime = None
+
+ def lifetime_params(self):
+ if self.has_lifetime:
+ return "<'alloc>"
+ return ""
+
+
+class Struct(AggregateTypeDecl):
+ def __init__(self, name, struct_json):
+ AggregateTypeDecl.__init__(self)
+ self.name = name
+ self.fields = {
+ name: parse_type(ty)
+ for name, ty in struct_json.items()
+ if name != '_type'
+ }
+
+ def field_types(self):
+ return iter(self.fields.values())
+
+ def write_rust_type_decl(self, ast, write):
+ if len(self.fields) == 0:
+ write(0, "#[derive(Default, Debug, PartialEq)]")
+ else:
+ write(0, "#[derive(Debug, PartialEq)]")
+ lifetime_params = self.lifetime_params()
+ write(0, "pub struct {}{} {{", self.name, lifetime_params)
+ for field, field_type in self.fields.items():
+ write(1, "pub {}: {},", field, field_type.to_rust_type(ast))
+ write(1, "pub loc: SourceLocation,")
+ write(0, "}")
+ write(0, "")
+
+ def write_rust_pass_method_body(self, write, emit_call,
+ emit_variant_dict_call,
+ emit_variant_tuple_call,
+ emit_variant_none_call):
+ for name, ty in self.fields.items():
+ emit_call(2, ty, "&ast.{}".format(name))
+
+ def write_rust_dump_method_body(self, write):
+ write(2, 'write!(out, "({}").expect("failed to dump");', self.name)
+ for name, ty in self.fields.items():
+ if len(self.fields.items()) > 1:
+ write(2, 'newline(out, depth + 1);')
+ else:
+ write(2, 'write!(out, " ").expect("failed to dump");')
+ write(2, 'write!(out, "{}=").expect("failed to dump");', name)
+ write(2, 'self.{}.dump_with_atoms_at(out, atoms, slices, depth + 1);', name)
+ write(2, 'write!(out, ")").expect("failed to dump");')
+
+
+class Enum(AggregateTypeDecl):
+ def __init__(self, name, enum_json):
+ AggregateTypeDecl.__init__(self)
+
+ def parse_maybe_type(ty):
+ if ty is None:
+ return None
+ if isinstance(ty, dict):
+ return {name: parse_type(field_ty) for name, field_ty in ty.items()}
+ return parse_type(ty)
+
+ self.name = name
+ self.variants = {
+ name: parse_maybe_type(ty)
+ for name, ty in enum_json.items()
+ if name != '_type'
+ }
+ self.has_lifetime = None
+
+ def field_types(self):
+ for var in self.variants.values():
+ if isinstance(var, dict):
+ yield from var.values()
+ else:
+ yield var
+
+ def write_rust_type_decl(self, ast, write):
+ write(0, "#[derive(Debug, PartialEq)]")
+ lifetime_params = self.lifetime_params()
+ write(0, "pub enum {}{} {{", self.name, lifetime_params)
+ for variant_name, ty in self.variants.items():
+ if ty is None:
+ write(1, "{} {{", variant_name)
+ write(2, "loc: SourceLocation,")
+ write(1, "},")
+ elif isinstance(ty, dict):
+ write(1, "{} {{", variant_name)
+ for field_name, field_ty in ty.items():
+ write(2, "{}: {},", field_name, field_ty.to_rust_type(ast))
+ write(2, "loc: SourceLocation,")
+ write(1, "},")
+ else:
+ write(1, "{}({}),", variant_name, ty.to_rust_type(ast))
+ write(0, "}")
+ write(0, "")
+
+ def write_rust_pass_method_body(self, write, emit_call,
+ emit_variant_dict_call,
+ emit_variant_tuple_call,
+ emit_variant_none_call):
+ write(2, "match ast {")
+ for variant_name, variant_type in self.variants.items():
+ if variant_type is None:
+ write(3, "{}::{} {{ .. }} => {{", self.name, variant_name)
+ emit_variant_none_call(4, self.name, variant_name)
+ write(3, "}")
+ elif isinstance(variant_type, dict):
+ write(3, "{}::{} {{ {}, .. }} => {{",
+ self.name, variant_name, ', '.join(variant_type.keys()))
+ emit_variant_dict_call(4, self.name, variant_name, variant_type)
+ write(3, "}")
+ else:
+ write(3, "{}::{}(ast) => {{", self.name, variant_name)
+ emit_variant_tuple_call(4, self.name, variant_name, "ast")
+ write(3, "}")
+ write(2, "}")
+
+ def write_rust_pass_variant_dict_method_body(self, emit_call,
+ variant_type):
+ for field_name, field_ty in variant_type.items():
+ if field_ty.name == 'Vec':
+ emit_call(2, field_ty, '{}.iter()'.format(field_name))
+ else:
+ emit_call(2, field_ty, field_name)
+
+ def write_rust_pass_variant_tuple_method_body(self, emit_call,
+ variant_type, param):
+ emit_call(2, variant_type, param)
+
+ def write_rust_dump_method_body(self, write):
+ write(2, 'match self {')
+ for variant_name, variant_type in self.variants.items():
+ if variant_type is None:
+ write(3, '{}::{} {{ .. }} => {{', self.name, variant_name)
+ write(4, 'write!(out, "{}").expect("failed to dump");', variant_name)
+ write(3, '}')
+ elif isinstance(variant_type, dict):
+ write(3, '{}::{} {{ {}, .. }} => {{',
+ self.name, variant_name, ', '.join(variant_type.keys()))
+ write(4, 'write!(out, "({}").expect("failed to dump");', variant_name)
+
+ for field_name, field_ty in variant_type.items():
+ if len(variant_type.items()) > 1:
+ write(4, 'newline(out, depth + 1);')
+ else:
+ write(4, 'write!(out, " ").expect("failed to dump");')
+ write(4, 'write!(out, "{}=").expect("failed to dump");', field_name)
+ write(4, '{}.dump_with_atoms_at(out, atoms, slices, depth + 1);', field_name)
+
+ write(4, 'write!(out, ")").expect("failed to dump");')
+ write(3, '}')
+ else:
+ write(3, '{}::{}(ast) => {{', self.name, variant_name)
+ write(4, 'ast.dump_with_atoms_at(out, atoms, slices, depth);')
+ write(3, '}')
+ write(2, '}')
+
+
+class Ast:
+ def __init__(self, ast_json):
+ self.type_decls = {}
+ for name, contents in ast_json.items():
+ _type = contents["_type"]
+ if _type == "struct":
+ t = Struct(name, contents)
+ elif _type == "enum":
+ t = Enum(name, contents)
+ else:
+ raise ValueError("unrecognized _type: " + repr(_type))
+ self.type_decls[name] = t
+
+ for name in self.type_decls:
+ self._has_lifetime(name)
+
+ def _has_lifetime(self, name):
+ ty = self.type_decls[name]
+ if ty.has_lifetime == "computing":
+ raise ValueError("invalid AST structure: {} contains itself. Try adding a Box."
+ .format(name))
+ if ty.has_lifetime is None:
+ ty.has_lifetime = "computing"
+ ty.has_lifetime = any(
+ field_ty is not None and self.type_has_lifetime(field_ty)
+ for field_ty in ty.field_types()
+ )
+ return ty.has_lifetime
+
+ def type_has_lifetime(self, ty):
+ return (
+ ty is not None
+ and (ty.name == 'Box'
+ or ty.name == 'Vec'
+ or any(self.type_has_lifetime(u)
+ for u in ty.params)
+ or (ty.name in self.type_decls
+ and self._has_lifetime(ty.name))))
+
+
+def main():
+ with open("ast.json", "r") as json_file:
+ ast_json = json.load(json_file)
+ ast = Ast(ast_json)
+
+ ast_(ast)
+ type_id(ast)
+ stack_value(ast)
+ loc_trait(ast)
+ pass_(ast)
+ dump(ast)
+
+
+if __name__ == "__main__":
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
+ main()
diff --git a/third_party/rust/jsparagus-ast/src/arena.rs b/third_party/rust/jsparagus-ast/src/arena.rs
new file mode 100644
index 0000000000..5c1abdbe86
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/arena.rs
@@ -0,0 +1,85 @@
+use bumpalo::Bump;
+
+use std::{
+ self,
+ fmt::{self, Debug, Formatter},
+ ops, ptr,
+};
+
+pub use bumpalo::collections::{String, Vec};
+
+pub struct Box<'alloc, T: ?Sized>(&'alloc mut T);
+
+impl<'alloc, T> Box<'alloc, T> {
+ pub fn unbox(self) -> T {
+ // This pointer read is safe because the reference `self.0` is
+ // guaranteed to be unique--not just now, but we're guaranteed it's not
+ // borrowed from some other reference. This in turn is because we never
+ // construct an alloc::Box with a borrowed reference, only with a fresh
+ // one just allocated from a Bump.
+ unsafe { ptr::read(self.0 as *mut T) }
+ }
+}
+
+impl<'alloc, T: ?Sized> ops::Deref for Box<'alloc, T> {
+ type Target = T;
+
+ fn deref(&self) -> &T {
+ self.0
+ }
+}
+
+impl<'alloc, T: ?Sized> ops::DerefMut for Box<'alloc, T> {
+ fn deref_mut(&mut self) -> &mut T {
+ self.0
+ }
+}
+
+impl<'alloc, T: ?Sized> Debug for Box<'alloc, T>
+where
+ T: Debug,
+{
+ fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+ self.0.fmt(f)
+ }
+}
+
+impl<'alloc, T> PartialEq for Box<'alloc, T>
+where
+ T: PartialEq<T> + ?Sized,
+{
+ fn eq(&self, other: &Box<'alloc, T>) -> bool {
+ PartialEq::eq(&**self, &**other)
+ }
+
+ fn ne(&self, other: &Box<'alloc, T>) -> bool {
+ PartialEq::ne(&**self, &**other)
+ }
+}
+
+pub fn alloc<'alloc, T>(allocator: &'alloc Bump, value: T) -> Box<'alloc, T> {
+ Box(allocator.alloc(value))
+}
+
+pub fn alloc_with<'alloc, F, T>(allocator: &'alloc Bump, gen: F) -> Box<'alloc, T>
+where
+ F: FnOnce() -> T,
+{
+ Box(allocator.alloc_with(gen))
+}
+
+pub fn alloc_str<'alloc>(allocator: &'alloc Bump, value: &str) -> &'alloc str {
+ String::from_str_in(value, allocator).into_bump_str()
+}
+
+pub fn map_vec<'alloc, A, B>(
+ source: &mut Vec<A>,
+ mut map_fn: impl FnMut(&mut A) -> B,
+ allocator: &'alloc Bump,
+) -> Vec<'alloc, B> {
+ let mut out = Vec::with_capacity_in(source.len(), allocator);
+ for item in source {
+ out.push(map_fn(item));
+ }
+ out
+}
diff --git a/third_party/rust/jsparagus-ast/src/associated_data.rs b/third_party/rust/jsparagus-ast/src/associated_data.rs
new file mode 100644
index 0000000000..bdde80c0fd
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/associated_data.rs
@@ -0,0 +1,143 @@
+use crate::source_location_accessor::SourceLocationAccessor;
+use crate::type_id::{NodeTypeId, NodeTypeIdAccessor};
+use crate::SourceLocation;
+use std::collections::HashMap;
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
+struct Key {
+ type_id: NodeTypeId,
+ loc: SourceLocation,
+}
+
+impl Key {
+ fn new<NodeT>(node: &NodeT) -> Self
+ where
+ NodeT: SourceLocationAccessor + NodeTypeIdAccessor,
+ {
+ Self {
+ type_id: node.get_type_id(),
+ loc: node.get_loc(),
+ }
+ }
+}
+
+impl NodeTypeIdAccessor for Key {
+ fn get_type_id(&self) -> NodeTypeId {
+ self.type_id
+ }
+}
+
+impl SourceLocationAccessor for Key {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+#[derive(Debug)]
+struct Item<ValueT> {
+ #[allow(dead_code)]
+ key: Key,
+ value: ValueT,
+}
+
+impl<ValueT> Item<ValueT> {
+ fn new(key: Key, value: ValueT) -> Self {
+ Self { key, value }
+ }
+}
+
+type ItemIndex = usize;
+
+#[derive(Debug)]
+pub struct AssociatedDataItemIndex {
+ index: ItemIndex,
+}
+impl AssociatedDataItemIndex {
+ fn new(index: ItemIndex) -> Self {
+ Self { index }
+ }
+}
+
+// A map from AST node to `ValueT`, to associate extra data to AST node.
+#[derive(Debug)]
+pub struct AssociatedData<ValueT> {
+ items: Vec<Item<ValueT>>,
+ map: HashMap<Key, ItemIndex>,
+}
+
+impl<ValueT> AssociatedData<ValueT> {
+ pub fn new() -> Self {
+ Self {
+ items: Vec::new(),
+ map: HashMap::new(),
+ }
+ }
+
+ // Insert an item for `node`.
+ // Returns the index of the inserted item.
+ pub fn insert<NodeT>(&mut self, node: &NodeT, value: ValueT) -> AssociatedDataItemIndex
+ where
+ NodeT: SourceLocationAccessor + NodeTypeIdAccessor,
+ {
+ let index = self.items.len();
+ let key = Key::new(node);
+ self.items.push(Item::new(key.clone(), value));
+ self.map.insert(key, index);
+
+ AssociatedDataItemIndex::new(index)
+ }
+
+ // Get the immutable reference of the item for the index.
+ // The index is the return value of `insert` or `to_index`.
+ pub fn get_by_index(&self, index: AssociatedDataItemIndex) -> &ValueT {
+ // NOTE: This can panic if `index` is created by another instance of
+ // `AssociatedData`.
+ &self.items[index.index].value
+ }
+
+ // Get the mutable reference of the item for the index.
+ // The index is the return value of `insert` or `to_index`.
+ pub fn get_mut_by_index(&mut self, index: AssociatedDataItemIndex) -> &mut ValueT {
+ // NOTE: This can panic if `index` is created by another instance of
+ // `AssociatedData`.
+ &mut self.items[index.index].value
+ }
+
+ // Get the immutable reference of the item for `node`.
+ // `None` if there's no item inserted for `node`.
+ pub fn get<NodeT>(&self, node: &NodeT) -> Option<&ValueT>
+ where
+ NodeT: SourceLocationAccessor + NodeTypeIdAccessor,
+ {
+ self.to_index(node)
+ .and_then(|index| Some(self.get_by_index(index)))
+ }
+
+ // Get the mutable reference of the item for `node`.
+ // `None` if there's no item inserted for `node`.
+ pub fn get_mut<NodeT>(&mut self, node: &NodeT) -> Option<&mut ValueT>
+ where
+ NodeT: SourceLocationAccessor + NodeTypeIdAccessor,
+ {
+ self.to_index(node)
+ .and_then(move |index| Some(self.get_mut_by_index(index)))
+ }
+
+ // Returns the index for the item for `node`.
+ // `None` if there's no item inserted for `node`.
+ pub fn to_index<NodeT>(&self, node: &NodeT) -> Option<AssociatedDataItemIndex>
+ where
+ NodeT: SourceLocationAccessor + NodeTypeIdAccessor,
+ {
+ let key = Key::new(node);
+ match self.map.get(&key) {
+ Some(index) => Some(AssociatedDataItemIndex::new(*index)),
+ None => None,
+ }
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/dump_generated.rs b/third_party/rust/jsparagus-ast/src/dump_generated.rs
new file mode 100644
index 0000000000..dfbd7c3dc8
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/dump_generated.rs
@@ -0,0 +1,2269 @@
+// WARNING: This file is auto-generated by crates/ast/generate_ast.py.
+
+#![allow(unused_variables)]
+
+use crate::arena;
+use crate::source_atom_set::{SourceAtomSet, SourceAtomSetIndex};
+use crate::source_slice_list::{SourceSliceList, SourceSliceIndex};
+use crate::types::*;
+use std::ops::Deref;
+use std::io;
+
+fn newline<W>(out: &mut W, depth: usize)
+where
+ W: io::Write,
+{
+ writeln!(out, "").expect("failed to dump");
+ for i in 0..depth {
+ write!(out, " ").expect("failed to dump");
+ }
+}
+
+pub trait ASTDump {
+ fn dump_with_atoms<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList
+ )
+ where
+ W: io::Write,
+ {
+ self.dump_with_atoms_at(out, atoms, slices, 0);
+ writeln!(out, "").expect("failed to dump");
+ }
+
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where W: io::Write;
+}
+impl<'alloc> ASTDump for Argument<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Argument::SpreadElement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Argument::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Arguments<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Arguments").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "args=").expect("failed to dump");
+ self.args.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Identifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Identifier").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for IdentifierName {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(IdentifierName").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for PrivateIdentifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(PrivateIdentifier").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Label {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Label").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for VariableDeclarationKind {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ VariableDeclarationKind::Var { .. } => {
+ write!(out, "Var").expect("failed to dump");
+ }
+ VariableDeclarationKind::Let { .. } => {
+ write!(out, "Let").expect("failed to dump");
+ }
+ VariableDeclarationKind::Const { .. } => {
+ write!(out, "Const").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for CompoundAssignmentOperator {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ CompoundAssignmentOperator::LogicalOr { .. } => {
+ write!(out, "LogicalOr").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::LogicalAnd { .. } => {
+ write!(out, "LogicalAnd").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Coalesce { .. } => {
+ write!(out, "Coalesce").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Add { .. } => {
+ write!(out, "Add").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Sub { .. } => {
+ write!(out, "Sub").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Mul { .. } => {
+ write!(out, "Mul").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Div { .. } => {
+ write!(out, "Div").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Mod { .. } => {
+ write!(out, "Mod").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Pow { .. } => {
+ write!(out, "Pow").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::LeftShift { .. } => {
+ write!(out, "LeftShift").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::RightShift { .. } => {
+ write!(out, "RightShift").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::RightShiftExt { .. } => {
+ write!(out, "RightShiftExt").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Or { .. } => {
+ write!(out, "Or").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::Xor { .. } => {
+ write!(out, "Xor").expect("failed to dump");
+ }
+ CompoundAssignmentOperator::And { .. } => {
+ write!(out, "And").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for BinaryOperator {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ BinaryOperator::Equals { .. } => {
+ write!(out, "Equals").expect("failed to dump");
+ }
+ BinaryOperator::NotEquals { .. } => {
+ write!(out, "NotEquals").expect("failed to dump");
+ }
+ BinaryOperator::StrictEquals { .. } => {
+ write!(out, "StrictEquals").expect("failed to dump");
+ }
+ BinaryOperator::StrictNotEquals { .. } => {
+ write!(out, "StrictNotEquals").expect("failed to dump");
+ }
+ BinaryOperator::LessThan { .. } => {
+ write!(out, "LessThan").expect("failed to dump");
+ }
+ BinaryOperator::LessThanOrEqual { .. } => {
+ write!(out, "LessThanOrEqual").expect("failed to dump");
+ }
+ BinaryOperator::GreaterThan { .. } => {
+ write!(out, "GreaterThan").expect("failed to dump");
+ }
+ BinaryOperator::GreaterThanOrEqual { .. } => {
+ write!(out, "GreaterThanOrEqual").expect("failed to dump");
+ }
+ BinaryOperator::In { .. } => {
+ write!(out, "In").expect("failed to dump");
+ }
+ BinaryOperator::Instanceof { .. } => {
+ write!(out, "Instanceof").expect("failed to dump");
+ }
+ BinaryOperator::LeftShift { .. } => {
+ write!(out, "LeftShift").expect("failed to dump");
+ }
+ BinaryOperator::RightShift { .. } => {
+ write!(out, "RightShift").expect("failed to dump");
+ }
+ BinaryOperator::RightShiftExt { .. } => {
+ write!(out, "RightShiftExt").expect("failed to dump");
+ }
+ BinaryOperator::Add { .. } => {
+ write!(out, "Add").expect("failed to dump");
+ }
+ BinaryOperator::Sub { .. } => {
+ write!(out, "Sub").expect("failed to dump");
+ }
+ BinaryOperator::Mul { .. } => {
+ write!(out, "Mul").expect("failed to dump");
+ }
+ BinaryOperator::Div { .. } => {
+ write!(out, "Div").expect("failed to dump");
+ }
+ BinaryOperator::Mod { .. } => {
+ write!(out, "Mod").expect("failed to dump");
+ }
+ BinaryOperator::Pow { .. } => {
+ write!(out, "Pow").expect("failed to dump");
+ }
+ BinaryOperator::Comma { .. } => {
+ write!(out, "Comma").expect("failed to dump");
+ }
+ BinaryOperator::Coalesce { .. } => {
+ write!(out, "Coalesce").expect("failed to dump");
+ }
+ BinaryOperator::LogicalOr { .. } => {
+ write!(out, "LogicalOr").expect("failed to dump");
+ }
+ BinaryOperator::LogicalAnd { .. } => {
+ write!(out, "LogicalAnd").expect("failed to dump");
+ }
+ BinaryOperator::BitwiseOr { .. } => {
+ write!(out, "BitwiseOr").expect("failed to dump");
+ }
+ BinaryOperator::BitwiseXor { .. } => {
+ write!(out, "BitwiseXor").expect("failed to dump");
+ }
+ BinaryOperator::BitwiseAnd { .. } => {
+ write!(out, "BitwiseAnd").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for UnaryOperator {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ UnaryOperator::Plus { .. } => {
+ write!(out, "Plus").expect("failed to dump");
+ }
+ UnaryOperator::Minus { .. } => {
+ write!(out, "Minus").expect("failed to dump");
+ }
+ UnaryOperator::LogicalNot { .. } => {
+ write!(out, "LogicalNot").expect("failed to dump");
+ }
+ UnaryOperator::BitwiseNot { .. } => {
+ write!(out, "BitwiseNot").expect("failed to dump");
+ }
+ UnaryOperator::Typeof { .. } => {
+ write!(out, "Typeof").expect("failed to dump");
+ }
+ UnaryOperator::Void { .. } => {
+ write!(out, "Void").expect("failed to dump");
+ }
+ UnaryOperator::Delete { .. } => {
+ write!(out, "Delete").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for UpdateOperator {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ UpdateOperator::Increment { .. } => {
+ write!(out, "Increment").expect("failed to dump");
+ }
+ UpdateOperator::Decrement { .. } => {
+ write!(out, "Decrement").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Function<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Function").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "is_async=").expect("failed to dump");
+ self.is_async.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "is_generator=").expect("failed to dump");
+ self.is_generator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "params=").expect("failed to dump");
+ self.params.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ self.body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Program<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Program::Module(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Program::Script(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for IfStatement<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(IfStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ self.test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "consequent=").expect("failed to dump");
+ self.consequent.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "alternate=").expect("failed to dump");
+ self.alternate.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Statement<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Statement::BlockStatement { block, .. } => {
+ write!(out, "(BlockStatement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::BreakStatement { label, .. } => {
+ write!(out, "(BreakStatement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "label=").expect("failed to dump");
+ label.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::ContinueStatement { label, .. } => {
+ write!(out, "(ContinueStatement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "label=").expect("failed to dump");
+ label.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::DebuggerStatement { .. } => {
+ write!(out, "DebuggerStatement").expect("failed to dump");
+ }
+ Statement::DoWhileStatement { block, test, .. } => {
+ write!(out, "(DoWhileStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::EmptyStatement { .. } => {
+ write!(out, "EmptyStatement").expect("failed to dump");
+ }
+ Statement::ExpressionStatement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Statement::ForInStatement { left, right, block, .. } => {
+ write!(out, "(ForInStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "left=").expect("failed to dump");
+ left.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "right=").expect("failed to dump");
+ right.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::ForOfStatement { left, right, block, .. } => {
+ write!(out, "(ForOfStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "left=").expect("failed to dump");
+ left.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "right=").expect("failed to dump");
+ right.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::ForStatement { init, test, update, block, .. } => {
+ write!(out, "(ForStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "update=").expect("failed to dump");
+ update.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::IfStatement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Statement::LabelledStatement { label, body, .. } => {
+ write!(out, "(LabelledStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "label=").expect("failed to dump");
+ label.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::ReturnStatement { expression, .. } => {
+ write!(out, "(ReturnStatement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::SwitchStatement { discriminant, cases, .. } => {
+ write!(out, "(SwitchStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "discriminant=").expect("failed to dump");
+ discriminant.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "cases=").expect("failed to dump");
+ cases.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::SwitchStatementWithDefault { discriminant, pre_default_cases, default_case, post_default_cases, .. } => {
+ write!(out, "(SwitchStatementWithDefault").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "discriminant=").expect("failed to dump");
+ discriminant.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "pre_default_cases=").expect("failed to dump");
+ pre_default_cases.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "default_case=").expect("failed to dump");
+ default_case.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "post_default_cases=").expect("failed to dump");
+ post_default_cases.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::ThrowStatement { expression, .. } => {
+ write!(out, "(ThrowStatement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::TryCatchStatement { body, catch_clause, .. } => {
+ write!(out, "(TryCatchStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "catch_clause=").expect("failed to dump");
+ catch_clause.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::TryFinallyStatement { body, catch_clause, finalizer, .. } => {
+ write!(out, "(TryFinallyStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "catch_clause=").expect("failed to dump");
+ catch_clause.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "finalizer=").expect("failed to dump");
+ finalizer.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::WhileStatement { test, block, .. } => {
+ write!(out, "(WhileStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "block=").expect("failed to dump");
+ block.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::WithStatement { object, body, .. } => {
+ write!(out, "(WithStatement").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Statement::VariableDeclarationStatement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Statement::FunctionDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Statement::ClassDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Expression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Expression::MemberExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::ClassExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::LiteralBooleanExpression { value, .. } => {
+ write!(out, "(LiteralBooleanExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::LiteralInfinityExpression { .. } => {
+ write!(out, "LiteralInfinityExpression").expect("failed to dump");
+ }
+ Expression::LiteralNullExpression { .. } => {
+ write!(out, "LiteralNullExpression").expect("failed to dump");
+ }
+ Expression::LiteralNumericExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::LiteralRegExpExpression { pattern, global, ignore_case, multi_line, dot_all, sticky, unicode, .. } => {
+ write!(out, "(LiteralRegExpExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "pattern=").expect("failed to dump");
+ pattern.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "global=").expect("failed to dump");
+ global.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "ignore_case=").expect("failed to dump");
+ ignore_case.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "multi_line=").expect("failed to dump");
+ multi_line.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "dot_all=").expect("failed to dump");
+ dot_all.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "sticky=").expect("failed to dump");
+ sticky.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "unicode=").expect("failed to dump");
+ unicode.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::LiteralStringExpression { value, .. } => {
+ write!(out, "(LiteralStringExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::ArrayExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::ArrowExpression { is_async, params, body, .. } => {
+ write!(out, "(ArrowExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "is_async=").expect("failed to dump");
+ is_async.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "params=").expect("failed to dump");
+ params.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::AssignmentExpression { binding, expression, .. } => {
+ write!(out, "(AssignmentExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::BinaryExpression { operator, left, right, .. } => {
+ write!(out, "(BinaryExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "operator=").expect("failed to dump");
+ operator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "left=").expect("failed to dump");
+ left.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "right=").expect("failed to dump");
+ right.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::CallExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::CompoundAssignmentExpression { operator, binding, expression, .. } => {
+ write!(out, "(CompoundAssignmentExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "operator=").expect("failed to dump");
+ operator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::ConditionalExpression { test, consequent, alternate, .. } => {
+ write!(out, "(ConditionalExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "consequent=").expect("failed to dump");
+ consequent.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "alternate=").expect("failed to dump");
+ alternate.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::FunctionExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::IdentifierExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::NewExpression { callee, arguments, .. } => {
+ write!(out, "(NewExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "callee=").expect("failed to dump");
+ callee.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "arguments=").expect("failed to dump");
+ arguments.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::NewTargetExpression { .. } => {
+ write!(out, "NewTargetExpression").expect("failed to dump");
+ }
+ Expression::ObjectExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::OptionalExpression { object, tail, .. } => {
+ write!(out, "(OptionalExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "tail=").expect("failed to dump");
+ tail.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::OptionalChain(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::UnaryExpression { operator, operand, .. } => {
+ write!(out, "(UnaryExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "operator=").expect("failed to dump");
+ operator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "operand=").expect("failed to dump");
+ operand.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::TemplateExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Expression::ThisExpression { .. } => {
+ write!(out, "ThisExpression").expect("failed to dump");
+ }
+ Expression::UpdateExpression { is_prefix, operator, operand, .. } => {
+ write!(out, "(UpdateExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "is_prefix=").expect("failed to dump");
+ is_prefix.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "operator=").expect("failed to dump");
+ operator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "operand=").expect("failed to dump");
+ operand.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::YieldExpression { expression, .. } => {
+ write!(out, "(YieldExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::YieldGeneratorExpression { expression, .. } => {
+ write!(out, "(YieldGeneratorExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::AwaitExpression { expression, .. } => {
+ write!(out, "(AwaitExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ Expression::ImportCallExpression { argument, .. } => {
+ write!(out, "(ImportCallExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "argument=").expect("failed to dump");
+ argument.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for MemberExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ MemberExpression::ComputedMemberExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MemberExpression::StaticMemberExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MemberExpression::PrivateFieldExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for OptionalChain<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ OptionalChain::ComputedMemberExpressionTail { expression, .. } => {
+ write!(out, "(ComputedMemberExpressionTail").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ OptionalChain::StaticMemberExpressionTail { property, .. } => {
+ write!(out, "(StaticMemberExpressionTail").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "property=").expect("failed to dump");
+ property.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ OptionalChain::PrivateFieldExpressionTail { field, .. } => {
+ write!(out, "(PrivateFieldExpressionTail").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "field=").expect("failed to dump");
+ field.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ OptionalChain::CallExpressionTail { arguments, .. } => {
+ write!(out, "(CallExpressionTail").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "arguments=").expect("failed to dump");
+ arguments.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ OptionalChain::ComputedMemberExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ OptionalChain::StaticMemberExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ OptionalChain::PrivateFieldExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ OptionalChain::CallExpression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for PropertyName<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ PropertyName::ComputedPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ PropertyName::StaticPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ PropertyName::StaticNumericPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for CallExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(CallExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "callee=").expect("failed to dump");
+ self.callee.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "arguments=").expect("failed to dump");
+ self.arguments.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ClassElementName<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ClassElementName::ComputedPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ClassElementName::StaticPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ClassElementName::StaticNumericPropertyName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ClassElementName::PrivateFieldName(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ObjectProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ObjectProperty::NamedObjectProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ObjectProperty::ShorthandProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ObjectProperty::SpreadProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for NamedObjectProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ NamedObjectProperty::MethodDefinition(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ NamedObjectProperty::DataProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for MethodDefinition<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ MethodDefinition::Method(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MethodDefinition::Getter(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MethodDefinition::Setter(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ImportDeclaration<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ImportDeclaration::Import(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ImportDeclaration::ImportNamespace(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ExportDeclaration<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ExportDeclaration::ExportAllFrom(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDeclaration::ExportFrom(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDeclaration::ExportLocals(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDeclaration::Export(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDeclaration::ExportDefault(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for VariableReference {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ VariableReference::BindingIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ VariableReference::AssignmentTargetIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for BindingPattern<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ BindingPattern::ObjectBinding(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ BindingPattern::ArrayBinding(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Binding<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Binding::BindingPattern(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Binding::BindingIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for SimpleAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ SimpleAssignmentTarget::AssignmentTargetIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ SimpleAssignmentTarget::MemberAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetPattern<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ AssignmentTargetPattern::ArrayAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ AssignmentTargetPattern::ObjectAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ AssignmentTarget::AssignmentTargetPattern(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ AssignmentTarget::SimpleAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Parameter<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Parameter::Binding(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Parameter::BindingWithDefault(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for BindingWithDefault<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(BindingWithDefault").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ self.init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for BindingIdentifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(BindingIdentifier").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetIdentifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(AssignmentTargetIdentifier").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ExpressionOrSuper<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ExpressionOrSuper::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExpressionOrSuper::Super { .. } => {
+ write!(out, "Super").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for MemberAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ MemberAssignmentTarget::ComputedMemberAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MemberAssignmentTarget::PrivateFieldAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ MemberAssignmentTarget::StaticMemberAssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ComputedMemberAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ComputedMemberAssignmentTarget").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "expression=").expect("failed to dump");
+ self.expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for PrivateFieldAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(PrivateFieldAssignmentTarget").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "field=").expect("failed to dump");
+ self.field.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for StaticMemberAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(StaticMemberAssignmentTarget").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "property=").expect("failed to dump");
+ self.property.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ArrayBinding<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ArrayBinding").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "rest=").expect("failed to dump");
+ self.rest.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ObjectBinding<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ObjectBinding").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "properties=").expect("failed to dump");
+ self.properties.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "rest=").expect("failed to dump");
+ self.rest.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for BindingProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ BindingProperty::BindingPropertyIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ BindingProperty::BindingPropertyProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for BindingPropertyIdentifier<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(BindingPropertyIdentifier").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ self.init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for BindingPropertyProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(BindingPropertyProperty").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetWithDefault<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(AssignmentTargetWithDefault").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ self.init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetMaybeDefault<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ AssignmentTargetMaybeDefault::AssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ArrayAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ArrayAssignmentTarget").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "rest=").expect("failed to dump");
+ self.rest.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ObjectAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ObjectAssignmentTarget").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "properties=").expect("failed to dump");
+ self.properties.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "rest=").expect("failed to dump");
+ self.rest.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ AssignmentTargetProperty::AssignmentTargetPropertyProperty(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetPropertyIdentifier<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(AssignmentTargetPropertyIdentifier").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ self.init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for AssignmentTargetPropertyProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(AssignmentTargetPropertyProperty").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ClassExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ClassExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "super_=").expect("failed to dump");
+ self.super_.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ClassDeclaration<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ClassDeclaration").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "super_=").expect("failed to dump");
+ self.super_.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ClassElement<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ClassElement::MethodDefinition { is_static, method, .. } => {
+ write!(out, "(MethodDefinition").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "is_static=").expect("failed to dump");
+ is_static.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "method=").expect("failed to dump");
+ method.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ ClassElement::FieldDefinition { name, init, .. } => {
+ write!(out, "(FieldDefinition").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ModuleItems<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ModuleItems::ImportDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ModuleItems::ExportDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ModuleItems::Statement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Module<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Module").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "directives=").expect("failed to dump");
+ self.directives.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "items=").expect("failed to dump");
+ self.items.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Import<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Import").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "module_specifier=").expect("failed to dump");
+ self.module_specifier.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "default_binding=").expect("failed to dump");
+ self.default_binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "named_imports=").expect("failed to dump");
+ self.named_imports.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ImportNamespace {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ImportNamespace").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "module_specifier=").expect("failed to dump");
+ self.module_specifier.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "default_binding=").expect("failed to dump");
+ self.default_binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "namespace_binding=").expect("failed to dump");
+ self.namespace_binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ImportSpecifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ImportSpecifier").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ExportAllFrom {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ExportAllFrom").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "module_specifier=").expect("failed to dump");
+ self.module_specifier.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ExportFrom<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ExportFrom").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "named_exports=").expect("failed to dump");
+ self.named_exports.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "module_specifier=").expect("failed to dump");
+ self.module_specifier.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ExportLocals<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ExportLocals").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "named_exports=").expect("failed to dump");
+ self.named_exports.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Export<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ Export::FunctionDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Export::ClassDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ Export::VariableDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ExportDefault<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ExportDefault::FunctionDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDefault::ClassDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ExportDefault::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ExportFromSpecifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ExportFromSpecifier").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "exported_name=").expect("failed to dump");
+ self.exported_name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ExportLocalSpecifier {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ExportLocalSpecifier").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "exported_name=").expect("failed to dump");
+ self.exported_name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Method<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Method").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "is_async=").expect("failed to dump");
+ self.is_async.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "is_generator=").expect("failed to dump");
+ self.is_generator.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "params=").expect("failed to dump");
+ self.params.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ self.body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Getter<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Getter").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "property_name=").expect("failed to dump");
+ self.property_name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ self.body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Setter<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Setter").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "property_name=").expect("failed to dump");
+ self.property_name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "param=").expect("failed to dump");
+ self.param.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ self.body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for DataProperty<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(DataProperty").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "property_name=").expect("failed to dump");
+ self.property_name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "expression=").expect("failed to dump");
+ self.expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ShorthandProperty {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ShorthandProperty").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ComputedPropertyName<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ComputedPropertyName").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ self.expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for StaticPropertyName {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(StaticPropertyName").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for NumericLiteral {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(NumericLiteral").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "value=").expect("failed to dump");
+ self.value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ArrayExpressionElement<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ArrayExpressionElement::SpreadElement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ArrayExpressionElement::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ArrayExpressionElement::Elision { .. } => {
+ write!(out, "Elision").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ArrayExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ArrayExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ArrowExpressionBody<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ ArrowExpressionBody::FunctionBody(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ ArrowExpressionBody::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for ComputedMemberExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ComputedMemberExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "expression=").expect("failed to dump");
+ self.expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for IdentifierExpression {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(IdentifierExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "name=").expect("failed to dump");
+ self.name.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for ObjectExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(ObjectExpression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "properties=").expect("failed to dump");
+ self.properties.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for StaticMemberExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(StaticMemberExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "property=").expect("failed to dump");
+ self.property.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for PrivateFieldExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(PrivateFieldExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "object=").expect("failed to dump");
+ self.object.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "field=").expect("failed to dump");
+ self.field.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for TemplateExpressionElement<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ TemplateExpressionElement::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ TemplateExpressionElement::TemplateElement(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for TemplateExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(TemplateExpression").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "tag=").expect("failed to dump");
+ self.tag.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "elements=").expect("failed to dump");
+ self.elements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for VariableDeclarationOrAssignmentTarget<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ VariableDeclarationOrAssignmentTarget::VariableDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ VariableDeclarationOrAssignmentTarget::AssignmentTarget(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for VariableDeclarationOrExpression<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ VariableDeclarationOrExpression::VariableDeclaration(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ VariableDeclarationOrExpression::Expression(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc> ASTDump for Block<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Block").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "statements=").expect("failed to dump");
+ self.statements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "declarations=").expect("failed to dump");
+ self.declarations.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for CatchClause<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(CatchClause").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "body=").expect("failed to dump");
+ self.body.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Directive {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Directive").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "raw_value=").expect("failed to dump");
+ self.raw_value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for FormalParameters<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(FormalParameters").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "items=").expect("failed to dump");
+ self.items.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "rest=").expect("failed to dump");
+ self.rest.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for FunctionBody<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(FunctionBody").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "directives=").expect("failed to dump");
+ self.directives.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "statements=").expect("failed to dump");
+ self.statements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for Script<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(Script").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "directives=").expect("failed to dump");
+ self.directives.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "statements=").expect("failed to dump");
+ self.statements.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for SwitchCase<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(SwitchCase").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "test=").expect("failed to dump");
+ self.test.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "consequent=").expect("failed to dump");
+ self.consequent.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for SwitchDefault<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(SwitchDefault").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "consequent=").expect("failed to dump");
+ self.consequent.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for TemplateElement {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(TemplateElement").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "raw_value=").expect("failed to dump");
+ self.raw_value.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for VariableDeclaration<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(VariableDeclaration").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "kind=").expect("failed to dump");
+ self.kind.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "declarators=").expect("failed to dump");
+ self.declarators.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for VariableDeclarator<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ write!(out, "(VariableDeclarator").expect("failed to dump");
+ newline(out, depth + 1);
+ write!(out, "binding=").expect("failed to dump");
+ self.binding.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ newline(out, depth + 1);
+ write!(out, "init=").expect("failed to dump");
+ self.init.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+}
+
+impl<'alloc> ASTDump for CoverParenthesized<'alloc> {
+ fn dump_with_atoms_at<W>(&self, out: &mut W, atoms: &SourceAtomSet, slices: &SourceSliceList, depth: usize)
+ where W: io::Write
+ {
+ match self {
+ CoverParenthesized::Expression { expression, .. } => {
+ write!(out, "(Expression").expect("failed to dump");
+ write!(out, " ").expect("failed to dump");
+ write!(out, "expression=").expect("failed to dump");
+ expression.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ write!(out, ")").expect("failed to dump");
+ }
+ CoverParenthesized::Parameters(ast) => {
+ ast.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ }
+ }
+}
+
+impl<'alloc, T> ASTDump for arena::Vec<'alloc, T>
+where
+ T: ASTDump,
+{
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "[").expect("failed to dump");
+ if self.len() > 0 {
+ for item in self {
+ newline(out, depth + 1);
+ item.dump_with_atoms_at(out, atoms, slices, depth + 1);
+ }
+ newline(out, depth);
+ }
+ write!(out, "]").expect("failed to dump");
+ }
+}
+
+impl<T> ASTDump for Option<T>
+where
+ T: ASTDump,
+{
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ match self {
+ Some(v) => {
+ v.dump_with_atoms_at(out, atoms, slices, depth);
+ }
+ None => {
+ write!(out, "None").expect("failed to dump");
+ }
+ }
+ }
+}
+
+impl<'alloc, T> ASTDump for arena::Box<'alloc, T>
+where
+ T: ASTDump,
+{
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ self.deref().dump_with_atoms_at(out, atoms, slices, depth);
+ }
+}
+
+impl ASTDump for bool {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ if *self {
+ write!(out, "true").expect("failed to dump");
+ } else {
+ write!(out, "false").expect("failed to dump");
+ }
+ }
+}
+
+impl ASTDump for SourceAtomSetIndex {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{:?}", atoms.get(self.clone()))
+ .expect("failed to dump");
+ }
+}
+
+impl ASTDump for SourceSliceIndex {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{:?}", slices.get(self.clone()))
+ .expect("failed to dump");
+ }
+}
+
+impl ASTDump for f64 {
+ fn dump_with_atoms_at<W>(
+ &self,
+ out: &mut W,
+ atoms: &SourceAtomSet,
+ slices: &SourceSliceList,
+ depth: usize,
+ )
+ where
+ W: io::Write,
+ {
+ write!(out, "{}", self).expect("failed to dump");
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/lib.rs b/third_party/rust/jsparagus-ast/src/lib.rs
new file mode 100644
index 0000000000..3250d73508
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/lib.rs
@@ -0,0 +1,30 @@
+//! The Visage AST (abstract syntax tree).
+
+pub mod arena;
+pub mod associated_data;
+pub mod source_atom_set;
+pub mod source_location;
+pub mod source_slice_list;
+
+mod source_location_accessor_generated;
+pub mod source_location_accessor {
+ pub use crate::source_location_accessor_generated::*;
+}
+mod types_generated;
+pub mod types {
+ pub use crate::types_generated::*;
+}
+mod visit_generated;
+pub mod visit {
+ pub use crate::visit_generated::*;
+}
+mod type_id_generated;
+pub mod type_id {
+ pub use crate::type_id_generated::*;
+}
+mod dump_generated;
+pub mod dump {
+ pub use crate::dump_generated::*;
+}
+
+pub use source_location::SourceLocation;
diff --git a/third_party/rust/jsparagus-ast/src/source_atom_set.rs b/third_party/rust/jsparagus-ast/src/source_atom_set.rs
new file mode 100644
index 0000000000..25369c9777
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/source_atom_set.rs
@@ -0,0 +1,221 @@
+use indexmap::set::IndexSet;
+
+/// Index into SourceAtomSet.atoms.
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+pub struct SourceAtomSetIndex {
+ index: usize,
+}
+impl SourceAtomSetIndex {
+ fn new(index: usize) -> Self {
+ Self { index }
+ }
+}
+
+impl From<SourceAtomSetIndex> for usize {
+ fn from(index: SourceAtomSetIndex) -> usize {
+ index.index
+ }
+}
+
+// Call $handler macro with the list of common atoms.
+//
+// Basic Usage:
+//
+// ```
+// for_all_common_atoms!(test);
+// ```
+//
+// is expanded to
+//
+// ```
+// test!(
+// ("arguments", arguments, Arguments),
+// ("async", async_, Async),
+// ...
+// );
+// ```
+//
+// Extra Parameters:
+//
+// ```
+// for_all_common_atoms!(test, foo, bar);
+// ```
+//
+// is expanded to
+//
+// ```
+// test!(
+// foo, bar,
+// ("arguments", arguments, Arguments),
+// ("async", async_, Async),
+// ...
+// );
+// ```
+macro_rules! for_all_common_atoms {
+ ($handler:ident $(, $($params:tt)*)?) => {
+ // string representation, method name, enum variant
+ $handler!(
+ $($($params)*,)?
+ ("arguments", arguments, Arguments),
+ ("as", as_, As),
+ ("async", async_, Async),
+ ("await", await_, Await),
+ ("break", break_, Break),
+ ("case", case, Case),
+ ("catch", catch, Catch),
+ ("class", class, Class),
+ ("const", const_, Const),
+ ("continue", continue_, Continue),
+ ("debugger", debugger, Debugger),
+ ("default", default, Default),
+ ("delete", delete, Delete),
+ ("do", do_, Do),
+ ("else", else_, Else),
+ ("enum", enum_, Enum),
+ ("eval", eval, Eval),
+ ("export", export, Export),
+ ("extends", extends, Extends),
+ ("false", false_, False),
+ ("finally", finally, Finally),
+ ("for", for_, For),
+ ("from", from, From),
+ ("function", function, Function),
+ ("get", get, Get),
+ ("if", if_, If),
+ ("implements", implements, Implements),
+ ("import", import, Import),
+ ("in", in_, In),
+ ("instanceof", instanceof, Instanceof),
+ ("interface", interface, Interface),
+ ("let", let_, Let),
+ ("new", new_, New),
+ ("null", null, Null),
+ ("of", of, Of),
+ ("package", package, Package),
+ ("private", private, Private),
+ ("protected", protected, Protected),
+ ("public", public, Public),
+ ("return", return_, Return),
+ ("set", set, Set),
+ ("static", static_, Static),
+ ("super", super_, Super),
+ ("switch", switch, Switch),
+ ("target", target, Target),
+ ("this", this, This),
+ ("throw", throw, Throw),
+ ("true", true_, True),
+ ("try", try_, Try),
+ ("typeof", typeof_, Typeof),
+ ("var", var, Var),
+ ("void", void, Void),
+ ("while", while_, While),
+ ("with", with, With),
+ ("yield", yield_, Yield),
+ ("use strict", use_strict, UseStrict),
+ ("__proto__", __proto__, Proto),
+ );
+ }
+}
+
+// Define CommonAtoms enum, with
+//
+// enum CommonAtoms {
+// Arguments = 0,
+// Async,
+// ...
+// }
+macro_rules! define_enum {
+ (($s0:tt, $method0:ident, $variant0:ident),
+ $(($s:tt, $method:ident, $variant:ident),)*) => {
+ enum CommonAtoms {
+ $variant0 = 0,
+ $($variant,)*
+ }
+ };
+}
+for_all_common_atoms!(define_enum);
+
+// Define CommonSourceAtomSetIndices struct.
+//
+// impl CommonSourceAtomSetIndices {
+// pub fn arguments() -> SourceAtomSetIndex { ... }
+// pub fn async_() -> SourceAtomSetIndex { ... }
+// ...
+// }
+macro_rules! define_struct {
+ ($(($s:tt, $method:ident, $variant:ident),)*) => {
+ #[derive(Debug)]
+ pub struct CommonSourceAtomSetIndices {}
+
+ impl CommonSourceAtomSetIndices {
+ $(
+ pub fn $method() -> SourceAtomSetIndex {
+ SourceAtomSetIndex::new(CommonAtoms::$variant as usize)
+ }
+ )*
+ }
+ };
+}
+for_all_common_atoms!(define_struct);
+
+/// Set of atoms, including the following:
+///
+/// * atoms referred from bytecode
+/// * variable names referred from scope data
+///
+/// WARNING: This set itself does *NOT* map to JSScript::atoms().
+#[derive(Debug)]
+pub struct SourceAtomSet<'alloc> {
+ atoms: IndexSet<&'alloc str>,
+}
+
+impl<'alloc> SourceAtomSet<'alloc> {
+ // Create a set, with all common atoms inserted.
+ pub fn new() -> Self {
+ let mut result = Self {
+ atoms: IndexSet::new(),
+ };
+ result.insert_common_atoms();
+ result
+ }
+
+ // Insert all common atoms.
+ fn insert_common_atoms(&mut self) {
+ macro_rules! insert_atom {
+ ($self: ident,
+ $(($s:tt, $method:ident, $variant:ident),)*) => {
+ $(
+ $self.atoms.insert($s);
+ )*
+ };
+ }
+ for_all_common_atoms!(insert_atom, self);
+ }
+
+ // Create a set, without any common atoms.
+ //
+ // This is for moving `SourceAtomSet` out of `Rc<RefCell>`, by replacing
+ // it with the result of this method.
+ pub fn new_uninitialized() -> Self {
+ Self {
+ // 256 is a number which should cover 75% of scripts without
+ // reallocation.
+ atoms: IndexSet::with_capacity(256),
+ }
+ }
+
+ pub fn insert(&mut self, s: &'alloc str) -> SourceAtomSetIndex {
+ let (index, _) = self.atoms.insert_full(s);
+ SourceAtomSetIndex::new(index)
+ }
+
+ pub fn get(&self, index: SourceAtomSetIndex) -> &'alloc str {
+ self.atoms.get_index(usize::from(index)).unwrap()
+ }
+}
+
+impl<'alloc> From<SourceAtomSet<'alloc>> for Vec<&'alloc str> {
+ fn from(set: SourceAtomSet<'alloc>) -> Vec<&'alloc str> {
+ set.atoms.into_iter().collect()
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/source_location.rs b/third_party/rust/jsparagus-ast/src/source_location.rs
new file mode 100644
index 0000000000..2219fa451e
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/source_location.rs
@@ -0,0 +1,32 @@
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
+pub struct SourceLocation {
+ pub start: usize,
+ pub end: usize,
+}
+
+impl SourceLocation {
+ pub fn new(start: usize, end: usize) -> Self {
+ debug_assert!(start <= end);
+
+ Self { start, end }
+ }
+
+ pub fn from_parts(start: SourceLocation, end: SourceLocation) -> Self {
+ debug_assert!(start.start <= end.end);
+
+ Self {
+ start: start.start,
+ end: end.end,
+ }
+ }
+
+ pub fn set_range(&mut self, start: SourceLocation, end: SourceLocation) {
+ debug_assert!(start.start <= end.end);
+ self.start = start.start;
+ self.end = end.end;
+ }
+
+ pub fn default() -> Self {
+ Self { start: 0, end: 0 }
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/source_location_accessor_generated.rs b/third_party/rust/jsparagus-ast/src/source_location_accessor_generated.rs
new file mode 100644
index 0000000000..aec1f962a0
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/source_location_accessor_generated.rs
@@ -0,0 +1,2047 @@
+// WARNING: This file is auto-generated by crates/ast/generate_ast.py.
+
+use crate::SourceLocation;
+use crate::arena;
+use crate::types::*;
+use std::borrow::{Borrow, BorrowMut};
+
+pub trait SourceLocationAccessor {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation);
+ fn get_loc(&self) -> SourceLocation;
+}
+impl<'alloc> SourceLocationAccessor for Argument<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Argument::SpreadElement(content) => { content.set_loc(start, end) }
+ Argument::Expression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Argument::SpreadElement(content) => { content.get_loc() }
+ Argument::Expression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Arguments<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ArrayAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ArrayBinding<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ArrayExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ArrayExpressionElement<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ArrayExpressionElement::SpreadElement(content) => { content.set_loc(start, end) }
+ ArrayExpressionElement::Expression(content) => { content.set_loc(start, end) }
+ ArrayExpressionElement::Elision { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ArrayExpressionElement::SpreadElement(content) => { content.get_loc() }
+ ArrayExpressionElement::Expression(content) => { content.get_loc() }
+ ArrayExpressionElement::Elision { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ArrowExpressionBody<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ArrowExpressionBody::FunctionBody(content) => { content.set_loc(start, end) }
+ ArrowExpressionBody::Expression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ArrowExpressionBody::FunctionBody(content) => { content.get_loc() }
+ ArrowExpressionBody::Expression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ AssignmentTarget::AssignmentTargetPattern(content) => { content.set_loc(start, end) }
+ AssignmentTarget::SimpleAssignmentTarget(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ AssignmentTarget::AssignmentTargetPattern(content) => { content.get_loc() }
+ AssignmentTarget::SimpleAssignmentTarget(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetIdentifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetMaybeDefault<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ AssignmentTargetMaybeDefault::AssignmentTarget(content) => { content.set_loc(start, end) }
+ AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ AssignmentTargetMaybeDefault::AssignmentTarget(content) => { content.get_loc() }
+ AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetPattern<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ AssignmentTargetPattern::ArrayAssignmentTarget(content) => { content.set_loc(start, end) }
+ AssignmentTargetPattern::ObjectAssignmentTarget(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ AssignmentTargetPattern::ArrayAssignmentTarget(content) => { content.get_loc() }
+ AssignmentTargetPattern::ObjectAssignmentTarget(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(content) => { content.set_loc(start, end) }
+ AssignmentTargetProperty::AssignmentTargetPropertyProperty(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(content) => { content.get_loc() }
+ AssignmentTargetProperty::AssignmentTargetPropertyProperty(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetPropertyIdentifier<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetPropertyProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for AssignmentTargetWithDefault<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BinaryOperator {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ BinaryOperator::Equals { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::NotEquals { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::StrictEquals { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::StrictNotEquals { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::LessThan { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::LessThanOrEqual { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::GreaterThan { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::GreaterThanOrEqual { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::In { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Instanceof { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::LeftShift { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::RightShift { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::RightShiftExt { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Add { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Sub { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Mul { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Div { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Mod { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Pow { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Comma { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::Coalesce { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::LogicalOr { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::LogicalAnd { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::BitwiseOr { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::BitwiseXor { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ BinaryOperator::BitwiseAnd { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ BinaryOperator::Equals { loc } => {
+ *loc
+ }
+ BinaryOperator::NotEquals { loc } => {
+ *loc
+ }
+ BinaryOperator::StrictEquals { loc } => {
+ *loc
+ }
+ BinaryOperator::StrictNotEquals { loc } => {
+ *loc
+ }
+ BinaryOperator::LessThan { loc } => {
+ *loc
+ }
+ BinaryOperator::LessThanOrEqual { loc } => {
+ *loc
+ }
+ BinaryOperator::GreaterThan { loc } => {
+ *loc
+ }
+ BinaryOperator::GreaterThanOrEqual { loc } => {
+ *loc
+ }
+ BinaryOperator::In { loc } => {
+ *loc
+ }
+ BinaryOperator::Instanceof { loc } => {
+ *loc
+ }
+ BinaryOperator::LeftShift { loc } => {
+ *loc
+ }
+ BinaryOperator::RightShift { loc } => {
+ *loc
+ }
+ BinaryOperator::RightShiftExt { loc } => {
+ *loc
+ }
+ BinaryOperator::Add { loc } => {
+ *loc
+ }
+ BinaryOperator::Sub { loc } => {
+ *loc
+ }
+ BinaryOperator::Mul { loc } => {
+ *loc
+ }
+ BinaryOperator::Div { loc } => {
+ *loc
+ }
+ BinaryOperator::Mod { loc } => {
+ *loc
+ }
+ BinaryOperator::Pow { loc } => {
+ *loc
+ }
+ BinaryOperator::Comma { loc } => {
+ *loc
+ }
+ BinaryOperator::Coalesce { loc } => {
+ *loc
+ }
+ BinaryOperator::LogicalOr { loc } => {
+ *loc
+ }
+ BinaryOperator::LogicalAnd { loc } => {
+ *loc
+ }
+ BinaryOperator::BitwiseOr { loc } => {
+ *loc
+ }
+ BinaryOperator::BitwiseXor { loc } => {
+ *loc
+ }
+ BinaryOperator::BitwiseAnd { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Binding<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Binding::BindingPattern(content) => { content.set_loc(start, end) }
+ Binding::BindingIdentifier(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Binding::BindingPattern(content) => { content.get_loc() }
+ Binding::BindingIdentifier(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingIdentifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingPattern<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ BindingPattern::ObjectBinding(content) => { content.set_loc(start, end) }
+ BindingPattern::ArrayBinding(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ BindingPattern::ObjectBinding(content) => { content.get_loc() }
+ BindingPattern::ArrayBinding(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ BindingProperty::BindingPropertyIdentifier(content) => { content.set_loc(start, end) }
+ BindingProperty::BindingPropertyProperty(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ BindingProperty::BindingPropertyIdentifier(content) => { content.get_loc() }
+ BindingProperty::BindingPropertyProperty(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingPropertyIdentifier<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingPropertyProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for BindingWithDefault<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Block<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for CallExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for CatchClause<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ClassDeclaration<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ClassElement<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ClassElement::MethodDefinition { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ ClassElement::FieldDefinition { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ClassElement::MethodDefinition { loc, .. } => {
+ *loc
+ }
+ ClassElement::FieldDefinition { loc, .. } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ClassElementName<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ClassElementName::ComputedPropertyName(content) => { content.set_loc(start, end) }
+ ClassElementName::StaticPropertyName(content) => { content.set_loc(start, end) }
+ ClassElementName::StaticNumericPropertyName(content) => { content.set_loc(start, end) }
+ ClassElementName::PrivateFieldName(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ClassElementName::ComputedPropertyName(content) => { content.get_loc() }
+ ClassElementName::StaticPropertyName(content) => { content.get_loc() }
+ ClassElementName::StaticNumericPropertyName(content) => { content.get_loc() }
+ ClassElementName::PrivateFieldName(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ClassExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for CompoundAssignmentOperator {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ CompoundAssignmentOperator::LogicalOr { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::LogicalAnd { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Coalesce { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Add { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Sub { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Mul { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Div { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Mod { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Pow { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::LeftShift { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::RightShift { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::RightShiftExt { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Or { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::Xor { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CompoundAssignmentOperator::And { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ CompoundAssignmentOperator::LogicalOr { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::LogicalAnd { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Coalesce { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Add { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Sub { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Mul { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Div { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Mod { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Pow { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::LeftShift { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::RightShift { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::RightShiftExt { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Or { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::Xor { loc } => {
+ *loc
+ }
+ CompoundAssignmentOperator::And { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ComputedMemberAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ComputedMemberExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ComputedPropertyName<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for CoverParenthesized<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ CoverParenthesized::Expression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ CoverParenthesized::Parameters(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ CoverParenthesized::Expression { loc, .. } => {
+ *loc
+ }
+ CoverParenthesized::Parameters(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for DataProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Directive {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Export<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Export::FunctionDeclaration(content) => { content.set_loc(start, end) }
+ Export::ClassDeclaration(content) => { content.set_loc(start, end) }
+ Export::VariableDeclaration(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Export::FunctionDeclaration(content) => { content.get_loc() }
+ Export::ClassDeclaration(content) => { content.get_loc() }
+ Export::VariableDeclaration(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportAllFrom {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportDeclaration<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ExportDeclaration::ExportAllFrom(content) => { content.set_loc(start, end) }
+ ExportDeclaration::ExportFrom(content) => { content.set_loc(start, end) }
+ ExportDeclaration::ExportLocals(content) => { content.set_loc(start, end) }
+ ExportDeclaration::Export(content) => { content.set_loc(start, end) }
+ ExportDeclaration::ExportDefault(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ExportDeclaration::ExportAllFrom(content) => { content.get_loc() }
+ ExportDeclaration::ExportFrom(content) => { content.get_loc() }
+ ExportDeclaration::ExportLocals(content) => { content.get_loc() }
+ ExportDeclaration::Export(content) => { content.get_loc() }
+ ExportDeclaration::ExportDefault(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportDefault<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ExportDefault::FunctionDeclaration(content) => { content.set_loc(start, end) }
+ ExportDefault::ClassDeclaration(content) => { content.set_loc(start, end) }
+ ExportDefault::Expression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ExportDefault::FunctionDeclaration(content) => { content.get_loc() }
+ ExportDefault::ClassDeclaration(content) => { content.get_loc() }
+ ExportDefault::Expression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportFrom<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportFromSpecifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportLocalSpecifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExportLocals<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Expression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Expression::MemberExpression(content) => { content.set_loc(start, end) }
+ Expression::ClassExpression(content) => { content.set_loc(start, end) }
+ Expression::LiteralBooleanExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::LiteralInfinityExpression { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::LiteralNullExpression { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::LiteralNumericExpression(content) => { content.set_loc(start, end) }
+ Expression::LiteralRegExpExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::LiteralStringExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::ArrayExpression(content) => { content.set_loc(start, end) }
+ Expression::ArrowExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::AssignmentExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::BinaryExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::CallExpression(content) => { content.set_loc(start, end) }
+ Expression::CompoundAssignmentExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::ConditionalExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::FunctionExpression(content) => { content.set_loc(start, end) }
+ Expression::IdentifierExpression(content) => { content.set_loc(start, end) }
+ Expression::NewExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::NewTargetExpression { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::ObjectExpression(content) => { content.set_loc(start, end) }
+ Expression::OptionalExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::OptionalChain(content) => { content.set_loc(start, end) }
+ Expression::UnaryExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::TemplateExpression(content) => { content.set_loc(start, end) }
+ Expression::ThisExpression { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::UpdateExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::YieldExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::YieldGeneratorExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::AwaitExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Expression::ImportCallExpression { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Expression::MemberExpression(content) => { content.get_loc() }
+ Expression::ClassExpression(content) => { content.get_loc() }
+ Expression::LiteralBooleanExpression { loc, .. } => {
+ *loc
+ }
+ Expression::LiteralInfinityExpression { loc } => {
+ *loc
+ }
+ Expression::LiteralNullExpression { loc } => {
+ *loc
+ }
+ Expression::LiteralNumericExpression(content) => { content.get_loc() }
+ Expression::LiteralRegExpExpression { loc, .. } => {
+ *loc
+ }
+ Expression::LiteralStringExpression { loc, .. } => {
+ *loc
+ }
+ Expression::ArrayExpression(content) => { content.get_loc() }
+ Expression::ArrowExpression { loc, .. } => {
+ *loc
+ }
+ Expression::AssignmentExpression { loc, .. } => {
+ *loc
+ }
+ Expression::BinaryExpression { loc, .. } => {
+ *loc
+ }
+ Expression::CallExpression(content) => { content.get_loc() }
+ Expression::CompoundAssignmentExpression { loc, .. } => {
+ *loc
+ }
+ Expression::ConditionalExpression { loc, .. } => {
+ *loc
+ }
+ Expression::FunctionExpression(content) => { content.get_loc() }
+ Expression::IdentifierExpression(content) => { content.get_loc() }
+ Expression::NewExpression { loc, .. } => {
+ *loc
+ }
+ Expression::NewTargetExpression { loc } => {
+ *loc
+ }
+ Expression::ObjectExpression(content) => { content.get_loc() }
+ Expression::OptionalExpression { loc, .. } => {
+ *loc
+ }
+ Expression::OptionalChain(content) => { content.get_loc() }
+ Expression::UnaryExpression { loc, .. } => {
+ *loc
+ }
+ Expression::TemplateExpression(content) => { content.get_loc() }
+ Expression::ThisExpression { loc } => {
+ *loc
+ }
+ Expression::UpdateExpression { loc, .. } => {
+ *loc
+ }
+ Expression::YieldExpression { loc, .. } => {
+ *loc
+ }
+ Expression::YieldGeneratorExpression { loc, .. } => {
+ *loc
+ }
+ Expression::AwaitExpression { loc, .. } => {
+ *loc
+ }
+ Expression::ImportCallExpression { loc, .. } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ExpressionOrSuper<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ExpressionOrSuper::Expression(content) => { content.set_loc(start, end) }
+ ExpressionOrSuper::Super { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ExpressionOrSuper::Expression(content) => { content.get_loc() }
+ ExpressionOrSuper::Super { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for FormalParameters<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Function<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for FunctionBody<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Getter<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Identifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for IdentifierExpression {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for IdentifierName {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for IfStatement<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Import<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ImportDeclaration<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ImportDeclaration::Import(content) => { content.set_loc(start, end) }
+ ImportDeclaration::ImportNamespace(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ImportDeclaration::Import(content) => { content.get_loc() }
+ ImportDeclaration::ImportNamespace(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ImportNamespace {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ImportSpecifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Label {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for MemberAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ MemberAssignmentTarget::ComputedMemberAssignmentTarget(content) => { content.set_loc(start, end) }
+ MemberAssignmentTarget::PrivateFieldAssignmentTarget(content) => { content.set_loc(start, end) }
+ MemberAssignmentTarget::StaticMemberAssignmentTarget(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ MemberAssignmentTarget::ComputedMemberAssignmentTarget(content) => { content.get_loc() }
+ MemberAssignmentTarget::PrivateFieldAssignmentTarget(content) => { content.get_loc() }
+ MemberAssignmentTarget::StaticMemberAssignmentTarget(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for MemberExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ MemberExpression::ComputedMemberExpression(content) => { content.set_loc(start, end) }
+ MemberExpression::StaticMemberExpression(content) => { content.set_loc(start, end) }
+ MemberExpression::PrivateFieldExpression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ MemberExpression::ComputedMemberExpression(content) => { content.get_loc() }
+ MemberExpression::StaticMemberExpression(content) => { content.get_loc() }
+ MemberExpression::PrivateFieldExpression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Method<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for MethodDefinition<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ MethodDefinition::Method(content) => { content.set_loc(start, end) }
+ MethodDefinition::Getter(content) => { content.set_loc(start, end) }
+ MethodDefinition::Setter(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ MethodDefinition::Method(content) => { content.get_loc() }
+ MethodDefinition::Getter(content) => { content.get_loc() }
+ MethodDefinition::Setter(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Module<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ModuleItems<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ModuleItems::ImportDeclaration(content) => { content.set_loc(start, end) }
+ ModuleItems::ExportDeclaration(content) => { content.set_loc(start, end) }
+ ModuleItems::Statement(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ModuleItems::ImportDeclaration(content) => { content.get_loc() }
+ ModuleItems::ExportDeclaration(content) => { content.get_loc() }
+ ModuleItems::Statement(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for NamedObjectProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ NamedObjectProperty::MethodDefinition(content) => { content.set_loc(start, end) }
+ NamedObjectProperty::DataProperty(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ NamedObjectProperty::MethodDefinition(content) => { content.get_loc() }
+ NamedObjectProperty::DataProperty(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for NumericLiteral {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ObjectAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ObjectBinding<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ObjectExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ObjectProperty<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ ObjectProperty::NamedObjectProperty(content) => { content.set_loc(start, end) }
+ ObjectProperty::ShorthandProperty(content) => { content.set_loc(start, end) }
+ ObjectProperty::SpreadProperty(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ ObjectProperty::NamedObjectProperty(content) => { content.get_loc() }
+ ObjectProperty::ShorthandProperty(content) => { content.get_loc() }
+ ObjectProperty::SpreadProperty(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for OptionalChain<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ OptionalChain::ComputedMemberExpressionTail { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ OptionalChain::StaticMemberExpressionTail { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ OptionalChain::PrivateFieldExpressionTail { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ OptionalChain::CallExpressionTail { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ OptionalChain::ComputedMemberExpression(content) => { content.set_loc(start, end) }
+ OptionalChain::StaticMemberExpression(content) => { content.set_loc(start, end) }
+ OptionalChain::PrivateFieldExpression(content) => { content.set_loc(start, end) }
+ OptionalChain::CallExpression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ OptionalChain::ComputedMemberExpressionTail { loc, .. } => {
+ *loc
+ }
+ OptionalChain::StaticMemberExpressionTail { loc, .. } => {
+ *loc
+ }
+ OptionalChain::PrivateFieldExpressionTail { loc, .. } => {
+ *loc
+ }
+ OptionalChain::CallExpressionTail { loc, .. } => {
+ *loc
+ }
+ OptionalChain::ComputedMemberExpression(content) => { content.get_loc() }
+ OptionalChain::StaticMemberExpression(content) => { content.get_loc() }
+ OptionalChain::PrivateFieldExpression(content) => { content.get_loc() }
+ OptionalChain::CallExpression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Parameter<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Parameter::Binding(content) => { content.set_loc(start, end) }
+ Parameter::BindingWithDefault(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Parameter::Binding(content) => { content.get_loc() }
+ Parameter::BindingWithDefault(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for PrivateFieldAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for PrivateFieldExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for PrivateIdentifier {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Program<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Program::Module(content) => { content.set_loc(start, end) }
+ Program::Script(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Program::Module(content) => { content.get_loc() }
+ Program::Script(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for PropertyName<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ PropertyName::ComputedPropertyName(content) => { content.set_loc(start, end) }
+ PropertyName::StaticPropertyName(content) => { content.set_loc(start, end) }
+ PropertyName::StaticNumericPropertyName(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ PropertyName::ComputedPropertyName(content) => { content.get_loc() }
+ PropertyName::StaticPropertyName(content) => { content.get_loc() }
+ PropertyName::StaticNumericPropertyName(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Script<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Setter<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for ShorthandProperty {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for SimpleAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ SimpleAssignmentTarget::AssignmentTargetIdentifier(content) => { content.set_loc(start, end) }
+ SimpleAssignmentTarget::MemberAssignmentTarget(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ SimpleAssignmentTarget::AssignmentTargetIdentifier(content) => { content.get_loc() }
+ SimpleAssignmentTarget::MemberAssignmentTarget(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for Statement<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ Statement::BlockStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::BreakStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ContinueStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::DebuggerStatement { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::DoWhileStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::EmptyStatement { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ExpressionStatement(content) => { content.set_loc(start, end) }
+ Statement::ForInStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ForOfStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ForStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::IfStatement(content) => { content.set_loc(start, end) }
+ Statement::LabelledStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ReturnStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::SwitchStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::SwitchStatementWithDefault { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::ThrowStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::TryCatchStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::TryFinallyStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::WhileStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::WithStatement { mut loc, .. } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ Statement::VariableDeclarationStatement(content) => { content.set_loc(start, end) }
+ Statement::FunctionDeclaration(content) => { content.set_loc(start, end) }
+ Statement::ClassDeclaration(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ Statement::BlockStatement { loc, .. } => {
+ *loc
+ }
+ Statement::BreakStatement { loc, .. } => {
+ *loc
+ }
+ Statement::ContinueStatement { loc, .. } => {
+ *loc
+ }
+ Statement::DebuggerStatement { loc } => {
+ *loc
+ }
+ Statement::DoWhileStatement { loc, .. } => {
+ *loc
+ }
+ Statement::EmptyStatement { loc } => {
+ *loc
+ }
+ Statement::ExpressionStatement(content) => { content.get_loc() }
+ Statement::ForInStatement { loc, .. } => {
+ *loc
+ }
+ Statement::ForOfStatement { loc, .. } => {
+ *loc
+ }
+ Statement::ForStatement { loc, .. } => {
+ *loc
+ }
+ Statement::IfStatement(content) => { content.get_loc() }
+ Statement::LabelledStatement { loc, .. } => {
+ *loc
+ }
+ Statement::ReturnStatement { loc, .. } => {
+ *loc
+ }
+ Statement::SwitchStatement { loc, .. } => {
+ *loc
+ }
+ Statement::SwitchStatementWithDefault { loc, .. } => {
+ *loc
+ }
+ Statement::ThrowStatement { loc, .. } => {
+ *loc
+ }
+ Statement::TryCatchStatement { loc, .. } => {
+ *loc
+ }
+ Statement::TryFinallyStatement { loc, .. } => {
+ *loc
+ }
+ Statement::WhileStatement { loc, .. } => {
+ *loc
+ }
+ Statement::WithStatement { loc, .. } => {
+ *loc
+ }
+ Statement::VariableDeclarationStatement(content) => { content.get_loc() }
+ Statement::FunctionDeclaration(content) => { content.get_loc() }
+ Statement::ClassDeclaration(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for StaticMemberAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for StaticMemberExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for StaticPropertyName {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for SwitchCase<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for SwitchDefault<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for TemplateElement {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for TemplateExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for TemplateExpressionElement<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ TemplateExpressionElement::Expression(content) => { content.set_loc(start, end) }
+ TemplateExpressionElement::TemplateElement(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ TemplateExpressionElement::Expression(content) => { content.get_loc() }
+ TemplateExpressionElement::TemplateElement(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for UnaryOperator {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ UnaryOperator::Plus { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::Minus { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::LogicalNot { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::BitwiseNot { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::Typeof { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::Void { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UnaryOperator::Delete { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ UnaryOperator::Plus { loc } => {
+ *loc
+ }
+ UnaryOperator::Minus { loc } => {
+ *loc
+ }
+ UnaryOperator::LogicalNot { loc } => {
+ *loc
+ }
+ UnaryOperator::BitwiseNot { loc } => {
+ *loc
+ }
+ UnaryOperator::Typeof { loc } => {
+ *loc
+ }
+ UnaryOperator::Void { loc } => {
+ *loc
+ }
+ UnaryOperator::Delete { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for UpdateOperator {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ UpdateOperator::Increment { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ UpdateOperator::Decrement { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ UpdateOperator::Increment { loc } => {
+ *loc
+ }
+ UpdateOperator::Decrement { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableDeclaration<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableDeclarationKind {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ VariableDeclarationKind::Var { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ VariableDeclarationKind::Let { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ VariableDeclarationKind::Const { mut loc } => {
+ loc.start = start.start;
+ loc.end = end.end;
+ }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ VariableDeclarationKind::Var { loc } => {
+ *loc
+ }
+ VariableDeclarationKind::Let { loc } => {
+ *loc
+ }
+ VariableDeclarationKind::Const { loc } => {
+ *loc
+ }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableDeclarationOrAssignmentTarget<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ VariableDeclarationOrAssignmentTarget::VariableDeclaration(content) => { content.set_loc(start, end) }
+ VariableDeclarationOrAssignmentTarget::AssignmentTarget(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ VariableDeclarationOrAssignmentTarget::VariableDeclaration(content) => { content.get_loc() }
+ VariableDeclarationOrAssignmentTarget::AssignmentTarget(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableDeclarationOrExpression<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ VariableDeclarationOrExpression::VariableDeclaration(content) => { content.set_loc(start, end) }
+ VariableDeclarationOrExpression::Expression(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ VariableDeclarationOrExpression::VariableDeclaration(content) => { content.get_loc() }
+ VariableDeclarationOrExpression::Expression(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableDeclarator<'alloc> {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ self.loc.start = start.start;
+ self.loc.end = end.end;
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ self.loc
+ }
+}
+
+impl<'alloc> SourceLocationAccessor for VariableReference {
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ match self {
+ VariableReference::BindingIdentifier(content) => { content.set_loc(start, end) }
+ VariableReference::AssignmentTargetIdentifier(content) => { content.set_loc(start, end) }
+ }
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ match self {
+ VariableReference::BindingIdentifier(content) => { content.get_loc() }
+ VariableReference::AssignmentTargetIdentifier(content) => { content.get_loc() }
+ }
+ }
+}
+
+impl<'alloc, T> SourceLocationAccessor for arena::Box<'alloc, T>
+where
+ T: SourceLocationAccessor,
+{
+ fn set_loc(&mut self, start: SourceLocation, end: SourceLocation) {
+ (self.borrow_mut() as &mut T).set_loc(start, end)
+ }
+
+ fn get_loc(&self) -> SourceLocation {
+ (self.borrow() as &T).get_loc()
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/source_slice_list.rs b/third_party/rust/jsparagus-ast/src/source_slice_list.rs
new file mode 100644
index 0000000000..c7005b3601
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/source_slice_list.rs
@@ -0,0 +1,49 @@
+/// Index into SourceSliceList.items.
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+pub struct SourceSliceIndex {
+ index: usize,
+}
+impl SourceSliceIndex {
+ fn new(index: usize) -> Self {
+ Self { index }
+ }
+}
+
+impl From<SourceSliceIndex> for usize {
+ fn from(index: SourceSliceIndex) -> usize {
+ index.index
+ }
+}
+
+/// Set of slices inside source, including the following:
+///
+/// * RegExp source
+/// * BigInt literal
+///
+/// Compared to `SourceAtomSet`, this is not atomized.
+#[derive(Debug)]
+pub struct SourceSliceList<'alloc> {
+ items: Vec<&'alloc str>,
+}
+
+impl<'alloc> SourceSliceList<'alloc> {
+ pub fn new() -> Self {
+ Self { items: Vec::new() }
+ }
+
+ pub fn push(&mut self, s: &'alloc str) -> SourceSliceIndex {
+ let index = self.items.len();
+ self.items.push(s);
+ SourceSliceIndex::new(index)
+ }
+
+ pub fn get(&self, index: SourceSliceIndex) -> &'alloc str {
+ self.items.get(usize::from(index)).unwrap()
+ }
+}
+
+impl<'alloc> From<SourceSliceList<'alloc>> for Vec<&'alloc str> {
+ fn from(set: SourceSliceList<'alloc>) -> Vec<&'alloc str> {
+ set.items.into_iter().collect()
+ }
+}
diff --git a/third_party/rust/jsparagus-ast/src/type_id_generated.rs b/third_party/rust/jsparagus-ast/src/type_id_generated.rs
new file mode 100644
index 0000000000..d764194f24
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/type_id_generated.rs
@@ -0,0 +1,712 @@
+// WARNING: This file is auto-generated.
+
+use crate::types::*;
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
+pub enum NodeTypeId {
+ Argument,
+ Arguments,
+ Identifier,
+ IdentifierName,
+ PrivateIdentifier,
+ Label,
+ VariableDeclarationKind,
+ CompoundAssignmentOperator,
+ BinaryOperator,
+ UnaryOperator,
+ UpdateOperator,
+ Function,
+ Program,
+ IfStatement,
+ Statement,
+ Expression,
+ MemberExpression,
+ OptionalChain,
+ PropertyName,
+ CallExpression,
+ ClassElementName,
+ ObjectProperty,
+ NamedObjectProperty,
+ MethodDefinition,
+ ImportDeclaration,
+ ExportDeclaration,
+ VariableReference,
+ BindingPattern,
+ Binding,
+ SimpleAssignmentTarget,
+ AssignmentTargetPattern,
+ AssignmentTarget,
+ Parameter,
+ BindingWithDefault,
+ BindingIdentifier,
+ AssignmentTargetIdentifier,
+ ExpressionOrSuper,
+ MemberAssignmentTarget,
+ ComputedMemberAssignmentTarget,
+ PrivateFieldAssignmentTarget,
+ StaticMemberAssignmentTarget,
+ ArrayBinding,
+ ObjectBinding,
+ BindingProperty,
+ BindingPropertyIdentifier,
+ BindingPropertyProperty,
+ AssignmentTargetWithDefault,
+ AssignmentTargetMaybeDefault,
+ ArrayAssignmentTarget,
+ ObjectAssignmentTarget,
+ AssignmentTargetProperty,
+ AssignmentTargetPropertyIdentifier,
+ AssignmentTargetPropertyProperty,
+ ClassExpression,
+ ClassDeclaration,
+ ClassElement,
+ ModuleItems,
+ Module,
+ Import,
+ ImportNamespace,
+ ImportSpecifier,
+ ExportAllFrom,
+ ExportFrom,
+ ExportLocals,
+ Export,
+ ExportDefault,
+ ExportFromSpecifier,
+ ExportLocalSpecifier,
+ Method,
+ Getter,
+ Setter,
+ DataProperty,
+ ShorthandProperty,
+ ComputedPropertyName,
+ StaticPropertyName,
+ NumericLiteral,
+ ArrayExpressionElement,
+ ArrayExpression,
+ ArrowExpressionBody,
+ ComputedMemberExpression,
+ IdentifierExpression,
+ ObjectExpression,
+ StaticMemberExpression,
+ PrivateFieldExpression,
+ TemplateExpressionElement,
+ TemplateExpression,
+ VariableDeclarationOrAssignmentTarget,
+ VariableDeclarationOrExpression,
+ Block,
+ CatchClause,
+ Directive,
+ FormalParameters,
+ FunctionBody,
+ Script,
+ SwitchCase,
+ SwitchDefault,
+ TemplateElement,
+ VariableDeclaration,
+ VariableDeclarator,
+ CoverParenthesized,
+}
+
+pub trait NodeTypeIdAccessor {
+ fn get_type_id(&self) -> NodeTypeId;
+}
+
+impl<'alloc> NodeTypeIdAccessor for Argument<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Argument
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Arguments<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Arguments
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Identifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Identifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for IdentifierName {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::IdentifierName
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for PrivateIdentifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::PrivateIdentifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Label {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Label
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableDeclarationKind {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableDeclarationKind
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for CompoundAssignmentOperator {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::CompoundAssignmentOperator
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BinaryOperator {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BinaryOperator
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for UnaryOperator {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::UnaryOperator
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for UpdateOperator {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::UpdateOperator
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Function<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Function
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Program<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Program
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for IfStatement<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::IfStatement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Statement<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Statement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Expression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Expression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for MemberExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::MemberExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for OptionalChain<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::OptionalChain
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for PropertyName<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::PropertyName
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for CallExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::CallExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ClassElementName<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ClassElementName
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ObjectProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ObjectProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for NamedObjectProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::NamedObjectProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for MethodDefinition<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::MethodDefinition
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ImportDeclaration<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ImportDeclaration
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportDeclaration<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportDeclaration
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableReference {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableReference
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingPattern<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingPattern
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Binding<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Binding
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for SimpleAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::SimpleAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetPattern<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetPattern
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Parameter<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Parameter
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingWithDefault<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingWithDefault
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingIdentifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingIdentifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetIdentifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetIdentifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExpressionOrSuper<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExpressionOrSuper
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for MemberAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::MemberAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ComputedMemberAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ComputedMemberAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for PrivateFieldAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::PrivateFieldAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for StaticMemberAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::StaticMemberAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ArrayBinding<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ArrayBinding
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ObjectBinding<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ObjectBinding
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingPropertyIdentifier<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingPropertyIdentifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for BindingPropertyProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::BindingPropertyProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetWithDefault<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetWithDefault
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetMaybeDefault<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetMaybeDefault
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ArrayAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ArrayAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ObjectAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ObjectAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetPropertyIdentifier<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetPropertyIdentifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for AssignmentTargetPropertyProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::AssignmentTargetPropertyProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ClassExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ClassExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ClassDeclaration<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ClassDeclaration
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ClassElement<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ClassElement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ModuleItems<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ModuleItems
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Module<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Module
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Import<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Import
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ImportNamespace {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ImportNamespace
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ImportSpecifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ImportSpecifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportAllFrom {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportAllFrom
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportFrom<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportFrom
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportLocals<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportLocals
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Export<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Export
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportDefault<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportDefault
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportFromSpecifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportFromSpecifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ExportLocalSpecifier {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ExportLocalSpecifier
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Method<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Method
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Getter<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Getter
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Setter<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Setter
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for DataProperty<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::DataProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ShorthandProperty {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ShorthandProperty
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ComputedPropertyName<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ComputedPropertyName
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for StaticPropertyName {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::StaticPropertyName
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for NumericLiteral {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::NumericLiteral
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ArrayExpressionElement<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ArrayExpressionElement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ArrayExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ArrayExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ArrowExpressionBody<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ArrowExpressionBody
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ComputedMemberExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ComputedMemberExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for IdentifierExpression {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::IdentifierExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for ObjectExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::ObjectExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for StaticMemberExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::StaticMemberExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for PrivateFieldExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::PrivateFieldExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for TemplateExpressionElement<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::TemplateExpressionElement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for TemplateExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::TemplateExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableDeclarationOrAssignmentTarget<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableDeclarationOrAssignmentTarget
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableDeclarationOrExpression<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableDeclarationOrExpression
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Block<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Block
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for CatchClause<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::CatchClause
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Directive {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Directive
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for FormalParameters<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::FormalParameters
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for FunctionBody<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::FunctionBody
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for Script<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::Script
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for SwitchCase<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::SwitchCase
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for SwitchDefault<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::SwitchDefault
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for TemplateElement {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::TemplateElement
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableDeclaration<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableDeclaration
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for VariableDeclarator<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::VariableDeclarator
+ }
+}
+
+impl<'alloc> NodeTypeIdAccessor for CoverParenthesized<'alloc> {
+ fn get_type_id(&self) -> NodeTypeId {
+ NodeTypeId::CoverParenthesized
+ }
+}
+
diff --git a/third_party/rust/jsparagus-ast/src/types_generated.rs b/third_party/rust/jsparagus-ast/src/types_generated.rs
new file mode 100644
index 0000000000..82a9daccfd
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/types_generated.rs
@@ -0,0 +1,1055 @@
+// WARNING: This file is auto-generated.
+
+use crate::source_location::SourceLocation;
+use crate::arena;
+use crate::source_atom_set::SourceAtomSetIndex;
+use crate::source_slice_list::SourceSliceIndex;
+
+#[derive(Debug, PartialEq)]
+pub enum Void {
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Argument<'alloc> {
+ SpreadElement(arena::Box<'alloc, Expression<'alloc>>),
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Arguments<'alloc> {
+ pub args: arena::Vec<'alloc, Argument<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Identifier {
+ pub value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct IdentifierName {
+ pub value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct PrivateIdentifier {
+ pub value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Label {
+ pub value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum VariableDeclarationKind {
+ Var {
+ loc: SourceLocation,
+ },
+ Let {
+ loc: SourceLocation,
+ },
+ Const {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum CompoundAssignmentOperator {
+ LogicalOr {
+ loc: SourceLocation,
+ },
+ LogicalAnd {
+ loc: SourceLocation,
+ },
+ Coalesce {
+ loc: SourceLocation,
+ },
+ Add {
+ loc: SourceLocation,
+ },
+ Sub {
+ loc: SourceLocation,
+ },
+ Mul {
+ loc: SourceLocation,
+ },
+ Div {
+ loc: SourceLocation,
+ },
+ Mod {
+ loc: SourceLocation,
+ },
+ Pow {
+ loc: SourceLocation,
+ },
+ LeftShift {
+ loc: SourceLocation,
+ },
+ RightShift {
+ loc: SourceLocation,
+ },
+ RightShiftExt {
+ loc: SourceLocation,
+ },
+ Or {
+ loc: SourceLocation,
+ },
+ Xor {
+ loc: SourceLocation,
+ },
+ And {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum BinaryOperator {
+ Equals {
+ loc: SourceLocation,
+ },
+ NotEquals {
+ loc: SourceLocation,
+ },
+ StrictEquals {
+ loc: SourceLocation,
+ },
+ StrictNotEquals {
+ loc: SourceLocation,
+ },
+ LessThan {
+ loc: SourceLocation,
+ },
+ LessThanOrEqual {
+ loc: SourceLocation,
+ },
+ GreaterThan {
+ loc: SourceLocation,
+ },
+ GreaterThanOrEqual {
+ loc: SourceLocation,
+ },
+ In {
+ loc: SourceLocation,
+ },
+ Instanceof {
+ loc: SourceLocation,
+ },
+ LeftShift {
+ loc: SourceLocation,
+ },
+ RightShift {
+ loc: SourceLocation,
+ },
+ RightShiftExt {
+ loc: SourceLocation,
+ },
+ Add {
+ loc: SourceLocation,
+ },
+ Sub {
+ loc: SourceLocation,
+ },
+ Mul {
+ loc: SourceLocation,
+ },
+ Div {
+ loc: SourceLocation,
+ },
+ Mod {
+ loc: SourceLocation,
+ },
+ Pow {
+ loc: SourceLocation,
+ },
+ Comma {
+ loc: SourceLocation,
+ },
+ Coalesce {
+ loc: SourceLocation,
+ },
+ LogicalOr {
+ loc: SourceLocation,
+ },
+ LogicalAnd {
+ loc: SourceLocation,
+ },
+ BitwiseOr {
+ loc: SourceLocation,
+ },
+ BitwiseXor {
+ loc: SourceLocation,
+ },
+ BitwiseAnd {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum UnaryOperator {
+ Plus {
+ loc: SourceLocation,
+ },
+ Minus {
+ loc: SourceLocation,
+ },
+ LogicalNot {
+ loc: SourceLocation,
+ },
+ BitwiseNot {
+ loc: SourceLocation,
+ },
+ Typeof {
+ loc: SourceLocation,
+ },
+ Void {
+ loc: SourceLocation,
+ },
+ Delete {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum UpdateOperator {
+ Increment {
+ loc: SourceLocation,
+ },
+ Decrement {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Function<'alloc> {
+ pub name: Option<BindingIdentifier>,
+ pub is_async: bool,
+ pub is_generator: bool,
+ pub params: FormalParameters<'alloc>,
+ pub body: FunctionBody<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Program<'alloc> {
+ Module(Module<'alloc>),
+ Script(Script<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct IfStatement<'alloc> {
+ pub test: arena::Box<'alloc, Expression<'alloc>>,
+ pub consequent: arena::Box<'alloc, Statement<'alloc>>,
+ pub alternate: Option<arena::Box<'alloc, Statement<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Statement<'alloc> {
+ BlockStatement {
+ block: Block<'alloc>,
+ loc: SourceLocation,
+ },
+ BreakStatement {
+ label: Option<Label>,
+ loc: SourceLocation,
+ },
+ ContinueStatement {
+ label: Option<Label>,
+ loc: SourceLocation,
+ },
+ DebuggerStatement {
+ loc: SourceLocation,
+ },
+ DoWhileStatement {
+ block: arena::Box<'alloc, Statement<'alloc>>,
+ test: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ EmptyStatement {
+ loc: SourceLocation,
+ },
+ ExpressionStatement(arena::Box<'alloc, Expression<'alloc>>),
+ ForInStatement {
+ left: VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: arena::Box<'alloc, Expression<'alloc>>,
+ block: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ ForOfStatement {
+ left: VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: arena::Box<'alloc, Expression<'alloc>>,
+ block: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ ForStatement {
+ init: Option<VariableDeclarationOrExpression<'alloc>>,
+ test: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ update: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ block: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ IfStatement(IfStatement<'alloc>),
+ LabelledStatement {
+ label: Label,
+ body: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ ReturnStatement {
+ expression: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ loc: SourceLocation,
+ },
+ SwitchStatement {
+ discriminant: arena::Box<'alloc, Expression<'alloc>>,
+ cases: arena::Vec<'alloc, SwitchCase<'alloc>>,
+ loc: SourceLocation,
+ },
+ SwitchStatementWithDefault {
+ discriminant: arena::Box<'alloc, Expression<'alloc>>,
+ pre_default_cases: arena::Vec<'alloc, SwitchCase<'alloc>>,
+ default_case: SwitchDefault<'alloc>,
+ post_default_cases: arena::Vec<'alloc, SwitchCase<'alloc>>,
+ loc: SourceLocation,
+ },
+ ThrowStatement {
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ TryCatchStatement {
+ body: Block<'alloc>,
+ catch_clause: CatchClause<'alloc>,
+ loc: SourceLocation,
+ },
+ TryFinallyStatement {
+ body: Block<'alloc>,
+ catch_clause: Option<CatchClause<'alloc>>,
+ finalizer: Block<'alloc>,
+ loc: SourceLocation,
+ },
+ WhileStatement {
+ test: arena::Box<'alloc, Expression<'alloc>>,
+ block: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ WithStatement {
+ object: arena::Box<'alloc, Expression<'alloc>>,
+ body: arena::Box<'alloc, Statement<'alloc>>,
+ loc: SourceLocation,
+ },
+ VariableDeclarationStatement(VariableDeclaration<'alloc>),
+ FunctionDeclaration(Function<'alloc>),
+ ClassDeclaration(ClassDeclaration<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Expression<'alloc> {
+ MemberExpression(MemberExpression<'alloc>),
+ ClassExpression(ClassExpression<'alloc>),
+ LiteralBooleanExpression {
+ value: bool,
+ loc: SourceLocation,
+ },
+ LiteralInfinityExpression {
+ loc: SourceLocation,
+ },
+ LiteralNullExpression {
+ loc: SourceLocation,
+ },
+ LiteralNumericExpression(NumericLiteral),
+ LiteralRegExpExpression {
+ pattern: SourceSliceIndex,
+ global: bool,
+ ignore_case: bool,
+ multi_line: bool,
+ dot_all: bool,
+ sticky: bool,
+ unicode: bool,
+ loc: SourceLocation,
+ },
+ LiteralStringExpression {
+ value: SourceAtomSetIndex,
+ loc: SourceLocation,
+ },
+ ArrayExpression(ArrayExpression<'alloc>),
+ ArrowExpression {
+ is_async: bool,
+ params: FormalParameters<'alloc>,
+ body: ArrowExpressionBody<'alloc>,
+ loc: SourceLocation,
+ },
+ AssignmentExpression {
+ binding: AssignmentTarget<'alloc>,
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ BinaryExpression {
+ operator: BinaryOperator,
+ left: arena::Box<'alloc, Expression<'alloc>>,
+ right: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ CallExpression(CallExpression<'alloc>),
+ CompoundAssignmentExpression {
+ operator: CompoundAssignmentOperator,
+ binding: SimpleAssignmentTarget<'alloc>,
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ ConditionalExpression {
+ test: arena::Box<'alloc, Expression<'alloc>>,
+ consequent: arena::Box<'alloc, Expression<'alloc>>,
+ alternate: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ FunctionExpression(Function<'alloc>),
+ IdentifierExpression(IdentifierExpression),
+ NewExpression {
+ callee: arena::Box<'alloc, Expression<'alloc>>,
+ arguments: Arguments<'alloc>,
+ loc: SourceLocation,
+ },
+ NewTargetExpression {
+ loc: SourceLocation,
+ },
+ ObjectExpression(ObjectExpression<'alloc>),
+ OptionalExpression {
+ object: ExpressionOrSuper<'alloc>,
+ tail: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ OptionalChain(OptionalChain<'alloc>),
+ UnaryExpression {
+ operator: UnaryOperator,
+ operand: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ TemplateExpression(TemplateExpression<'alloc>),
+ ThisExpression {
+ loc: SourceLocation,
+ },
+ UpdateExpression {
+ is_prefix: bool,
+ operator: UpdateOperator,
+ operand: SimpleAssignmentTarget<'alloc>,
+ loc: SourceLocation,
+ },
+ YieldExpression {
+ expression: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ loc: SourceLocation,
+ },
+ YieldGeneratorExpression {
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ AwaitExpression {
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ ImportCallExpression {
+ argument: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum MemberExpression<'alloc> {
+ ComputedMemberExpression(ComputedMemberExpression<'alloc>),
+ StaticMemberExpression(StaticMemberExpression<'alloc>),
+ PrivateFieldExpression(PrivateFieldExpression<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum OptionalChain<'alloc> {
+ ComputedMemberExpressionTail {
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ StaticMemberExpressionTail {
+ property: IdentifierName,
+ loc: SourceLocation,
+ },
+ PrivateFieldExpressionTail {
+ field: PrivateIdentifier,
+ loc: SourceLocation,
+ },
+ CallExpressionTail {
+ arguments: Arguments<'alloc>,
+ loc: SourceLocation,
+ },
+ ComputedMemberExpression(ComputedMemberExpression<'alloc>),
+ StaticMemberExpression(StaticMemberExpression<'alloc>),
+ PrivateFieldExpression(PrivateFieldExpression<'alloc>),
+ CallExpression(CallExpression<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum PropertyName<'alloc> {
+ ComputedPropertyName(ComputedPropertyName<'alloc>),
+ StaticPropertyName(StaticPropertyName),
+ StaticNumericPropertyName(NumericLiteral),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct CallExpression<'alloc> {
+ pub callee: ExpressionOrSuper<'alloc>,
+ pub arguments: Arguments<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ClassElementName<'alloc> {
+ ComputedPropertyName(ComputedPropertyName<'alloc>),
+ StaticPropertyName(StaticPropertyName),
+ StaticNumericPropertyName(NumericLiteral),
+ PrivateFieldName(PrivateIdentifier),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ObjectProperty<'alloc> {
+ NamedObjectProperty(NamedObjectProperty<'alloc>),
+ ShorthandProperty(ShorthandProperty),
+ SpreadProperty(arena::Box<'alloc, Expression<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum NamedObjectProperty<'alloc> {
+ MethodDefinition(MethodDefinition<'alloc>),
+ DataProperty(DataProperty<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum MethodDefinition<'alloc> {
+ Method(Method<'alloc>),
+ Getter(Getter<'alloc>),
+ Setter(Setter<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ImportDeclaration<'alloc> {
+ Import(Import<'alloc>),
+ ImportNamespace(ImportNamespace),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ExportDeclaration<'alloc> {
+ ExportAllFrom(ExportAllFrom),
+ ExportFrom(ExportFrom<'alloc>),
+ ExportLocals(ExportLocals<'alloc>),
+ Export(Export<'alloc>),
+ ExportDefault(ExportDefault<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum VariableReference {
+ BindingIdentifier(BindingIdentifier),
+ AssignmentTargetIdentifier(AssignmentTargetIdentifier),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum BindingPattern<'alloc> {
+ ObjectBinding(ObjectBinding<'alloc>),
+ ArrayBinding(ArrayBinding<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Binding<'alloc> {
+ BindingPattern(BindingPattern<'alloc>),
+ BindingIdentifier(BindingIdentifier),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum SimpleAssignmentTarget<'alloc> {
+ AssignmentTargetIdentifier(AssignmentTargetIdentifier),
+ MemberAssignmentTarget(MemberAssignmentTarget<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum AssignmentTargetPattern<'alloc> {
+ ArrayAssignmentTarget(ArrayAssignmentTarget<'alloc>),
+ ObjectAssignmentTarget(ObjectAssignmentTarget<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum AssignmentTarget<'alloc> {
+ AssignmentTargetPattern(AssignmentTargetPattern<'alloc>),
+ SimpleAssignmentTarget(SimpleAssignmentTarget<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Parameter<'alloc> {
+ Binding(Binding<'alloc>),
+ BindingWithDefault(BindingWithDefault<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct BindingWithDefault<'alloc> {
+ pub binding: Binding<'alloc>,
+ pub init: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct BindingIdentifier {
+ pub name: Identifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct AssignmentTargetIdentifier {
+ pub name: Identifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ExpressionOrSuper<'alloc> {
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+ Super {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum MemberAssignmentTarget<'alloc> {
+ ComputedMemberAssignmentTarget(ComputedMemberAssignmentTarget<'alloc>),
+ PrivateFieldAssignmentTarget(PrivateFieldAssignmentTarget<'alloc>),
+ StaticMemberAssignmentTarget(StaticMemberAssignmentTarget<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ComputedMemberAssignmentTarget<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub expression: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct PrivateFieldAssignmentTarget<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub field: PrivateIdentifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct StaticMemberAssignmentTarget<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub property: IdentifierName,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ArrayBinding<'alloc> {
+ pub elements: arena::Vec<'alloc, Option<Parameter<'alloc>>>,
+ pub rest: Option<arena::Box<'alloc, Binding<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ObjectBinding<'alloc> {
+ pub properties: arena::Vec<'alloc, BindingProperty<'alloc>>,
+ pub rest: Option<arena::Box<'alloc, BindingIdentifier>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum BindingProperty<'alloc> {
+ BindingPropertyIdentifier(BindingPropertyIdentifier<'alloc>),
+ BindingPropertyProperty(BindingPropertyProperty<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct BindingPropertyIdentifier<'alloc> {
+ pub binding: BindingIdentifier,
+ pub init: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct BindingPropertyProperty<'alloc> {
+ pub name: PropertyName<'alloc>,
+ pub binding: Parameter<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct AssignmentTargetWithDefault<'alloc> {
+ pub binding: AssignmentTarget<'alloc>,
+ pub init: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum AssignmentTargetMaybeDefault<'alloc> {
+ AssignmentTarget(AssignmentTarget<'alloc>),
+ AssignmentTargetWithDefault(AssignmentTargetWithDefault<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ArrayAssignmentTarget<'alloc> {
+ pub elements: arena::Vec<'alloc, Option<AssignmentTargetMaybeDefault<'alloc>>>,
+ pub rest: Option<arena::Box<'alloc, AssignmentTarget<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ObjectAssignmentTarget<'alloc> {
+ pub properties: arena::Vec<'alloc, AssignmentTargetProperty<'alloc>>,
+ pub rest: Option<arena::Box<'alloc, AssignmentTarget<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum AssignmentTargetProperty<'alloc> {
+ AssignmentTargetPropertyIdentifier(AssignmentTargetPropertyIdentifier<'alloc>),
+ AssignmentTargetPropertyProperty(AssignmentTargetPropertyProperty<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct AssignmentTargetPropertyIdentifier<'alloc> {
+ pub binding: AssignmentTargetIdentifier,
+ pub init: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct AssignmentTargetPropertyProperty<'alloc> {
+ pub name: PropertyName<'alloc>,
+ pub binding: AssignmentTargetMaybeDefault<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ClassExpression<'alloc> {
+ pub name: Option<BindingIdentifier>,
+ pub super_: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub elements: arena::Vec<'alloc, arena::Box<'alloc, ClassElement<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ClassDeclaration<'alloc> {
+ pub name: BindingIdentifier,
+ pub super_: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub elements: arena::Vec<'alloc, arena::Box<'alloc, ClassElement<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ClassElement<'alloc> {
+ MethodDefinition {
+ is_static: bool,
+ method: MethodDefinition<'alloc>,
+ loc: SourceLocation,
+ },
+ FieldDefinition {
+ name: ClassElementName<'alloc>,
+ init: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ModuleItems<'alloc> {
+ ImportDeclaration(ImportDeclaration<'alloc>),
+ ExportDeclaration(ExportDeclaration<'alloc>),
+ Statement(arena::Box<'alloc, Statement<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Module<'alloc> {
+ pub directives: arena::Vec<'alloc, Directive>,
+ pub items: arena::Vec<'alloc, ModuleItems<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Import<'alloc> {
+ pub module_specifier: SourceAtomSetIndex,
+ pub default_binding: Option<BindingIdentifier>,
+ pub named_imports: arena::Vec<'alloc, ImportSpecifier>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ImportNamespace {
+ pub module_specifier: SourceAtomSetIndex,
+ pub default_binding: Option<BindingIdentifier>,
+ pub namespace_binding: BindingIdentifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ImportSpecifier {
+ pub name: Option<IdentifierName>,
+ pub binding: BindingIdentifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ExportAllFrom {
+ pub module_specifier: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ExportFrom<'alloc> {
+ pub named_exports: arena::Vec<'alloc, ExportFromSpecifier>,
+ pub module_specifier: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ExportLocals<'alloc> {
+ pub named_exports: arena::Vec<'alloc, ExportLocalSpecifier>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum Export<'alloc> {
+ FunctionDeclaration(Function<'alloc>),
+ ClassDeclaration(ClassDeclaration<'alloc>),
+ VariableDeclaration(VariableDeclaration<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ExportDefault<'alloc> {
+ FunctionDeclaration(Function<'alloc>),
+ ClassDeclaration(ClassDeclaration<'alloc>),
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ExportFromSpecifier {
+ pub name: IdentifierName,
+ pub exported_name: Option<IdentifierName>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ExportLocalSpecifier {
+ pub name: IdentifierExpression,
+ pub exported_name: Option<IdentifierName>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Method<'alloc> {
+ pub name: ClassElementName<'alloc>,
+ pub is_async: bool,
+ pub is_generator: bool,
+ pub params: FormalParameters<'alloc>,
+ pub body: FunctionBody<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Getter<'alloc> {
+ pub property_name: ClassElementName<'alloc>,
+ pub body: FunctionBody<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Setter<'alloc> {
+ pub property_name: ClassElementName<'alloc>,
+ pub param: Parameter<'alloc>,
+ pub body: FunctionBody<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct DataProperty<'alloc> {
+ pub property_name: PropertyName<'alloc>,
+ pub expression: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ShorthandProperty {
+ pub name: IdentifierExpression,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ComputedPropertyName<'alloc> {
+ pub expression: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct StaticPropertyName {
+ pub value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct NumericLiteral {
+ pub value: f64,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ArrayExpressionElement<'alloc> {
+ SpreadElement(arena::Box<'alloc, Expression<'alloc>>),
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+ Elision {
+ loc: SourceLocation,
+ },
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ArrayExpression<'alloc> {
+ pub elements: arena::Vec<'alloc, ArrayExpressionElement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ArrowExpressionBody<'alloc> {
+ FunctionBody(FunctionBody<'alloc>),
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ComputedMemberExpression<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub expression: arena::Box<'alloc, Expression<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct IdentifierExpression {
+ pub name: Identifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ObjectExpression<'alloc> {
+ pub properties: arena::Vec<'alloc, arena::Box<'alloc, ObjectProperty<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct StaticMemberExpression<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub property: IdentifierName,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct PrivateFieldExpression<'alloc> {
+ pub object: ExpressionOrSuper<'alloc>,
+ pub field: PrivateIdentifier,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum TemplateExpressionElement<'alloc> {
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+ TemplateElement(TemplateElement),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct TemplateExpression<'alloc> {
+ pub tag: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub elements: arena::Vec<'alloc, TemplateExpressionElement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum VariableDeclarationOrAssignmentTarget<'alloc> {
+ VariableDeclaration(VariableDeclaration<'alloc>),
+ AssignmentTarget(AssignmentTarget<'alloc>),
+}
+
+#[derive(Debug, PartialEq)]
+pub enum VariableDeclarationOrExpression<'alloc> {
+ VariableDeclaration(VariableDeclaration<'alloc>),
+ Expression(arena::Box<'alloc, Expression<'alloc>>),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Block<'alloc> {
+ pub statements: arena::Vec<'alloc, Statement<'alloc>>,
+ pub declarations: Option<arena::Vec<'alloc, SourceAtomSetIndex>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct CatchClause<'alloc> {
+ pub binding: Option<arena::Box<'alloc, Binding<'alloc>>>,
+ pub body: Block<'alloc>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Directive {
+ pub raw_value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct FormalParameters<'alloc> {
+ pub items: arena::Vec<'alloc, Parameter<'alloc>>,
+ pub rest: Option<Binding<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct FunctionBody<'alloc> {
+ pub directives: arena::Vec<'alloc, Directive>,
+ pub statements: arena::Vec<'alloc, Statement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct Script<'alloc> {
+ pub directives: arena::Vec<'alloc, Directive>,
+ pub statements: arena::Vec<'alloc, Statement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct SwitchCase<'alloc> {
+ pub test: arena::Box<'alloc, Expression<'alloc>>,
+ pub consequent: arena::Vec<'alloc, Statement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct SwitchDefault<'alloc> {
+ pub consequent: arena::Vec<'alloc, Statement<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct TemplateElement {
+ pub raw_value: SourceAtomSetIndex,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct VariableDeclaration<'alloc> {
+ pub kind: VariableDeclarationKind,
+ pub declarators: arena::Vec<'alloc, VariableDeclarator<'alloc>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub struct VariableDeclarator<'alloc> {
+ pub binding: Binding<'alloc>,
+ pub init: Option<arena::Box<'alloc, Expression<'alloc>>>,
+ pub loc: SourceLocation,
+}
+
+#[derive(Debug, PartialEq)]
+pub enum CoverParenthesized<'alloc> {
+ Expression {
+ expression: arena::Box<'alloc, Expression<'alloc>>,
+ loc: SourceLocation,
+ },
+ Parameters(arena::Box<'alloc, FormalParameters<'alloc>>),
+}
+
diff --git a/third_party/rust/jsparagus-ast/src/visit_generated.rs b/third_party/rust/jsparagus-ast/src/visit_generated.rs
new file mode 100644
index 0000000000..58a914c38e
--- /dev/null
+++ b/third_party/rust/jsparagus-ast/src/visit_generated.rs
@@ -0,0 +1,5423 @@
+// WARNING: This file is auto-generated.
+
+#![allow(unused_mut)]
+#![allow(unused_parens)]
+#![allow(unused_variables)]
+#![allow(dead_code)]
+
+use crate::arena;
+use crate::source_atom_set::SourceAtomSetIndex;
+use crate::source_slice_list::SourceSliceIndex;
+use crate::types::*;
+
+pub trait Pass<'alloc> {
+ fn visit_argument(&mut self, ast: &'alloc Argument<'alloc>) {
+ self.enter_argument(ast);
+ match ast {
+ Argument::SpreadElement(ast) => {
+ self.visit_enum_argument_variant_spread_element(ast)
+ }
+ Argument::Expression(ast) => {
+ self.visit_enum_argument_variant_expression(ast)
+ }
+ }
+ self.leave_argument(ast);
+ }
+
+ fn enter_argument(&mut self, ast: &'alloc Argument<'alloc>) {
+ }
+
+ fn leave_argument(&mut self, ast: &'alloc Argument<'alloc>) {
+ }
+
+ fn visit_enum_argument_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_argument_variant_spread_element(ast);
+ self.visit_expression(ast);
+ self.leave_enum_argument_variant_spread_element(ast);
+ }
+
+ fn enter_enum_argument_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_argument_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_argument_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_argument_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_argument_variant_expression(ast);
+ }
+
+ fn enter_enum_argument_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_argument_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
+ self.enter_arguments(ast);
+ for item in &ast.args {
+ self.visit_argument(item);
+ }
+ self.leave_arguments(ast);
+ }
+
+ fn enter_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
+ }
+
+ fn leave_arguments(&mut self, ast: &'alloc Arguments<'alloc>) {
+ }
+
+ fn visit_identifier(&mut self, ast: &'alloc Identifier) {
+ self.enter_identifier(ast);
+ self.leave_identifier(ast);
+ }
+
+ fn enter_identifier(&mut self, ast: &'alloc Identifier) {
+ }
+
+ fn leave_identifier(&mut self, ast: &'alloc Identifier) {
+ }
+
+ fn visit_identifier_name(&mut self, ast: &'alloc IdentifierName) {
+ self.enter_identifier_name(ast);
+ self.leave_identifier_name(ast);
+ }
+
+ fn enter_identifier_name(&mut self, ast: &'alloc IdentifierName) {
+ }
+
+ fn leave_identifier_name(&mut self, ast: &'alloc IdentifierName) {
+ }
+
+ fn visit_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
+ self.enter_private_identifier(ast);
+ self.leave_private_identifier(ast);
+ }
+
+ fn enter_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
+ }
+
+ fn leave_private_identifier(&mut self, ast: &'alloc PrivateIdentifier) {
+ }
+
+ fn visit_label(&mut self, ast: &'alloc Label) {
+ self.enter_label(ast);
+ self.leave_label(ast);
+ }
+
+ fn enter_label(&mut self, ast: &'alloc Label) {
+ }
+
+ fn leave_label(&mut self, ast: &'alloc Label) {
+ }
+
+ fn visit_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
+ self.enter_variable_declaration_kind(ast);
+ match ast {
+ VariableDeclarationKind::Var { .. } => {
+ self.visit_enum_variable_declaration_kind_variant_var()
+ }
+ VariableDeclarationKind::Let { .. } => {
+ self.visit_enum_variable_declaration_kind_variant_let()
+ }
+ VariableDeclarationKind::Const { .. } => {
+ self.visit_enum_variable_declaration_kind_variant_const()
+ }
+ }
+ self.leave_variable_declaration_kind(ast);
+ }
+
+ fn enter_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
+ }
+
+ fn leave_variable_declaration_kind(&mut self, ast: &'alloc VariableDeclarationKind) {
+ }
+
+ fn visit_enum_variable_declaration_kind_variant_var(&mut self) {
+ }
+
+ fn visit_enum_variable_declaration_kind_variant_let(&mut self) {
+ }
+
+ fn visit_enum_variable_declaration_kind_variant_const(&mut self) {
+ }
+
+ fn visit_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
+ self.enter_compound_assignment_operator(ast);
+ match ast {
+ CompoundAssignmentOperator::LogicalOr { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_logical_or()
+ }
+ CompoundAssignmentOperator::LogicalAnd { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_logical_and()
+ }
+ CompoundAssignmentOperator::Coalesce { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_coalesce()
+ }
+ CompoundAssignmentOperator::Add { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_add()
+ }
+ CompoundAssignmentOperator::Sub { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_sub()
+ }
+ CompoundAssignmentOperator::Mul { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_mul()
+ }
+ CompoundAssignmentOperator::Div { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_div()
+ }
+ CompoundAssignmentOperator::Mod { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_mod()
+ }
+ CompoundAssignmentOperator::Pow { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_pow()
+ }
+ CompoundAssignmentOperator::LeftShift { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_left_shift()
+ }
+ CompoundAssignmentOperator::RightShift { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_right_shift()
+ }
+ CompoundAssignmentOperator::RightShiftExt { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_right_shift_ext()
+ }
+ CompoundAssignmentOperator::Or { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_or()
+ }
+ CompoundAssignmentOperator::Xor { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_xor()
+ }
+ CompoundAssignmentOperator::And { .. } => {
+ self.visit_enum_compound_assignment_operator_variant_and()
+ }
+ }
+ self.leave_compound_assignment_operator(ast);
+ }
+
+ fn enter_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
+ }
+
+ fn leave_compound_assignment_operator(&mut self, ast: &'alloc CompoundAssignmentOperator) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_logical_or(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_logical_and(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_coalesce(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_add(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_sub(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_mul(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_div(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_mod(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_pow(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_left_shift(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_right_shift(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_right_shift_ext(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_or(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_xor(&mut self) {
+ }
+
+ fn visit_enum_compound_assignment_operator_variant_and(&mut self) {
+ }
+
+ fn visit_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
+ self.enter_binary_operator(ast);
+ match ast {
+ BinaryOperator::Equals { .. } => {
+ self.visit_enum_binary_operator_variant_equals()
+ }
+ BinaryOperator::NotEquals { .. } => {
+ self.visit_enum_binary_operator_variant_not_equals()
+ }
+ BinaryOperator::StrictEquals { .. } => {
+ self.visit_enum_binary_operator_variant_strict_equals()
+ }
+ BinaryOperator::StrictNotEquals { .. } => {
+ self.visit_enum_binary_operator_variant_strict_not_equals()
+ }
+ BinaryOperator::LessThan { .. } => {
+ self.visit_enum_binary_operator_variant_less_than()
+ }
+ BinaryOperator::LessThanOrEqual { .. } => {
+ self.visit_enum_binary_operator_variant_less_than_or_equal()
+ }
+ BinaryOperator::GreaterThan { .. } => {
+ self.visit_enum_binary_operator_variant_greater_than()
+ }
+ BinaryOperator::GreaterThanOrEqual { .. } => {
+ self.visit_enum_binary_operator_variant_greater_than_or_equal()
+ }
+ BinaryOperator::In { .. } => {
+ self.visit_enum_binary_operator_variant_in()
+ }
+ BinaryOperator::Instanceof { .. } => {
+ self.visit_enum_binary_operator_variant_instanceof()
+ }
+ BinaryOperator::LeftShift { .. } => {
+ self.visit_enum_binary_operator_variant_left_shift()
+ }
+ BinaryOperator::RightShift { .. } => {
+ self.visit_enum_binary_operator_variant_right_shift()
+ }
+ BinaryOperator::RightShiftExt { .. } => {
+ self.visit_enum_binary_operator_variant_right_shift_ext()
+ }
+ BinaryOperator::Add { .. } => {
+ self.visit_enum_binary_operator_variant_add()
+ }
+ BinaryOperator::Sub { .. } => {
+ self.visit_enum_binary_operator_variant_sub()
+ }
+ BinaryOperator::Mul { .. } => {
+ self.visit_enum_binary_operator_variant_mul()
+ }
+ BinaryOperator::Div { .. } => {
+ self.visit_enum_binary_operator_variant_div()
+ }
+ BinaryOperator::Mod { .. } => {
+ self.visit_enum_binary_operator_variant_mod()
+ }
+ BinaryOperator::Pow { .. } => {
+ self.visit_enum_binary_operator_variant_pow()
+ }
+ BinaryOperator::Comma { .. } => {
+ self.visit_enum_binary_operator_variant_comma()
+ }
+ BinaryOperator::Coalesce { .. } => {
+ self.visit_enum_binary_operator_variant_coalesce()
+ }
+ BinaryOperator::LogicalOr { .. } => {
+ self.visit_enum_binary_operator_variant_logical_or()
+ }
+ BinaryOperator::LogicalAnd { .. } => {
+ self.visit_enum_binary_operator_variant_logical_and()
+ }
+ BinaryOperator::BitwiseOr { .. } => {
+ self.visit_enum_binary_operator_variant_bitwise_or()
+ }
+ BinaryOperator::BitwiseXor { .. } => {
+ self.visit_enum_binary_operator_variant_bitwise_xor()
+ }
+ BinaryOperator::BitwiseAnd { .. } => {
+ self.visit_enum_binary_operator_variant_bitwise_and()
+ }
+ }
+ self.leave_binary_operator(ast);
+ }
+
+ fn enter_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
+ }
+
+ fn leave_binary_operator(&mut self, ast: &'alloc BinaryOperator) {
+ }
+
+ fn visit_enum_binary_operator_variant_equals(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_not_equals(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_strict_equals(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_strict_not_equals(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_less_than(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_less_than_or_equal(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_greater_than(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_greater_than_or_equal(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_in(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_instanceof(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_left_shift(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_right_shift(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_right_shift_ext(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_add(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_sub(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_mul(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_div(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_mod(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_pow(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_comma(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_coalesce(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_logical_or(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_logical_and(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_bitwise_or(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_bitwise_xor(&mut self) {
+ }
+
+ fn visit_enum_binary_operator_variant_bitwise_and(&mut self) {
+ }
+
+ fn visit_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
+ self.enter_unary_operator(ast);
+ match ast {
+ UnaryOperator::Plus { .. } => {
+ self.visit_enum_unary_operator_variant_plus()
+ }
+ UnaryOperator::Minus { .. } => {
+ self.visit_enum_unary_operator_variant_minus()
+ }
+ UnaryOperator::LogicalNot { .. } => {
+ self.visit_enum_unary_operator_variant_logical_not()
+ }
+ UnaryOperator::BitwiseNot { .. } => {
+ self.visit_enum_unary_operator_variant_bitwise_not()
+ }
+ UnaryOperator::Typeof { .. } => {
+ self.visit_enum_unary_operator_variant_typeof()
+ }
+ UnaryOperator::Void { .. } => {
+ self.visit_enum_unary_operator_variant_void()
+ }
+ UnaryOperator::Delete { .. } => {
+ self.visit_enum_unary_operator_variant_delete()
+ }
+ }
+ self.leave_unary_operator(ast);
+ }
+
+ fn enter_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
+ }
+
+ fn leave_unary_operator(&mut self, ast: &'alloc UnaryOperator) {
+ }
+
+ fn visit_enum_unary_operator_variant_plus(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_minus(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_logical_not(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_bitwise_not(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_typeof(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_void(&mut self) {
+ }
+
+ fn visit_enum_unary_operator_variant_delete(&mut self) {
+ }
+
+ fn visit_update_operator(&mut self, ast: &'alloc UpdateOperator) {
+ self.enter_update_operator(ast);
+ match ast {
+ UpdateOperator::Increment { .. } => {
+ self.visit_enum_update_operator_variant_increment()
+ }
+ UpdateOperator::Decrement { .. } => {
+ self.visit_enum_update_operator_variant_decrement()
+ }
+ }
+ self.leave_update_operator(ast);
+ }
+
+ fn enter_update_operator(&mut self, ast: &'alloc UpdateOperator) {
+ }
+
+ fn leave_update_operator(&mut self, ast: &'alloc UpdateOperator) {
+ }
+
+ fn visit_enum_update_operator_variant_increment(&mut self) {
+ }
+
+ fn visit_enum_update_operator_variant_decrement(&mut self) {
+ }
+
+ fn visit_function(&mut self, ast: &'alloc Function<'alloc>) {
+ self.enter_function(ast);
+ if let Some(item) = &ast.name {
+ self.visit_binding_identifier(item);
+ }
+ self.visit_formal_parameters(&ast.params);
+ self.visit_function_body(&ast.body);
+ self.leave_function(ast);
+ }
+
+ fn enter_function(&mut self, ast: &'alloc Function<'alloc>) {
+ }
+
+ fn leave_function(&mut self, ast: &'alloc Function<'alloc>) {
+ }
+
+ fn visit_program(&mut self, ast: &'alloc Program<'alloc>) {
+ self.enter_program(ast);
+ match ast {
+ Program::Module(ast) => {
+ self.visit_enum_program_variant_module(ast)
+ }
+ Program::Script(ast) => {
+ self.visit_enum_program_variant_script(ast)
+ }
+ }
+ self.leave_program(ast);
+ }
+
+ fn enter_program(&mut self, ast: &'alloc Program<'alloc>) {
+ }
+
+ fn leave_program(&mut self, ast: &'alloc Program<'alloc>) {
+ }
+
+ fn visit_enum_program_variant_module(
+ &mut self,
+ ast: &'alloc Module<'alloc>,
+ ) {
+ self.enter_enum_program_variant_module(ast);
+ self.visit_module(ast);
+ self.leave_enum_program_variant_module(ast);
+ }
+
+ fn enter_enum_program_variant_module(
+ &mut self,
+ ast: &'alloc Module<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_program_variant_module(
+ &mut self,
+ ast: &'alloc Module<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_program_variant_script(
+ &mut self,
+ ast: &'alloc Script<'alloc>,
+ ) {
+ self.enter_enum_program_variant_script(ast);
+ self.visit_script(ast);
+ self.leave_enum_program_variant_script(ast);
+ }
+
+ fn enter_enum_program_variant_script(
+ &mut self,
+ ast: &'alloc Script<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_program_variant_script(
+ &mut self,
+ ast: &'alloc Script<'alloc>,
+ ) {
+ }
+
+ fn visit_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
+ self.enter_if_statement(ast);
+ self.visit_expression(&ast.test);
+ self.visit_statement(&ast.consequent);
+ if let Some(item) = &ast.alternate {
+ self.visit_statement(item);
+ }
+ self.leave_if_statement(ast);
+ }
+
+ fn enter_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
+ }
+
+ fn leave_if_statement(&mut self, ast: &'alloc IfStatement<'alloc>) {
+ }
+
+ fn visit_statement(&mut self, ast: &'alloc Statement<'alloc>) {
+ self.enter_statement(ast);
+ match ast {
+ Statement::BlockStatement { block, .. } => {
+ self.visit_enum_statement_variant_block_statement(
+ block,
+ )
+ }
+ Statement::BreakStatement { label, .. } => {
+ self.visit_enum_statement_variant_break_statement(
+ label,
+ )
+ }
+ Statement::ContinueStatement { label, .. } => {
+ self.visit_enum_statement_variant_continue_statement(
+ label,
+ )
+ }
+ Statement::DebuggerStatement { .. } => {
+ self.visit_enum_statement_variant_debugger_statement()
+ }
+ Statement::DoWhileStatement { block, test, .. } => {
+ self.visit_enum_statement_variant_do_while_statement(
+ block,
+ test,
+ )
+ }
+ Statement::EmptyStatement { .. } => {
+ self.visit_enum_statement_variant_empty_statement()
+ }
+ Statement::ExpressionStatement(ast) => {
+ self.visit_enum_statement_variant_expression_statement(ast)
+ }
+ Statement::ForInStatement { left, right, block, .. } => {
+ self.visit_enum_statement_variant_for_in_statement(
+ left,
+ right,
+ block,
+ )
+ }
+ Statement::ForOfStatement { left, right, block, .. } => {
+ self.visit_enum_statement_variant_for_of_statement(
+ left,
+ right,
+ block,
+ )
+ }
+ Statement::ForStatement { init, test, update, block, .. } => {
+ self.visit_enum_statement_variant_for_statement(
+ init,
+ test,
+ update,
+ block,
+ )
+ }
+ Statement::IfStatement(ast) => {
+ self.visit_enum_statement_variant_if_statement(ast)
+ }
+ Statement::LabelledStatement { label, body, .. } => {
+ self.visit_enum_statement_variant_labelled_statement(
+ label,
+ body,
+ )
+ }
+ Statement::ReturnStatement { expression, .. } => {
+ self.visit_enum_statement_variant_return_statement(
+ expression,
+ )
+ }
+ Statement::SwitchStatement { discriminant, cases, .. } => {
+ self.visit_enum_statement_variant_switch_statement(
+ discriminant,
+ cases,
+ )
+ }
+ Statement::SwitchStatementWithDefault { discriminant, pre_default_cases, default_case, post_default_cases, .. } => {
+ self.visit_enum_statement_variant_switch_statement_with_default(
+ discriminant,
+ pre_default_cases,
+ default_case,
+ post_default_cases,
+ )
+ }
+ Statement::ThrowStatement { expression, .. } => {
+ self.visit_enum_statement_variant_throw_statement(
+ expression,
+ )
+ }
+ Statement::TryCatchStatement { body, catch_clause, .. } => {
+ self.visit_enum_statement_variant_try_catch_statement(
+ body,
+ catch_clause,
+ )
+ }
+ Statement::TryFinallyStatement { body, catch_clause, finalizer, .. } => {
+ self.visit_enum_statement_variant_try_finally_statement(
+ body,
+ catch_clause,
+ finalizer,
+ )
+ }
+ Statement::WhileStatement { test, block, .. } => {
+ self.visit_enum_statement_variant_while_statement(
+ test,
+ block,
+ )
+ }
+ Statement::WithStatement { object, body, .. } => {
+ self.visit_enum_statement_variant_with_statement(
+ object,
+ body,
+ )
+ }
+ Statement::VariableDeclarationStatement(ast) => {
+ self.visit_enum_statement_variant_variable_declaration_statement(ast)
+ }
+ Statement::FunctionDeclaration(ast) => {
+ self.visit_enum_statement_variant_function_declaration(ast)
+ }
+ Statement::ClassDeclaration(ast) => {
+ self.visit_enum_statement_variant_class_declaration(ast)
+ }
+ }
+ self.leave_statement(ast);
+ }
+
+ fn enter_statement(&mut self, ast: &'alloc Statement<'alloc>) {
+ }
+
+ fn leave_statement(&mut self, ast: &'alloc Statement<'alloc>) {
+ }
+
+ fn visit_enum_statement_variant_block_statement(
+ &mut self,
+ block: &'alloc Block<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_block_statement(
+ block,
+ );
+ self.visit_block(block);
+ self.leave_enum_statement_variant_block_statement(
+ block,
+ );
+ }
+
+ fn enter_enum_statement_variant_block_statement(
+ &mut self,
+ block: &'alloc Block<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_block_statement(
+ &mut self,
+ block: &'alloc Block<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_break_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ self.enter_enum_statement_variant_break_statement(
+ label,
+ );
+ if let Some(item) = label {
+ self.visit_label(item);
+ }
+ self.leave_enum_statement_variant_break_statement(
+ label,
+ );
+ }
+
+ fn enter_enum_statement_variant_break_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_break_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_continue_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ self.enter_enum_statement_variant_continue_statement(
+ label,
+ );
+ if let Some(item) = label {
+ self.visit_label(item);
+ }
+ self.leave_enum_statement_variant_continue_statement(
+ label,
+ );
+ }
+
+ fn enter_enum_statement_variant_continue_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_continue_statement(
+ &mut self,
+ label: &'alloc Option<Label>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_debugger_statement(&mut self) {
+ }
+
+ fn visit_enum_statement_variant_do_while_statement(
+ &mut self,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_do_while_statement(
+ block,
+ test,
+ );
+ self.visit_statement(block);
+ self.visit_expression(test);
+ self.leave_enum_statement_variant_do_while_statement(
+ block,
+ test,
+ );
+ }
+
+ fn enter_enum_statement_variant_do_while_statement(
+ &mut self,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_do_while_statement(
+ &mut self,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_empty_statement(&mut self) {
+ }
+
+ fn visit_enum_statement_variant_expression_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_expression_statement(ast);
+ self.visit_expression(ast);
+ self.leave_enum_statement_variant_expression_statement(ast);
+ }
+
+ fn enter_enum_statement_variant_expression_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_expression_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_for_in_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_for_in_statement(
+ left,
+ right,
+ block,
+ );
+ self.visit_variable_declaration_or_assignment_target(left);
+ self.visit_expression(right);
+ self.visit_statement(block);
+ self.leave_enum_statement_variant_for_in_statement(
+ left,
+ right,
+ block,
+ );
+ }
+
+ fn enter_enum_statement_variant_for_in_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_for_in_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_for_of_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_for_of_statement(
+ left,
+ right,
+ block,
+ );
+ self.visit_variable_declaration_or_assignment_target(left);
+ self.visit_expression(right);
+ self.visit_statement(block);
+ self.leave_enum_statement_variant_for_of_statement(
+ left,
+ right,
+ block,
+ );
+ }
+
+ fn enter_enum_statement_variant_for_of_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_for_of_statement(
+ &mut self,
+ left: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_for_statement(
+ &mut self,
+ init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
+ test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_for_statement(
+ init,
+ test,
+ update,
+ block,
+ );
+ if let Some(item) = init {
+ self.visit_variable_declaration_or_expression(item);
+ }
+ if let Some(item) = test {
+ self.visit_expression(item);
+ }
+ if let Some(item) = update {
+ self.visit_expression(item);
+ }
+ self.visit_statement(block);
+ self.leave_enum_statement_variant_for_statement(
+ init,
+ test,
+ update,
+ block,
+ );
+ }
+
+ fn enter_enum_statement_variant_for_statement(
+ &mut self,
+ init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
+ test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_for_statement(
+ &mut self,
+ init: &'alloc Option<VariableDeclarationOrExpression<'alloc>>,
+ test: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ update: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_if_statement(
+ &mut self,
+ ast: &'alloc IfStatement<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_if_statement(ast);
+ self.visit_if_statement(ast);
+ self.leave_enum_statement_variant_if_statement(ast);
+ }
+
+ fn enter_enum_statement_variant_if_statement(
+ &mut self,
+ ast: &'alloc IfStatement<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_if_statement(
+ &mut self,
+ ast: &'alloc IfStatement<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_labelled_statement(
+ &mut self,
+ label: &'alloc Label,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_labelled_statement(
+ label,
+ body,
+ );
+ self.visit_label(label);
+ self.visit_statement(body);
+ self.leave_enum_statement_variant_labelled_statement(
+ label,
+ body,
+ );
+ }
+
+ fn enter_enum_statement_variant_labelled_statement(
+ &mut self,
+ label: &'alloc Label,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_labelled_statement(
+ &mut self,
+ label: &'alloc Label,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_return_statement(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ self.enter_enum_statement_variant_return_statement(
+ expression,
+ );
+ if let Some(item) = expression {
+ self.visit_expression(item);
+ }
+ self.leave_enum_statement_variant_return_statement(
+ expression,
+ );
+ }
+
+ fn enter_enum_statement_variant_return_statement(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_return_statement(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_switch_statement(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_switch_statement(
+ discriminant,
+ cases,
+ );
+ self.visit_expression(discriminant);
+ for item in cases.iter() {
+ self.visit_switch_case(item);
+ }
+ self.leave_enum_statement_variant_switch_statement(
+ discriminant,
+ cases,
+ );
+ }
+
+ fn enter_enum_statement_variant_switch_statement(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_switch_statement(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_switch_statement_with_default(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ default_case: &'alloc SwitchDefault<'alloc>,
+ post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_switch_statement_with_default(
+ discriminant,
+ pre_default_cases,
+ default_case,
+ post_default_cases,
+ );
+ self.visit_expression(discriminant);
+ for item in pre_default_cases.iter() {
+ self.visit_switch_case(item);
+ }
+ self.visit_switch_default(default_case);
+ for item in post_default_cases.iter() {
+ self.visit_switch_case(item);
+ }
+ self.leave_enum_statement_variant_switch_statement_with_default(
+ discriminant,
+ pre_default_cases,
+ default_case,
+ post_default_cases,
+ );
+ }
+
+ fn enter_enum_statement_variant_switch_statement_with_default(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ default_case: &'alloc SwitchDefault<'alloc>,
+ post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_switch_statement_with_default(
+ &mut self,
+ discriminant: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ pre_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ default_case: &'alloc SwitchDefault<'alloc>,
+ post_default_cases: &'alloc arena::Vec<'alloc, SwitchCase<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_throw_statement(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_throw_statement(
+ expression,
+ );
+ self.visit_expression(expression);
+ self.leave_enum_statement_variant_throw_statement(
+ expression,
+ );
+ }
+
+ fn enter_enum_statement_variant_throw_statement(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_throw_statement(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_try_catch_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc CatchClause<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_try_catch_statement(
+ body,
+ catch_clause,
+ );
+ self.visit_block(body);
+ self.visit_catch_clause(catch_clause);
+ self.leave_enum_statement_variant_try_catch_statement(
+ body,
+ catch_clause,
+ );
+ }
+
+ fn enter_enum_statement_variant_try_catch_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc CatchClause<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_try_catch_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc CatchClause<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_try_finally_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc Option<CatchClause<'alloc>>,
+ finalizer: &'alloc Block<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_try_finally_statement(
+ body,
+ catch_clause,
+ finalizer,
+ );
+ self.visit_block(body);
+ if let Some(item) = catch_clause {
+ self.visit_catch_clause(item);
+ }
+ self.visit_block(finalizer);
+ self.leave_enum_statement_variant_try_finally_statement(
+ body,
+ catch_clause,
+ finalizer,
+ );
+ }
+
+ fn enter_enum_statement_variant_try_finally_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc Option<CatchClause<'alloc>>,
+ finalizer: &'alloc Block<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_try_finally_statement(
+ &mut self,
+ body: &'alloc Block<'alloc>,
+ catch_clause: &'alloc Option<CatchClause<'alloc>>,
+ finalizer: &'alloc Block<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_while_statement(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_while_statement(
+ test,
+ block,
+ );
+ self.visit_expression(test);
+ self.visit_statement(block);
+ self.leave_enum_statement_variant_while_statement(
+ test,
+ block,
+ );
+ }
+
+ fn enter_enum_statement_variant_while_statement(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_while_statement(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ block: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_with_statement(
+ &mut self,
+ object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_statement_variant_with_statement(
+ object,
+ body,
+ );
+ self.visit_expression(object);
+ self.visit_statement(body);
+ self.leave_enum_statement_variant_with_statement(
+ object,
+ body,
+ );
+ }
+
+ fn enter_enum_statement_variant_with_statement(
+ &mut self,
+ object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_with_statement(
+ &mut self,
+ object: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ body: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_variable_declaration_statement(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_variable_declaration_statement(ast);
+ self.visit_variable_declaration(ast);
+ self.leave_enum_statement_variant_variable_declaration_statement(ast);
+ }
+
+ fn enter_enum_statement_variant_variable_declaration_statement(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_variable_declaration_statement(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_function_declaration(ast);
+ self.visit_function(ast);
+ self.leave_enum_statement_variant_function_declaration(ast);
+ }
+
+ fn enter_enum_statement_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_statement_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ self.enter_enum_statement_variant_class_declaration(ast);
+ self.visit_class_declaration(ast);
+ self.leave_enum_statement_variant_class_declaration(ast);
+ }
+
+ fn enter_enum_statement_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_statement_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_expression(&mut self, ast: &'alloc Expression<'alloc>) {
+ self.enter_expression(ast);
+ match ast {
+ Expression::MemberExpression(ast) => {
+ self.visit_enum_expression_variant_member_expression(ast)
+ }
+ Expression::ClassExpression(ast) => {
+ self.visit_enum_expression_variant_class_expression(ast)
+ }
+ Expression::LiteralBooleanExpression { value, .. } => {
+ self.visit_enum_expression_variant_literal_boolean_expression(
+ value,
+ )
+ }
+ Expression::LiteralInfinityExpression { .. } => {
+ self.visit_enum_expression_variant_literal_infinity_expression()
+ }
+ Expression::LiteralNullExpression { .. } => {
+ self.visit_enum_expression_variant_literal_null_expression()
+ }
+ Expression::LiteralNumericExpression(ast) => {
+ self.visit_enum_expression_variant_literal_numeric_expression(ast)
+ }
+ Expression::LiteralRegExpExpression { pattern, global, ignore_case, multi_line, dot_all, sticky, unicode, .. } => {
+ self.visit_enum_expression_variant_literal_reg_exp_expression(
+ pattern,
+ global,
+ ignore_case,
+ multi_line,
+ dot_all,
+ sticky,
+ unicode,
+ )
+ }
+ Expression::LiteralStringExpression { value, .. } => {
+ self.visit_enum_expression_variant_literal_string_expression(
+ value,
+ )
+ }
+ Expression::ArrayExpression(ast) => {
+ self.visit_enum_expression_variant_array_expression(ast)
+ }
+ Expression::ArrowExpression { is_async, params, body, .. } => {
+ self.visit_enum_expression_variant_arrow_expression(
+ is_async,
+ params,
+ body,
+ )
+ }
+ Expression::AssignmentExpression { binding, expression, .. } => {
+ self.visit_enum_expression_variant_assignment_expression(
+ binding,
+ expression,
+ )
+ }
+ Expression::BinaryExpression { operator, left, right, .. } => {
+ self.visit_enum_expression_variant_binary_expression(
+ operator,
+ left,
+ right,
+ )
+ }
+ Expression::CallExpression(ast) => {
+ self.visit_enum_expression_variant_call_expression(ast)
+ }
+ Expression::CompoundAssignmentExpression { operator, binding, expression, .. } => {
+ self.visit_enum_expression_variant_compound_assignment_expression(
+ operator,
+ binding,
+ expression,
+ )
+ }
+ Expression::ConditionalExpression { test, consequent, alternate, .. } => {
+ self.visit_enum_expression_variant_conditional_expression(
+ test,
+ consequent,
+ alternate,
+ )
+ }
+ Expression::FunctionExpression(ast) => {
+ self.visit_enum_expression_variant_function_expression(ast)
+ }
+ Expression::IdentifierExpression(ast) => {
+ self.visit_enum_expression_variant_identifier_expression(ast)
+ }
+ Expression::NewExpression { callee, arguments, .. } => {
+ self.visit_enum_expression_variant_new_expression(
+ callee,
+ arguments,
+ )
+ }
+ Expression::NewTargetExpression { .. } => {
+ self.visit_enum_expression_variant_new_target_expression()
+ }
+ Expression::ObjectExpression(ast) => {
+ self.visit_enum_expression_variant_object_expression(ast)
+ }
+ Expression::OptionalExpression { object, tail, .. } => {
+ self.visit_enum_expression_variant_optional_expression(
+ object,
+ tail,
+ )
+ }
+ Expression::OptionalChain(ast) => {
+ self.visit_enum_expression_variant_optional_chain(ast)
+ }
+ Expression::UnaryExpression { operator, operand, .. } => {
+ self.visit_enum_expression_variant_unary_expression(
+ operator,
+ operand,
+ )
+ }
+ Expression::TemplateExpression(ast) => {
+ self.visit_enum_expression_variant_template_expression(ast)
+ }
+ Expression::ThisExpression { .. } => {
+ self.visit_enum_expression_variant_this_expression()
+ }
+ Expression::UpdateExpression { is_prefix, operator, operand, .. } => {
+ self.visit_enum_expression_variant_update_expression(
+ is_prefix,
+ operator,
+ operand,
+ )
+ }
+ Expression::YieldExpression { expression, .. } => {
+ self.visit_enum_expression_variant_yield_expression(
+ expression,
+ )
+ }
+ Expression::YieldGeneratorExpression { expression, .. } => {
+ self.visit_enum_expression_variant_yield_generator_expression(
+ expression,
+ )
+ }
+ Expression::AwaitExpression { expression, .. } => {
+ self.visit_enum_expression_variant_await_expression(
+ expression,
+ )
+ }
+ Expression::ImportCallExpression { argument, .. } => {
+ self.visit_enum_expression_variant_import_call_expression(
+ argument,
+ )
+ }
+ }
+ self.leave_expression(ast);
+ }
+
+ fn enter_expression(&mut self, ast: &'alloc Expression<'alloc>) {
+ }
+
+ fn leave_expression(&mut self, ast: &'alloc Expression<'alloc>) {
+ }
+
+ fn visit_enum_expression_variant_member_expression(
+ &mut self,
+ ast: &'alloc MemberExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_member_expression(ast);
+ self.visit_member_expression(ast);
+ self.leave_enum_expression_variant_member_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_member_expression(
+ &mut self,
+ ast: &'alloc MemberExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_member_expression(
+ &mut self,
+ ast: &'alloc MemberExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_class_expression(
+ &mut self,
+ ast: &'alloc ClassExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_class_expression(ast);
+ self.visit_class_expression(ast);
+ self.leave_enum_expression_variant_class_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_class_expression(
+ &mut self,
+ ast: &'alloc ClassExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_class_expression(
+ &mut self,
+ ast: &'alloc ClassExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_literal_boolean_expression(
+ &mut self,
+ value: &'alloc bool,
+ ) {
+ self.enter_enum_expression_variant_literal_boolean_expression(
+ value,
+ );
+ self.leave_enum_expression_variant_literal_boolean_expression(
+ value,
+ );
+ }
+
+ fn enter_enum_expression_variant_literal_boolean_expression(
+ &mut self,
+ value: &'alloc bool,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_literal_boolean_expression(
+ &mut self,
+ value: &'alloc bool,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_literal_infinity_expression(&mut self) {
+ }
+
+ fn visit_enum_expression_variant_literal_null_expression(&mut self) {
+ }
+
+ fn visit_enum_expression_variant_literal_numeric_expression(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ self.enter_enum_expression_variant_literal_numeric_expression(ast);
+ self.visit_numeric_literal(ast);
+ self.leave_enum_expression_variant_literal_numeric_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_literal_numeric_expression(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_literal_numeric_expression(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_literal_reg_exp_expression(
+ &mut self,
+ pattern: &'alloc SourceSliceIndex,
+ global: &'alloc bool,
+ ignore_case: &'alloc bool,
+ multi_line: &'alloc bool,
+ dot_all: &'alloc bool,
+ sticky: &'alloc bool,
+ unicode: &'alloc bool,
+ ) {
+ self.enter_enum_expression_variant_literal_reg_exp_expression(
+ pattern,
+ global,
+ ignore_case,
+ multi_line,
+ dot_all,
+ sticky,
+ unicode,
+ );
+ self.leave_enum_expression_variant_literal_reg_exp_expression(
+ pattern,
+ global,
+ ignore_case,
+ multi_line,
+ dot_all,
+ sticky,
+ unicode,
+ );
+ }
+
+ fn enter_enum_expression_variant_literal_reg_exp_expression(
+ &mut self,
+ pattern: &'alloc SourceSliceIndex,
+ global: &'alloc bool,
+ ignore_case: &'alloc bool,
+ multi_line: &'alloc bool,
+ dot_all: &'alloc bool,
+ sticky: &'alloc bool,
+ unicode: &'alloc bool,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_literal_reg_exp_expression(
+ &mut self,
+ pattern: &'alloc SourceSliceIndex,
+ global: &'alloc bool,
+ ignore_case: &'alloc bool,
+ multi_line: &'alloc bool,
+ dot_all: &'alloc bool,
+ sticky: &'alloc bool,
+ unicode: &'alloc bool,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_literal_string_expression(
+ &mut self,
+ value: &'alloc SourceAtomSetIndex,
+ ) {
+ self.enter_enum_expression_variant_literal_string_expression(
+ value,
+ );
+ self.leave_enum_expression_variant_literal_string_expression(
+ value,
+ );
+ }
+
+ fn enter_enum_expression_variant_literal_string_expression(
+ &mut self,
+ value: &'alloc SourceAtomSetIndex,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_literal_string_expression(
+ &mut self,
+ value: &'alloc SourceAtomSetIndex,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_array_expression(
+ &mut self,
+ ast: &'alloc ArrayExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_array_expression(ast);
+ self.visit_array_expression(ast);
+ self.leave_enum_expression_variant_array_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_array_expression(
+ &mut self,
+ ast: &'alloc ArrayExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_array_expression(
+ &mut self,
+ ast: &'alloc ArrayExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_arrow_expression(
+ &mut self,
+ is_async: &'alloc bool,
+ params: &'alloc FormalParameters<'alloc>,
+ body: &'alloc ArrowExpressionBody<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_arrow_expression(
+ is_async,
+ params,
+ body,
+ );
+ self.visit_formal_parameters(params);
+ self.visit_arrow_expression_body(body);
+ self.leave_enum_expression_variant_arrow_expression(
+ is_async,
+ params,
+ body,
+ );
+ }
+
+ fn enter_enum_expression_variant_arrow_expression(
+ &mut self,
+ is_async: &'alloc bool,
+ params: &'alloc FormalParameters<'alloc>,
+ body: &'alloc ArrowExpressionBody<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_arrow_expression(
+ &mut self,
+ is_async: &'alloc bool,
+ params: &'alloc FormalParameters<'alloc>,
+ body: &'alloc ArrowExpressionBody<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_assignment_expression(
+ &mut self,
+ binding: &'alloc AssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_assignment_expression(
+ binding,
+ expression,
+ );
+ self.visit_assignment_target(binding);
+ self.visit_expression(expression);
+ self.leave_enum_expression_variant_assignment_expression(
+ binding,
+ expression,
+ );
+ }
+
+ fn enter_enum_expression_variant_assignment_expression(
+ &mut self,
+ binding: &'alloc AssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_assignment_expression(
+ &mut self,
+ binding: &'alloc AssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_binary_expression(
+ &mut self,
+ operator: &'alloc BinaryOperator,
+ left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_binary_expression(
+ operator,
+ left,
+ right,
+ );
+ self.visit_binary_operator(operator);
+ self.visit_expression(left);
+ self.visit_expression(right);
+ self.leave_enum_expression_variant_binary_expression(
+ operator,
+ left,
+ right,
+ );
+ }
+
+ fn enter_enum_expression_variant_binary_expression(
+ &mut self,
+ operator: &'alloc BinaryOperator,
+ left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_binary_expression(
+ &mut self,
+ operator: &'alloc BinaryOperator,
+ left: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ right: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_call_expression(ast);
+ self.visit_call_expression(ast);
+ self.leave_enum_expression_variant_call_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_compound_assignment_expression(
+ &mut self,
+ operator: &'alloc CompoundAssignmentOperator,
+ binding: &'alloc SimpleAssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_compound_assignment_expression(
+ operator,
+ binding,
+ expression,
+ );
+ self.visit_compound_assignment_operator(operator);
+ self.visit_simple_assignment_target(binding);
+ self.visit_expression(expression);
+ self.leave_enum_expression_variant_compound_assignment_expression(
+ operator,
+ binding,
+ expression,
+ );
+ }
+
+ fn enter_enum_expression_variant_compound_assignment_expression(
+ &mut self,
+ operator: &'alloc CompoundAssignmentOperator,
+ binding: &'alloc SimpleAssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_compound_assignment_expression(
+ &mut self,
+ operator: &'alloc CompoundAssignmentOperator,
+ binding: &'alloc SimpleAssignmentTarget<'alloc>,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_conditional_expression(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_conditional_expression(
+ test,
+ consequent,
+ alternate,
+ );
+ self.visit_expression(test);
+ self.visit_expression(consequent);
+ self.visit_expression(alternate);
+ self.leave_enum_expression_variant_conditional_expression(
+ test,
+ consequent,
+ alternate,
+ );
+ }
+
+ fn enter_enum_expression_variant_conditional_expression(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_conditional_expression(
+ &mut self,
+ test: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ consequent: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ alternate: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_function_expression(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_function_expression(ast);
+ self.visit_function(ast);
+ self.leave_enum_expression_variant_function_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_function_expression(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_function_expression(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_identifier_expression(
+ &mut self,
+ ast: &'alloc IdentifierExpression,
+ ) {
+ self.enter_enum_expression_variant_identifier_expression(ast);
+ self.visit_identifier_expression(ast);
+ self.leave_enum_expression_variant_identifier_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_identifier_expression(
+ &mut self,
+ ast: &'alloc IdentifierExpression,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_identifier_expression(
+ &mut self,
+ ast: &'alloc IdentifierExpression,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_new_expression(
+ &mut self,
+ callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_new_expression(
+ callee,
+ arguments,
+ );
+ self.visit_expression(callee);
+ self.visit_arguments(arguments);
+ self.leave_enum_expression_variant_new_expression(
+ callee,
+ arguments,
+ );
+ }
+
+ fn enter_enum_expression_variant_new_expression(
+ &mut self,
+ callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_new_expression(
+ &mut self,
+ callee: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_new_target_expression(&mut self) {
+ }
+
+ fn visit_enum_expression_variant_object_expression(
+ &mut self,
+ ast: &'alloc ObjectExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_object_expression(ast);
+ self.visit_object_expression(ast);
+ self.leave_enum_expression_variant_object_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_object_expression(
+ &mut self,
+ ast: &'alloc ObjectExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_object_expression(
+ &mut self,
+ ast: &'alloc ObjectExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_optional_expression(
+ &mut self,
+ object: &'alloc ExpressionOrSuper<'alloc>,
+ tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_optional_expression(
+ object,
+ tail,
+ );
+ self.visit_expression_or_super(object);
+ self.visit_expression(tail);
+ self.leave_enum_expression_variant_optional_expression(
+ object,
+ tail,
+ );
+ }
+
+ fn enter_enum_expression_variant_optional_expression(
+ &mut self,
+ object: &'alloc ExpressionOrSuper<'alloc>,
+ tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_optional_expression(
+ &mut self,
+ object: &'alloc ExpressionOrSuper<'alloc>,
+ tail: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_optional_chain(
+ &mut self,
+ ast: &'alloc OptionalChain<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_optional_chain(ast);
+ self.visit_optional_chain(ast);
+ self.leave_enum_expression_variant_optional_chain(ast);
+ }
+
+ fn enter_enum_expression_variant_optional_chain(
+ &mut self,
+ ast: &'alloc OptionalChain<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_optional_chain(
+ &mut self,
+ ast: &'alloc OptionalChain<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_unary_expression(
+ &mut self,
+ operator: &'alloc UnaryOperator,
+ operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_unary_expression(
+ operator,
+ operand,
+ );
+ self.visit_unary_operator(operator);
+ self.visit_expression(operand);
+ self.leave_enum_expression_variant_unary_expression(
+ operator,
+ operand,
+ );
+ }
+
+ fn enter_enum_expression_variant_unary_expression(
+ &mut self,
+ operator: &'alloc UnaryOperator,
+ operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_unary_expression(
+ &mut self,
+ operator: &'alloc UnaryOperator,
+ operand: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_template_expression(
+ &mut self,
+ ast: &'alloc TemplateExpression<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_template_expression(ast);
+ self.visit_template_expression(ast);
+ self.leave_enum_expression_variant_template_expression(ast);
+ }
+
+ fn enter_enum_expression_variant_template_expression(
+ &mut self,
+ ast: &'alloc TemplateExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_template_expression(
+ &mut self,
+ ast: &'alloc TemplateExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_this_expression(&mut self) {
+ }
+
+ fn visit_enum_expression_variant_update_expression(
+ &mut self,
+ is_prefix: &'alloc bool,
+ operator: &'alloc UpdateOperator,
+ operand: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_expression_variant_update_expression(
+ is_prefix,
+ operator,
+ operand,
+ );
+ self.visit_update_operator(operator);
+ self.visit_simple_assignment_target(operand);
+ self.leave_enum_expression_variant_update_expression(
+ is_prefix,
+ operator,
+ operand,
+ );
+ }
+
+ fn enter_enum_expression_variant_update_expression(
+ &mut self,
+ is_prefix: &'alloc bool,
+ operator: &'alloc UpdateOperator,
+ operand: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_update_expression(
+ &mut self,
+ is_prefix: &'alloc bool,
+ operator: &'alloc UpdateOperator,
+ operand: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_yield_expression(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ self.enter_enum_expression_variant_yield_expression(
+ expression,
+ );
+ if let Some(item) = expression {
+ self.visit_expression(item);
+ }
+ self.leave_enum_expression_variant_yield_expression(
+ expression,
+ );
+ }
+
+ fn enter_enum_expression_variant_yield_expression(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_yield_expression(
+ &mut self,
+ expression: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_yield_generator_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_yield_generator_expression(
+ expression,
+ );
+ self.visit_expression(expression);
+ self.leave_enum_expression_variant_yield_generator_expression(
+ expression,
+ );
+ }
+
+ fn enter_enum_expression_variant_yield_generator_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_yield_generator_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_await_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_await_expression(
+ expression,
+ );
+ self.visit_expression(expression);
+ self.leave_enum_expression_variant_await_expression(
+ expression,
+ );
+ }
+
+ fn enter_enum_expression_variant_await_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_await_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_variant_import_call_expression(
+ &mut self,
+ argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_variant_import_call_expression(
+ argument,
+ );
+ self.visit_expression(argument);
+ self.leave_enum_expression_variant_import_call_expression(
+ argument,
+ );
+ }
+
+ fn enter_enum_expression_variant_import_call_expression(
+ &mut self,
+ argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_variant_import_call_expression(
+ &mut self,
+ argument: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
+ self.enter_member_expression(ast);
+ match ast {
+ MemberExpression::ComputedMemberExpression(ast) => {
+ self.visit_enum_member_expression_variant_computed_member_expression(ast)
+ }
+ MemberExpression::StaticMemberExpression(ast) => {
+ self.visit_enum_member_expression_variant_static_member_expression(ast)
+ }
+ MemberExpression::PrivateFieldExpression(ast) => {
+ self.visit_enum_member_expression_variant_private_field_expression(ast)
+ }
+ }
+ self.leave_member_expression(ast);
+ }
+
+ fn enter_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
+ }
+
+ fn leave_member_expression(&mut self, ast: &'alloc MemberExpression<'alloc>) {
+ }
+
+ fn visit_enum_member_expression_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ self.enter_enum_member_expression_variant_computed_member_expression(ast);
+ self.visit_computed_member_expression(ast);
+ self.leave_enum_member_expression_variant_computed_member_expression(ast);
+ }
+
+ fn enter_enum_member_expression_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_expression_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_member_expression_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ self.enter_enum_member_expression_variant_static_member_expression(ast);
+ self.visit_static_member_expression(ast);
+ self.leave_enum_member_expression_variant_static_member_expression(ast);
+ }
+
+ fn enter_enum_member_expression_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_expression_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_member_expression_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ self.enter_enum_member_expression_variant_private_field_expression(ast);
+ self.visit_private_field_expression(ast);
+ self.leave_enum_member_expression_variant_private_field_expression(ast);
+ }
+
+ fn enter_enum_member_expression_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_expression_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
+ self.enter_optional_chain(ast);
+ match ast {
+ OptionalChain::ComputedMemberExpressionTail { expression, .. } => {
+ self.visit_enum_optional_chain_variant_computed_member_expression_tail(
+ expression,
+ )
+ }
+ OptionalChain::StaticMemberExpressionTail { property, .. } => {
+ self.visit_enum_optional_chain_variant_static_member_expression_tail(
+ property,
+ )
+ }
+ OptionalChain::PrivateFieldExpressionTail { field, .. } => {
+ self.visit_enum_optional_chain_variant_private_field_expression_tail(
+ field,
+ )
+ }
+ OptionalChain::CallExpressionTail { arguments, .. } => {
+ self.visit_enum_optional_chain_variant_call_expression_tail(
+ arguments,
+ )
+ }
+ OptionalChain::ComputedMemberExpression(ast) => {
+ self.visit_enum_optional_chain_variant_computed_member_expression(ast)
+ }
+ OptionalChain::StaticMemberExpression(ast) => {
+ self.visit_enum_optional_chain_variant_static_member_expression(ast)
+ }
+ OptionalChain::PrivateFieldExpression(ast) => {
+ self.visit_enum_optional_chain_variant_private_field_expression(ast)
+ }
+ OptionalChain::CallExpression(ast) => {
+ self.visit_enum_optional_chain_variant_call_expression(ast)
+ }
+ }
+ self.leave_optional_chain(ast);
+ }
+
+ fn enter_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
+ }
+
+ fn leave_optional_chain(&mut self, ast: &'alloc OptionalChain<'alloc>) {
+ }
+
+ fn visit_enum_optional_chain_variant_computed_member_expression_tail(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_optional_chain_variant_computed_member_expression_tail(
+ expression,
+ );
+ self.visit_expression(expression);
+ self.leave_enum_optional_chain_variant_computed_member_expression_tail(
+ expression,
+ );
+ }
+
+ fn enter_enum_optional_chain_variant_computed_member_expression_tail(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_computed_member_expression_tail(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_static_member_expression_tail(
+ &mut self,
+ property: &'alloc IdentifierName,
+ ) {
+ self.enter_enum_optional_chain_variant_static_member_expression_tail(
+ property,
+ );
+ self.visit_identifier_name(property);
+ self.leave_enum_optional_chain_variant_static_member_expression_tail(
+ property,
+ );
+ }
+
+ fn enter_enum_optional_chain_variant_static_member_expression_tail(
+ &mut self,
+ property: &'alloc IdentifierName,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_static_member_expression_tail(
+ &mut self,
+ property: &'alloc IdentifierName,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_private_field_expression_tail(
+ &mut self,
+ field: &'alloc PrivateIdentifier,
+ ) {
+ self.enter_enum_optional_chain_variant_private_field_expression_tail(
+ field,
+ );
+ self.visit_private_identifier(field);
+ self.leave_enum_optional_chain_variant_private_field_expression_tail(
+ field,
+ );
+ }
+
+ fn enter_enum_optional_chain_variant_private_field_expression_tail(
+ &mut self,
+ field: &'alloc PrivateIdentifier,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_private_field_expression_tail(
+ &mut self,
+ field: &'alloc PrivateIdentifier,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_call_expression_tail(
+ &mut self,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ self.enter_enum_optional_chain_variant_call_expression_tail(
+ arguments,
+ );
+ self.visit_arguments(arguments);
+ self.leave_enum_optional_chain_variant_call_expression_tail(
+ arguments,
+ );
+ }
+
+ fn enter_enum_optional_chain_variant_call_expression_tail(
+ &mut self,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_call_expression_tail(
+ &mut self,
+ arguments: &'alloc Arguments<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ self.enter_enum_optional_chain_variant_computed_member_expression(ast);
+ self.visit_computed_member_expression(ast);
+ self.leave_enum_optional_chain_variant_computed_member_expression(ast);
+ }
+
+ fn enter_enum_optional_chain_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_computed_member_expression(
+ &mut self,
+ ast: &'alloc ComputedMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ self.enter_enum_optional_chain_variant_static_member_expression(ast);
+ self.visit_static_member_expression(ast);
+ self.leave_enum_optional_chain_variant_static_member_expression(ast);
+ }
+
+ fn enter_enum_optional_chain_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_static_member_expression(
+ &mut self,
+ ast: &'alloc StaticMemberExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ self.enter_enum_optional_chain_variant_private_field_expression(ast);
+ self.visit_private_field_expression(ast);
+ self.leave_enum_optional_chain_variant_private_field_expression(ast);
+ }
+
+ fn enter_enum_optional_chain_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_private_field_expression(
+ &mut self,
+ ast: &'alloc PrivateFieldExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_optional_chain_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ self.enter_enum_optional_chain_variant_call_expression(ast);
+ self.visit_call_expression(ast);
+ self.leave_enum_optional_chain_variant_call_expression(ast);
+ }
+
+ fn enter_enum_optional_chain_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_optional_chain_variant_call_expression(
+ &mut self,
+ ast: &'alloc CallExpression<'alloc>,
+ ) {
+ }
+
+ fn visit_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
+ self.enter_property_name(ast);
+ match ast {
+ PropertyName::ComputedPropertyName(ast) => {
+ self.visit_enum_property_name_variant_computed_property_name(ast)
+ }
+ PropertyName::StaticPropertyName(ast) => {
+ self.visit_enum_property_name_variant_static_property_name(ast)
+ }
+ PropertyName::StaticNumericPropertyName(ast) => {
+ self.visit_enum_property_name_variant_static_numeric_property_name(ast)
+ }
+ }
+ self.leave_property_name(ast);
+ }
+
+ fn enter_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
+ }
+
+ fn leave_property_name(&mut self, ast: &'alloc PropertyName<'alloc>) {
+ }
+
+ fn visit_enum_property_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ self.enter_enum_property_name_variant_computed_property_name(ast);
+ self.visit_computed_property_name(ast);
+ self.leave_enum_property_name_variant_computed_property_name(ast);
+ }
+
+ fn enter_enum_property_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_property_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_property_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ self.enter_enum_property_name_variant_static_property_name(ast);
+ self.visit_static_property_name(ast);
+ self.leave_enum_property_name_variant_static_property_name(ast);
+ }
+
+ fn enter_enum_property_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ }
+
+ fn leave_enum_property_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ }
+
+ fn visit_enum_property_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ self.enter_enum_property_name_variant_static_numeric_property_name(ast);
+ self.visit_numeric_literal(ast);
+ self.leave_enum_property_name_variant_static_numeric_property_name(ast);
+ }
+
+ fn enter_enum_property_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn leave_enum_property_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn visit_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
+ self.enter_call_expression(ast);
+ self.visit_expression_or_super(&ast.callee);
+ self.visit_arguments(&ast.arguments);
+ self.leave_call_expression(ast);
+ }
+
+ fn enter_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
+ }
+
+ fn leave_call_expression(&mut self, ast: &'alloc CallExpression<'alloc>) {
+ }
+
+ fn visit_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
+ self.enter_class_element_name(ast);
+ match ast {
+ ClassElementName::ComputedPropertyName(ast) => {
+ self.visit_enum_class_element_name_variant_computed_property_name(ast)
+ }
+ ClassElementName::StaticPropertyName(ast) => {
+ self.visit_enum_class_element_name_variant_static_property_name(ast)
+ }
+ ClassElementName::StaticNumericPropertyName(ast) => {
+ self.visit_enum_class_element_name_variant_static_numeric_property_name(ast)
+ }
+ ClassElementName::PrivateFieldName(ast) => {
+ self.visit_enum_class_element_name_variant_private_field_name(ast)
+ }
+ }
+ self.leave_class_element_name(ast);
+ }
+
+ fn enter_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
+ }
+
+ fn leave_class_element_name(&mut self, ast: &'alloc ClassElementName<'alloc>) {
+ }
+
+ fn visit_enum_class_element_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ self.enter_enum_class_element_name_variant_computed_property_name(ast);
+ self.visit_computed_property_name(ast);
+ self.leave_enum_class_element_name_variant_computed_property_name(ast);
+ }
+
+ fn enter_enum_class_element_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_class_element_name_variant_computed_property_name(
+ &mut self,
+ ast: &'alloc ComputedPropertyName<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_class_element_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ self.enter_enum_class_element_name_variant_static_property_name(ast);
+ self.visit_static_property_name(ast);
+ self.leave_enum_class_element_name_variant_static_property_name(ast);
+ }
+
+ fn enter_enum_class_element_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ }
+
+ fn leave_enum_class_element_name_variant_static_property_name(
+ &mut self,
+ ast: &'alloc StaticPropertyName,
+ ) {
+ }
+
+ fn visit_enum_class_element_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ self.enter_enum_class_element_name_variant_static_numeric_property_name(ast);
+ self.visit_numeric_literal(ast);
+ self.leave_enum_class_element_name_variant_static_numeric_property_name(ast);
+ }
+
+ fn enter_enum_class_element_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn leave_enum_class_element_name_variant_static_numeric_property_name(
+ &mut self,
+ ast: &'alloc NumericLiteral,
+ ) {
+ }
+
+ fn visit_enum_class_element_name_variant_private_field_name(
+ &mut self,
+ ast: &'alloc PrivateIdentifier,
+ ) {
+ self.enter_enum_class_element_name_variant_private_field_name(ast);
+ self.visit_private_identifier(ast);
+ self.leave_enum_class_element_name_variant_private_field_name(ast);
+ }
+
+ fn enter_enum_class_element_name_variant_private_field_name(
+ &mut self,
+ ast: &'alloc PrivateIdentifier,
+ ) {
+ }
+
+ fn leave_enum_class_element_name_variant_private_field_name(
+ &mut self,
+ ast: &'alloc PrivateIdentifier,
+ ) {
+ }
+
+ fn visit_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
+ self.enter_object_property(ast);
+ match ast {
+ ObjectProperty::NamedObjectProperty(ast) => {
+ self.visit_enum_object_property_variant_named_object_property(ast)
+ }
+ ObjectProperty::ShorthandProperty(ast) => {
+ self.visit_enum_object_property_variant_shorthand_property(ast)
+ }
+ ObjectProperty::SpreadProperty(ast) => {
+ self.visit_enum_object_property_variant_spread_property(ast)
+ }
+ }
+ self.leave_object_property(ast);
+ }
+
+ fn enter_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
+ }
+
+ fn leave_object_property(&mut self, ast: &'alloc ObjectProperty<'alloc>) {
+ }
+
+ fn visit_enum_object_property_variant_named_object_property(
+ &mut self,
+ ast: &'alloc NamedObjectProperty<'alloc>,
+ ) {
+ self.enter_enum_object_property_variant_named_object_property(ast);
+ self.visit_named_object_property(ast);
+ self.leave_enum_object_property_variant_named_object_property(ast);
+ }
+
+ fn enter_enum_object_property_variant_named_object_property(
+ &mut self,
+ ast: &'alloc NamedObjectProperty<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_object_property_variant_named_object_property(
+ &mut self,
+ ast: &'alloc NamedObjectProperty<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_object_property_variant_shorthand_property(
+ &mut self,
+ ast: &'alloc ShorthandProperty,
+ ) {
+ self.enter_enum_object_property_variant_shorthand_property(ast);
+ self.visit_shorthand_property(ast);
+ self.leave_enum_object_property_variant_shorthand_property(ast);
+ }
+
+ fn enter_enum_object_property_variant_shorthand_property(
+ &mut self,
+ ast: &'alloc ShorthandProperty,
+ ) {
+ }
+
+ fn leave_enum_object_property_variant_shorthand_property(
+ &mut self,
+ ast: &'alloc ShorthandProperty,
+ ) {
+ }
+
+ fn visit_enum_object_property_variant_spread_property(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_object_property_variant_spread_property(ast);
+ self.visit_expression(ast);
+ self.leave_enum_object_property_variant_spread_property(ast);
+ }
+
+ fn enter_enum_object_property_variant_spread_property(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_object_property_variant_spread_property(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
+ self.enter_named_object_property(ast);
+ match ast {
+ NamedObjectProperty::MethodDefinition(ast) => {
+ self.visit_enum_named_object_property_variant_method_definition(ast)
+ }
+ NamedObjectProperty::DataProperty(ast) => {
+ self.visit_enum_named_object_property_variant_data_property(ast)
+ }
+ }
+ self.leave_named_object_property(ast);
+ }
+
+ fn enter_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
+ }
+
+ fn leave_named_object_property(&mut self, ast: &'alloc NamedObjectProperty<'alloc>) {
+ }
+
+ fn visit_enum_named_object_property_variant_method_definition(
+ &mut self,
+ ast: &'alloc MethodDefinition<'alloc>,
+ ) {
+ self.enter_enum_named_object_property_variant_method_definition(ast);
+ self.visit_method_definition(ast);
+ self.leave_enum_named_object_property_variant_method_definition(ast);
+ }
+
+ fn enter_enum_named_object_property_variant_method_definition(
+ &mut self,
+ ast: &'alloc MethodDefinition<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_named_object_property_variant_method_definition(
+ &mut self,
+ ast: &'alloc MethodDefinition<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_named_object_property_variant_data_property(
+ &mut self,
+ ast: &'alloc DataProperty<'alloc>,
+ ) {
+ self.enter_enum_named_object_property_variant_data_property(ast);
+ self.visit_data_property(ast);
+ self.leave_enum_named_object_property_variant_data_property(ast);
+ }
+
+ fn enter_enum_named_object_property_variant_data_property(
+ &mut self,
+ ast: &'alloc DataProperty<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_named_object_property_variant_data_property(
+ &mut self,
+ ast: &'alloc DataProperty<'alloc>,
+ ) {
+ }
+
+ fn visit_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
+ self.enter_method_definition(ast);
+ match ast {
+ MethodDefinition::Method(ast) => {
+ self.visit_enum_method_definition_variant_method(ast)
+ }
+ MethodDefinition::Getter(ast) => {
+ self.visit_enum_method_definition_variant_getter(ast)
+ }
+ MethodDefinition::Setter(ast) => {
+ self.visit_enum_method_definition_variant_setter(ast)
+ }
+ }
+ self.leave_method_definition(ast);
+ }
+
+ fn enter_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
+ }
+
+ fn leave_method_definition(&mut self, ast: &'alloc MethodDefinition<'alloc>) {
+ }
+
+ fn visit_enum_method_definition_variant_method(
+ &mut self,
+ ast: &'alloc Method<'alloc>,
+ ) {
+ self.enter_enum_method_definition_variant_method(ast);
+ self.visit_method(ast);
+ self.leave_enum_method_definition_variant_method(ast);
+ }
+
+ fn enter_enum_method_definition_variant_method(
+ &mut self,
+ ast: &'alloc Method<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_method_definition_variant_method(
+ &mut self,
+ ast: &'alloc Method<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_method_definition_variant_getter(
+ &mut self,
+ ast: &'alloc Getter<'alloc>,
+ ) {
+ self.enter_enum_method_definition_variant_getter(ast);
+ self.visit_getter(ast);
+ self.leave_enum_method_definition_variant_getter(ast);
+ }
+
+ fn enter_enum_method_definition_variant_getter(
+ &mut self,
+ ast: &'alloc Getter<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_method_definition_variant_getter(
+ &mut self,
+ ast: &'alloc Getter<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_method_definition_variant_setter(
+ &mut self,
+ ast: &'alloc Setter<'alloc>,
+ ) {
+ self.enter_enum_method_definition_variant_setter(ast);
+ self.visit_setter(ast);
+ self.leave_enum_method_definition_variant_setter(ast);
+ }
+
+ fn enter_enum_method_definition_variant_setter(
+ &mut self,
+ ast: &'alloc Setter<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_method_definition_variant_setter(
+ &mut self,
+ ast: &'alloc Setter<'alloc>,
+ ) {
+ }
+
+ fn visit_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
+ self.enter_import_declaration(ast);
+ match ast {
+ ImportDeclaration::Import(ast) => {
+ self.visit_enum_import_declaration_variant_import(ast)
+ }
+ ImportDeclaration::ImportNamespace(ast) => {
+ self.visit_enum_import_declaration_variant_import_namespace(ast)
+ }
+ }
+ self.leave_import_declaration(ast);
+ }
+
+ fn enter_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
+ }
+
+ fn leave_import_declaration(&mut self, ast: &'alloc ImportDeclaration<'alloc>) {
+ }
+
+ fn visit_enum_import_declaration_variant_import(
+ &mut self,
+ ast: &'alloc Import<'alloc>,
+ ) {
+ self.enter_enum_import_declaration_variant_import(ast);
+ self.visit_import(ast);
+ self.leave_enum_import_declaration_variant_import(ast);
+ }
+
+ fn enter_enum_import_declaration_variant_import(
+ &mut self,
+ ast: &'alloc Import<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_import_declaration_variant_import(
+ &mut self,
+ ast: &'alloc Import<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_import_declaration_variant_import_namespace(
+ &mut self,
+ ast: &'alloc ImportNamespace,
+ ) {
+ self.enter_enum_import_declaration_variant_import_namespace(ast);
+ self.visit_import_namespace(ast);
+ self.leave_enum_import_declaration_variant_import_namespace(ast);
+ }
+
+ fn enter_enum_import_declaration_variant_import_namespace(
+ &mut self,
+ ast: &'alloc ImportNamespace,
+ ) {
+ }
+
+ fn leave_enum_import_declaration_variant_import_namespace(
+ &mut self,
+ ast: &'alloc ImportNamespace,
+ ) {
+ }
+
+ fn visit_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
+ self.enter_export_declaration(ast);
+ match ast {
+ ExportDeclaration::ExportAllFrom(ast) => {
+ self.visit_enum_export_declaration_variant_export_all_from(ast)
+ }
+ ExportDeclaration::ExportFrom(ast) => {
+ self.visit_enum_export_declaration_variant_export_from(ast)
+ }
+ ExportDeclaration::ExportLocals(ast) => {
+ self.visit_enum_export_declaration_variant_export_locals(ast)
+ }
+ ExportDeclaration::Export(ast) => {
+ self.visit_enum_export_declaration_variant_export(ast)
+ }
+ ExportDeclaration::ExportDefault(ast) => {
+ self.visit_enum_export_declaration_variant_export_default(ast)
+ }
+ }
+ self.leave_export_declaration(ast);
+ }
+
+ fn enter_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
+ }
+
+ fn leave_export_declaration(&mut self, ast: &'alloc ExportDeclaration<'alloc>) {
+ }
+
+ fn visit_enum_export_declaration_variant_export_all_from(
+ &mut self,
+ ast: &'alloc ExportAllFrom,
+ ) {
+ self.enter_enum_export_declaration_variant_export_all_from(ast);
+ self.visit_export_all_from(ast);
+ self.leave_enum_export_declaration_variant_export_all_from(ast);
+ }
+
+ fn enter_enum_export_declaration_variant_export_all_from(
+ &mut self,
+ ast: &'alloc ExportAllFrom,
+ ) {
+ }
+
+ fn leave_enum_export_declaration_variant_export_all_from(
+ &mut self,
+ ast: &'alloc ExportAllFrom,
+ ) {
+ }
+
+ fn visit_enum_export_declaration_variant_export_from(
+ &mut self,
+ ast: &'alloc ExportFrom<'alloc>,
+ ) {
+ self.enter_enum_export_declaration_variant_export_from(ast);
+ self.visit_export_from(ast);
+ self.leave_enum_export_declaration_variant_export_from(ast);
+ }
+
+ fn enter_enum_export_declaration_variant_export_from(
+ &mut self,
+ ast: &'alloc ExportFrom<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_declaration_variant_export_from(
+ &mut self,
+ ast: &'alloc ExportFrom<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_declaration_variant_export_locals(
+ &mut self,
+ ast: &'alloc ExportLocals<'alloc>,
+ ) {
+ self.enter_enum_export_declaration_variant_export_locals(ast);
+ self.visit_export_locals(ast);
+ self.leave_enum_export_declaration_variant_export_locals(ast);
+ }
+
+ fn enter_enum_export_declaration_variant_export_locals(
+ &mut self,
+ ast: &'alloc ExportLocals<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_declaration_variant_export_locals(
+ &mut self,
+ ast: &'alloc ExportLocals<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_declaration_variant_export(
+ &mut self,
+ ast: &'alloc Export<'alloc>,
+ ) {
+ self.enter_enum_export_declaration_variant_export(ast);
+ self.visit_export(ast);
+ self.leave_enum_export_declaration_variant_export(ast);
+ }
+
+ fn enter_enum_export_declaration_variant_export(
+ &mut self,
+ ast: &'alloc Export<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_declaration_variant_export(
+ &mut self,
+ ast: &'alloc Export<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_declaration_variant_export_default(
+ &mut self,
+ ast: &'alloc ExportDefault<'alloc>,
+ ) {
+ self.enter_enum_export_declaration_variant_export_default(ast);
+ self.visit_export_default(ast);
+ self.leave_enum_export_declaration_variant_export_default(ast);
+ }
+
+ fn enter_enum_export_declaration_variant_export_default(
+ &mut self,
+ ast: &'alloc ExportDefault<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_declaration_variant_export_default(
+ &mut self,
+ ast: &'alloc ExportDefault<'alloc>,
+ ) {
+ }
+
+ fn visit_variable_reference(&mut self, ast: &'alloc VariableReference) {
+ self.enter_variable_reference(ast);
+ match ast {
+ VariableReference::BindingIdentifier(ast) => {
+ self.visit_enum_variable_reference_variant_binding_identifier(ast)
+ }
+ VariableReference::AssignmentTargetIdentifier(ast) => {
+ self.visit_enum_variable_reference_variant_assignment_target_identifier(ast)
+ }
+ }
+ self.leave_variable_reference(ast);
+ }
+
+ fn enter_variable_reference(&mut self, ast: &'alloc VariableReference) {
+ }
+
+ fn leave_variable_reference(&mut self, ast: &'alloc VariableReference) {
+ }
+
+ fn visit_enum_variable_reference_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ self.enter_enum_variable_reference_variant_binding_identifier(ast);
+ self.visit_binding_identifier(ast);
+ self.leave_enum_variable_reference_variant_binding_identifier(ast);
+ }
+
+ fn enter_enum_variable_reference_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ }
+
+ fn leave_enum_variable_reference_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ }
+
+ fn visit_enum_variable_reference_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ self.enter_enum_variable_reference_variant_assignment_target_identifier(ast);
+ self.visit_assignment_target_identifier(ast);
+ self.leave_enum_variable_reference_variant_assignment_target_identifier(ast);
+ }
+
+ fn enter_enum_variable_reference_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ }
+
+ fn leave_enum_variable_reference_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ }
+
+ fn visit_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
+ self.enter_binding_pattern(ast);
+ match ast {
+ BindingPattern::ObjectBinding(ast) => {
+ self.visit_enum_binding_pattern_variant_object_binding(ast)
+ }
+ BindingPattern::ArrayBinding(ast) => {
+ self.visit_enum_binding_pattern_variant_array_binding(ast)
+ }
+ }
+ self.leave_binding_pattern(ast);
+ }
+
+ fn enter_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
+ }
+
+ fn leave_binding_pattern(&mut self, ast: &'alloc BindingPattern<'alloc>) {
+ }
+
+ fn visit_enum_binding_pattern_variant_object_binding(
+ &mut self,
+ ast: &'alloc ObjectBinding<'alloc>,
+ ) {
+ self.enter_enum_binding_pattern_variant_object_binding(ast);
+ self.visit_object_binding(ast);
+ self.leave_enum_binding_pattern_variant_object_binding(ast);
+ }
+
+ fn enter_enum_binding_pattern_variant_object_binding(
+ &mut self,
+ ast: &'alloc ObjectBinding<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_binding_pattern_variant_object_binding(
+ &mut self,
+ ast: &'alloc ObjectBinding<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_binding_pattern_variant_array_binding(
+ &mut self,
+ ast: &'alloc ArrayBinding<'alloc>,
+ ) {
+ self.enter_enum_binding_pattern_variant_array_binding(ast);
+ self.visit_array_binding(ast);
+ self.leave_enum_binding_pattern_variant_array_binding(ast);
+ }
+
+ fn enter_enum_binding_pattern_variant_array_binding(
+ &mut self,
+ ast: &'alloc ArrayBinding<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_binding_pattern_variant_array_binding(
+ &mut self,
+ ast: &'alloc ArrayBinding<'alloc>,
+ ) {
+ }
+
+ fn visit_binding(&mut self, ast: &'alloc Binding<'alloc>) {
+ self.enter_binding(ast);
+ match ast {
+ Binding::BindingPattern(ast) => {
+ self.visit_enum_binding_variant_binding_pattern(ast)
+ }
+ Binding::BindingIdentifier(ast) => {
+ self.visit_enum_binding_variant_binding_identifier(ast)
+ }
+ }
+ self.leave_binding(ast);
+ }
+
+ fn enter_binding(&mut self, ast: &'alloc Binding<'alloc>) {
+ }
+
+ fn leave_binding(&mut self, ast: &'alloc Binding<'alloc>) {
+ }
+
+ fn visit_enum_binding_variant_binding_pattern(
+ &mut self,
+ ast: &'alloc BindingPattern<'alloc>,
+ ) {
+ self.enter_enum_binding_variant_binding_pattern(ast);
+ self.visit_binding_pattern(ast);
+ self.leave_enum_binding_variant_binding_pattern(ast);
+ }
+
+ fn enter_enum_binding_variant_binding_pattern(
+ &mut self,
+ ast: &'alloc BindingPattern<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_binding_variant_binding_pattern(
+ &mut self,
+ ast: &'alloc BindingPattern<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_binding_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ self.enter_enum_binding_variant_binding_identifier(ast);
+ self.visit_binding_identifier(ast);
+ self.leave_enum_binding_variant_binding_identifier(ast);
+ }
+
+ fn enter_enum_binding_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ }
+
+ fn leave_enum_binding_variant_binding_identifier(
+ &mut self,
+ ast: &'alloc BindingIdentifier,
+ ) {
+ }
+
+ fn visit_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
+ self.enter_simple_assignment_target(ast);
+ match ast {
+ SimpleAssignmentTarget::AssignmentTargetIdentifier(ast) => {
+ self.visit_enum_simple_assignment_target_variant_assignment_target_identifier(ast)
+ }
+ SimpleAssignmentTarget::MemberAssignmentTarget(ast) => {
+ self.visit_enum_simple_assignment_target_variant_member_assignment_target(ast)
+ }
+ }
+ self.leave_simple_assignment_target(ast);
+ }
+
+ fn enter_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_simple_assignment_target(&mut self, ast: &'alloc SimpleAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_enum_simple_assignment_target_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ self.enter_enum_simple_assignment_target_variant_assignment_target_identifier(ast);
+ self.visit_assignment_target_identifier(ast);
+ self.leave_enum_simple_assignment_target_variant_assignment_target_identifier(ast);
+ }
+
+ fn enter_enum_simple_assignment_target_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ }
+
+ fn leave_enum_simple_assignment_target_variant_assignment_target_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetIdentifier,
+ ) {
+ }
+
+ fn visit_enum_simple_assignment_target_variant_member_assignment_target(
+ &mut self,
+ ast: &'alloc MemberAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_simple_assignment_target_variant_member_assignment_target(ast);
+ self.visit_member_assignment_target(ast);
+ self.leave_enum_simple_assignment_target_variant_member_assignment_target(ast);
+ }
+
+ fn enter_enum_simple_assignment_target_variant_member_assignment_target(
+ &mut self,
+ ast: &'alloc MemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_simple_assignment_target_variant_member_assignment_target(
+ &mut self,
+ ast: &'alloc MemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
+ self.enter_assignment_target_pattern(ast);
+ match ast {
+ AssignmentTargetPattern::ArrayAssignmentTarget(ast) => {
+ self.visit_enum_assignment_target_pattern_variant_array_assignment_target(ast)
+ }
+ AssignmentTargetPattern::ObjectAssignmentTarget(ast) => {
+ self.visit_enum_assignment_target_pattern_variant_object_assignment_target(ast)
+ }
+ }
+ self.leave_assignment_target_pattern(ast);
+ }
+
+ fn enter_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
+ }
+
+ fn leave_assignment_target_pattern(&mut self, ast: &'alloc AssignmentTargetPattern<'alloc>) {
+ }
+
+ fn visit_enum_assignment_target_pattern_variant_array_assignment_target(
+ &mut self,
+ ast: &'alloc ArrayAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_pattern_variant_array_assignment_target(ast);
+ self.visit_array_assignment_target(ast);
+ self.leave_enum_assignment_target_pattern_variant_array_assignment_target(ast);
+ }
+
+ fn enter_enum_assignment_target_pattern_variant_array_assignment_target(
+ &mut self,
+ ast: &'alloc ArrayAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_pattern_variant_array_assignment_target(
+ &mut self,
+ ast: &'alloc ArrayAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_assignment_target_pattern_variant_object_assignment_target(
+ &mut self,
+ ast: &'alloc ObjectAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_pattern_variant_object_assignment_target(ast);
+ self.visit_object_assignment_target(ast);
+ self.leave_enum_assignment_target_pattern_variant_object_assignment_target(ast);
+ }
+
+ fn enter_enum_assignment_target_pattern_variant_object_assignment_target(
+ &mut self,
+ ast: &'alloc ObjectAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_pattern_variant_object_assignment_target(
+ &mut self,
+ ast: &'alloc ObjectAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
+ self.enter_assignment_target(ast);
+ match ast {
+ AssignmentTarget::AssignmentTargetPattern(ast) => {
+ self.visit_enum_assignment_target_variant_assignment_target_pattern(ast)
+ }
+ AssignmentTarget::SimpleAssignmentTarget(ast) => {
+ self.visit_enum_assignment_target_variant_simple_assignment_target(ast)
+ }
+ }
+ self.leave_assignment_target(ast);
+ }
+
+ fn enter_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
+ }
+
+ fn leave_assignment_target(&mut self, ast: &'alloc AssignmentTarget<'alloc>) {
+ }
+
+ fn visit_enum_assignment_target_variant_assignment_target_pattern(
+ &mut self,
+ ast: &'alloc AssignmentTargetPattern<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_variant_assignment_target_pattern(ast);
+ self.visit_assignment_target_pattern(ast);
+ self.leave_enum_assignment_target_variant_assignment_target_pattern(ast);
+ }
+
+ fn enter_enum_assignment_target_variant_assignment_target_pattern(
+ &mut self,
+ ast: &'alloc AssignmentTargetPattern<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_variant_assignment_target_pattern(
+ &mut self,
+ ast: &'alloc AssignmentTargetPattern<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_assignment_target_variant_simple_assignment_target(
+ &mut self,
+ ast: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_variant_simple_assignment_target(ast);
+ self.visit_simple_assignment_target(ast);
+ self.leave_enum_assignment_target_variant_simple_assignment_target(ast);
+ }
+
+ fn enter_enum_assignment_target_variant_simple_assignment_target(
+ &mut self,
+ ast: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_variant_simple_assignment_target(
+ &mut self,
+ ast: &'alloc SimpleAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
+ self.enter_parameter(ast);
+ match ast {
+ Parameter::Binding(ast) => {
+ self.visit_enum_parameter_variant_binding(ast)
+ }
+ Parameter::BindingWithDefault(ast) => {
+ self.visit_enum_parameter_variant_binding_with_default(ast)
+ }
+ }
+ self.leave_parameter(ast);
+ }
+
+ fn enter_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
+ }
+
+ fn leave_parameter(&mut self, ast: &'alloc Parameter<'alloc>) {
+ }
+
+ fn visit_enum_parameter_variant_binding(
+ &mut self,
+ ast: &'alloc Binding<'alloc>,
+ ) {
+ self.enter_enum_parameter_variant_binding(ast);
+ self.visit_binding(ast);
+ self.leave_enum_parameter_variant_binding(ast);
+ }
+
+ fn enter_enum_parameter_variant_binding(
+ &mut self,
+ ast: &'alloc Binding<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_parameter_variant_binding(
+ &mut self,
+ ast: &'alloc Binding<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_parameter_variant_binding_with_default(
+ &mut self,
+ ast: &'alloc BindingWithDefault<'alloc>,
+ ) {
+ self.enter_enum_parameter_variant_binding_with_default(ast);
+ self.visit_binding_with_default(ast);
+ self.leave_enum_parameter_variant_binding_with_default(ast);
+ }
+
+ fn enter_enum_parameter_variant_binding_with_default(
+ &mut self,
+ ast: &'alloc BindingWithDefault<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_parameter_variant_binding_with_default(
+ &mut self,
+ ast: &'alloc BindingWithDefault<'alloc>,
+ ) {
+ }
+
+ fn visit_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
+ self.enter_binding_with_default(ast);
+ self.visit_binding(&ast.binding);
+ self.visit_expression(&ast.init);
+ self.leave_binding_with_default(ast);
+ }
+
+ fn enter_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
+ }
+
+ fn leave_binding_with_default(&mut self, ast: &'alloc BindingWithDefault<'alloc>) {
+ }
+
+ fn visit_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
+ self.enter_binding_identifier(ast);
+ self.visit_identifier(&ast.name);
+ self.leave_binding_identifier(ast);
+ }
+
+ fn enter_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
+ }
+
+ fn leave_binding_identifier(&mut self, ast: &'alloc BindingIdentifier) {
+ }
+
+ fn visit_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
+ self.enter_assignment_target_identifier(ast);
+ self.visit_identifier(&ast.name);
+ self.leave_assignment_target_identifier(ast);
+ }
+
+ fn enter_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
+ }
+
+ fn leave_assignment_target_identifier(&mut self, ast: &'alloc AssignmentTargetIdentifier) {
+ }
+
+ fn visit_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
+ self.enter_expression_or_super(ast);
+ match ast {
+ ExpressionOrSuper::Expression(ast) => {
+ self.visit_enum_expression_or_super_variant_expression(ast)
+ }
+ ExpressionOrSuper::Super { .. } => {
+ self.visit_enum_expression_or_super_variant_super()
+ }
+ }
+ self.leave_expression_or_super(ast);
+ }
+
+ fn enter_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
+ }
+
+ fn leave_expression_or_super(&mut self, ast: &'alloc ExpressionOrSuper<'alloc>) {
+ }
+
+ fn visit_enum_expression_or_super_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_expression_or_super_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_expression_or_super_variant_expression(ast);
+ }
+
+ fn enter_enum_expression_or_super_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_expression_or_super_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_expression_or_super_variant_super(&mut self) {
+ }
+
+ fn visit_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
+ self.enter_member_assignment_target(ast);
+ match ast {
+ MemberAssignmentTarget::ComputedMemberAssignmentTarget(ast) => {
+ self.visit_enum_member_assignment_target_variant_computed_member_assignment_target(ast)
+ }
+ MemberAssignmentTarget::PrivateFieldAssignmentTarget(ast) => {
+ self.visit_enum_member_assignment_target_variant_private_field_assignment_target(ast)
+ }
+ MemberAssignmentTarget::StaticMemberAssignmentTarget(ast) => {
+ self.visit_enum_member_assignment_target_variant_static_member_assignment_target(ast)
+ }
+ }
+ self.leave_member_assignment_target(ast);
+ }
+
+ fn enter_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_member_assignment_target(&mut self, ast: &'alloc MemberAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_enum_member_assignment_target_variant_computed_member_assignment_target(
+ &mut self,
+ ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_member_assignment_target_variant_computed_member_assignment_target(ast);
+ self.visit_computed_member_assignment_target(ast);
+ self.leave_enum_member_assignment_target_variant_computed_member_assignment_target(ast);
+ }
+
+ fn enter_enum_member_assignment_target_variant_computed_member_assignment_target(
+ &mut self,
+ ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_assignment_target_variant_computed_member_assignment_target(
+ &mut self,
+ ast: &'alloc ComputedMemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_member_assignment_target_variant_private_field_assignment_target(
+ &mut self,
+ ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_member_assignment_target_variant_private_field_assignment_target(ast);
+ self.visit_private_field_assignment_target(ast);
+ self.leave_enum_member_assignment_target_variant_private_field_assignment_target(ast);
+ }
+
+ fn enter_enum_member_assignment_target_variant_private_field_assignment_target(
+ &mut self,
+ ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_assignment_target_variant_private_field_assignment_target(
+ &mut self,
+ ast: &'alloc PrivateFieldAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_member_assignment_target_variant_static_member_assignment_target(
+ &mut self,
+ ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_member_assignment_target_variant_static_member_assignment_target(ast);
+ self.visit_static_member_assignment_target(ast);
+ self.leave_enum_member_assignment_target_variant_static_member_assignment_target(ast);
+ }
+
+ fn enter_enum_member_assignment_target_variant_static_member_assignment_target(
+ &mut self,
+ ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_member_assignment_target_variant_static_member_assignment_target(
+ &mut self,
+ ast: &'alloc StaticMemberAssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
+ self.enter_computed_member_assignment_target(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_expression(&ast.expression);
+ self.leave_computed_member_assignment_target(ast);
+ }
+
+ fn enter_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_computed_member_assignment_target(&mut self, ast: &'alloc ComputedMemberAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
+ self.enter_private_field_assignment_target(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_private_identifier(&ast.field);
+ self.leave_private_field_assignment_target(ast);
+ }
+
+ fn enter_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_private_field_assignment_target(&mut self, ast: &'alloc PrivateFieldAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
+ self.enter_static_member_assignment_target(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_identifier_name(&ast.property);
+ self.leave_static_member_assignment_target(ast);
+ }
+
+ fn enter_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_static_member_assignment_target(&mut self, ast: &'alloc StaticMemberAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
+ self.enter_array_binding(ast);
+ for item in &ast.elements {
+ if let Some(item) = item {
+ self.visit_parameter(item);
+ }
+ }
+ if let Some(item) = &ast.rest {
+ self.visit_binding(item);
+ }
+ self.leave_array_binding(ast);
+ }
+
+ fn enter_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
+ }
+
+ fn leave_array_binding(&mut self, ast: &'alloc ArrayBinding<'alloc>) {
+ }
+
+ fn visit_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
+ self.enter_object_binding(ast);
+ for item in &ast.properties {
+ self.visit_binding_property(item);
+ }
+ if let Some(item) = &ast.rest {
+ self.visit_binding_identifier(item);
+ }
+ self.leave_object_binding(ast);
+ }
+
+ fn enter_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
+ }
+
+ fn leave_object_binding(&mut self, ast: &'alloc ObjectBinding<'alloc>) {
+ }
+
+ fn visit_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
+ self.enter_binding_property(ast);
+ match ast {
+ BindingProperty::BindingPropertyIdentifier(ast) => {
+ self.visit_enum_binding_property_variant_binding_property_identifier(ast)
+ }
+ BindingProperty::BindingPropertyProperty(ast) => {
+ self.visit_enum_binding_property_variant_binding_property_property(ast)
+ }
+ }
+ self.leave_binding_property(ast);
+ }
+
+ fn enter_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
+ }
+
+ fn leave_binding_property(&mut self, ast: &'alloc BindingProperty<'alloc>) {
+ }
+
+ fn visit_enum_binding_property_variant_binding_property_identifier(
+ &mut self,
+ ast: &'alloc BindingPropertyIdentifier<'alloc>,
+ ) {
+ self.enter_enum_binding_property_variant_binding_property_identifier(ast);
+ self.visit_binding_property_identifier(ast);
+ self.leave_enum_binding_property_variant_binding_property_identifier(ast);
+ }
+
+ fn enter_enum_binding_property_variant_binding_property_identifier(
+ &mut self,
+ ast: &'alloc BindingPropertyIdentifier<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_binding_property_variant_binding_property_identifier(
+ &mut self,
+ ast: &'alloc BindingPropertyIdentifier<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_binding_property_variant_binding_property_property(
+ &mut self,
+ ast: &'alloc BindingPropertyProperty<'alloc>,
+ ) {
+ self.enter_enum_binding_property_variant_binding_property_property(ast);
+ self.visit_binding_property_property(ast);
+ self.leave_enum_binding_property_variant_binding_property_property(ast);
+ }
+
+ fn enter_enum_binding_property_variant_binding_property_property(
+ &mut self,
+ ast: &'alloc BindingPropertyProperty<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_binding_property_variant_binding_property_property(
+ &mut self,
+ ast: &'alloc BindingPropertyProperty<'alloc>,
+ ) {
+ }
+
+ fn visit_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
+ self.enter_binding_property_identifier(ast);
+ self.visit_binding_identifier(&ast.binding);
+ if let Some(item) = &ast.init {
+ self.visit_expression(item);
+ }
+ self.leave_binding_property_identifier(ast);
+ }
+
+ fn enter_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
+ }
+
+ fn leave_binding_property_identifier(&mut self, ast: &'alloc BindingPropertyIdentifier<'alloc>) {
+ }
+
+ fn visit_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
+ self.enter_binding_property_property(ast);
+ self.visit_property_name(&ast.name);
+ self.visit_parameter(&ast.binding);
+ self.leave_binding_property_property(ast);
+ }
+
+ fn enter_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
+ }
+
+ fn leave_binding_property_property(&mut self, ast: &'alloc BindingPropertyProperty<'alloc>) {
+ }
+
+ fn visit_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
+ self.enter_assignment_target_with_default(ast);
+ self.visit_assignment_target(&ast.binding);
+ self.visit_expression(&ast.init);
+ self.leave_assignment_target_with_default(ast);
+ }
+
+ fn enter_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
+ }
+
+ fn leave_assignment_target_with_default(&mut self, ast: &'alloc AssignmentTargetWithDefault<'alloc>) {
+ }
+
+ fn visit_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
+ self.enter_assignment_target_maybe_default(ast);
+ match ast {
+ AssignmentTargetMaybeDefault::AssignmentTarget(ast) => {
+ self.visit_enum_assignment_target_maybe_default_variant_assignment_target(ast)
+ }
+ AssignmentTargetMaybeDefault::AssignmentTargetWithDefault(ast) => {
+ self.visit_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast)
+ }
+ }
+ self.leave_assignment_target_maybe_default(ast);
+ }
+
+ fn enter_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
+ }
+
+ fn leave_assignment_target_maybe_default(&mut self, ast: &'alloc AssignmentTargetMaybeDefault<'alloc>) {
+ }
+
+ fn visit_enum_assignment_target_maybe_default_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_maybe_default_variant_assignment_target(ast);
+ self.visit_assignment_target(ast);
+ self.leave_enum_assignment_target_maybe_default_variant_assignment_target(ast);
+ }
+
+ fn enter_enum_assignment_target_maybe_default_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_maybe_default_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
+ &mut self,
+ ast: &'alloc AssignmentTargetWithDefault<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast);
+ self.visit_assignment_target_with_default(ast);
+ self.leave_enum_assignment_target_maybe_default_variant_assignment_target_with_default(ast);
+ }
+
+ fn enter_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
+ &mut self,
+ ast: &'alloc AssignmentTargetWithDefault<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_maybe_default_variant_assignment_target_with_default(
+ &mut self,
+ ast: &'alloc AssignmentTargetWithDefault<'alloc>,
+ ) {
+ }
+
+ fn visit_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
+ self.enter_array_assignment_target(ast);
+ for item in &ast.elements {
+ if let Some(item) = item {
+ self.visit_assignment_target_maybe_default(item);
+ }
+ }
+ if let Some(item) = &ast.rest {
+ self.visit_assignment_target(item);
+ }
+ self.leave_array_assignment_target(ast);
+ }
+
+ fn enter_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_array_assignment_target(&mut self, ast: &'alloc ArrayAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
+ self.enter_object_assignment_target(ast);
+ for item in &ast.properties {
+ self.visit_assignment_target_property(item);
+ }
+ if let Some(item) = &ast.rest {
+ self.visit_assignment_target(item);
+ }
+ self.leave_object_assignment_target(ast);
+ }
+
+ fn enter_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_object_assignment_target(&mut self, ast: &'alloc ObjectAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
+ self.enter_assignment_target_property(ast);
+ match ast {
+ AssignmentTargetProperty::AssignmentTargetPropertyIdentifier(ast) => {
+ self.visit_enum_assignment_target_property_variant_assignment_target_property_identifier(ast)
+ }
+ AssignmentTargetProperty::AssignmentTargetPropertyProperty(ast) => {
+ self.visit_enum_assignment_target_property_variant_assignment_target_property_property(ast)
+ }
+ }
+ self.leave_assignment_target_property(ast);
+ }
+
+ fn enter_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
+ }
+
+ fn leave_assignment_target_property(&mut self, ast: &'alloc AssignmentTargetProperty<'alloc>) {
+ }
+
+ fn visit_enum_assignment_target_property_variant_assignment_target_property_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_property_variant_assignment_target_property_identifier(ast);
+ self.visit_assignment_target_property_identifier(ast);
+ self.leave_enum_assignment_target_property_variant_assignment_target_property_identifier(ast);
+ }
+
+ fn enter_enum_assignment_target_property_variant_assignment_target_property_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_property_variant_assignment_target_property_identifier(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_assignment_target_property_variant_assignment_target_property_property(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
+ ) {
+ self.enter_enum_assignment_target_property_variant_assignment_target_property_property(ast);
+ self.visit_assignment_target_property_property(ast);
+ self.leave_enum_assignment_target_property_variant_assignment_target_property_property(ast);
+ }
+
+ fn enter_enum_assignment_target_property_variant_assignment_target_property_property(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_assignment_target_property_variant_assignment_target_property_property(
+ &mut self,
+ ast: &'alloc AssignmentTargetPropertyProperty<'alloc>,
+ ) {
+ }
+
+ fn visit_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
+ self.enter_assignment_target_property_identifier(ast);
+ self.visit_assignment_target_identifier(&ast.binding);
+ if let Some(item) = &ast.init {
+ self.visit_expression(item);
+ }
+ self.leave_assignment_target_property_identifier(ast);
+ }
+
+ fn enter_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
+ }
+
+ fn leave_assignment_target_property_identifier(&mut self, ast: &'alloc AssignmentTargetPropertyIdentifier<'alloc>) {
+ }
+
+ fn visit_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
+ self.enter_assignment_target_property_property(ast);
+ self.visit_property_name(&ast.name);
+ self.visit_assignment_target_maybe_default(&ast.binding);
+ self.leave_assignment_target_property_property(ast);
+ }
+
+ fn enter_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
+ }
+
+ fn leave_assignment_target_property_property(&mut self, ast: &'alloc AssignmentTargetPropertyProperty<'alloc>) {
+ }
+
+ fn visit_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
+ self.enter_class_expression(ast);
+ if let Some(item) = &ast.name {
+ self.visit_binding_identifier(item);
+ }
+ if let Some(item) = &ast.super_ {
+ self.visit_expression(item);
+ }
+ for item in &ast.elements {
+ self.visit_class_element(item);
+ }
+ self.leave_class_expression(ast);
+ }
+
+ fn enter_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
+ }
+
+ fn leave_class_expression(&mut self, ast: &'alloc ClassExpression<'alloc>) {
+ }
+
+ fn visit_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
+ self.enter_class_declaration(ast);
+ self.visit_binding_identifier(&ast.name);
+ if let Some(item) = &ast.super_ {
+ self.visit_expression(item);
+ }
+ for item in &ast.elements {
+ self.visit_class_element(item);
+ }
+ self.leave_class_declaration(ast);
+ }
+
+ fn enter_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
+ }
+
+ fn leave_class_declaration(&mut self, ast: &'alloc ClassDeclaration<'alloc>) {
+ }
+
+ fn visit_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
+ self.enter_class_element(ast);
+ match ast {
+ ClassElement::MethodDefinition { is_static, method, .. } => {
+ self.visit_enum_class_element_variant_method_definition(
+ is_static,
+ method,
+ )
+ }
+ ClassElement::FieldDefinition { name, init, .. } => {
+ self.visit_enum_class_element_variant_field_definition(
+ name,
+ init,
+ )
+ }
+ }
+ self.leave_class_element(ast);
+ }
+
+ fn enter_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
+ }
+
+ fn leave_class_element(&mut self, ast: &'alloc ClassElement<'alloc>) {
+ }
+
+ fn visit_enum_class_element_variant_method_definition(
+ &mut self,
+ is_static: &'alloc bool,
+ method: &'alloc MethodDefinition<'alloc>,
+ ) {
+ self.enter_enum_class_element_variant_method_definition(
+ is_static,
+ method,
+ );
+ self.visit_method_definition(method);
+ self.leave_enum_class_element_variant_method_definition(
+ is_static,
+ method,
+ );
+ }
+
+ fn enter_enum_class_element_variant_method_definition(
+ &mut self,
+ is_static: &'alloc bool,
+ method: &'alloc MethodDefinition<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_class_element_variant_method_definition(
+ &mut self,
+ is_static: &'alloc bool,
+ method: &'alloc MethodDefinition<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_class_element_variant_field_definition(
+ &mut self,
+ name: &'alloc ClassElementName<'alloc>,
+ init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ self.enter_enum_class_element_variant_field_definition(
+ name,
+ init,
+ );
+ self.visit_class_element_name(name);
+ if let Some(item) = init {
+ self.visit_expression(item);
+ }
+ self.leave_enum_class_element_variant_field_definition(
+ name,
+ init,
+ );
+ }
+
+ fn enter_enum_class_element_variant_field_definition(
+ &mut self,
+ name: &'alloc ClassElementName<'alloc>,
+ init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn leave_enum_class_element_variant_field_definition(
+ &mut self,
+ name: &'alloc ClassElementName<'alloc>,
+ init: &'alloc Option<arena::Box<'alloc, Expression<'alloc>>>,
+ ) {
+ }
+
+ fn visit_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
+ self.enter_module_items(ast);
+ match ast {
+ ModuleItems::ImportDeclaration(ast) => {
+ self.visit_enum_module_items_variant_import_declaration(ast)
+ }
+ ModuleItems::ExportDeclaration(ast) => {
+ self.visit_enum_module_items_variant_export_declaration(ast)
+ }
+ ModuleItems::Statement(ast) => {
+ self.visit_enum_module_items_variant_statement(ast)
+ }
+ }
+ self.leave_module_items(ast);
+ }
+
+ fn enter_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
+ }
+
+ fn leave_module_items(&mut self, ast: &'alloc ModuleItems<'alloc>) {
+ }
+
+ fn visit_enum_module_items_variant_import_declaration(
+ &mut self,
+ ast: &'alloc ImportDeclaration<'alloc>,
+ ) {
+ self.enter_enum_module_items_variant_import_declaration(ast);
+ self.visit_import_declaration(ast);
+ self.leave_enum_module_items_variant_import_declaration(ast);
+ }
+
+ fn enter_enum_module_items_variant_import_declaration(
+ &mut self,
+ ast: &'alloc ImportDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_module_items_variant_import_declaration(
+ &mut self,
+ ast: &'alloc ImportDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_module_items_variant_export_declaration(
+ &mut self,
+ ast: &'alloc ExportDeclaration<'alloc>,
+ ) {
+ self.enter_enum_module_items_variant_export_declaration(ast);
+ self.visit_export_declaration(ast);
+ self.leave_enum_module_items_variant_export_declaration(ast);
+ }
+
+ fn enter_enum_module_items_variant_export_declaration(
+ &mut self,
+ ast: &'alloc ExportDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_module_items_variant_export_declaration(
+ &mut self,
+ ast: &'alloc ExportDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_module_items_variant_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ self.enter_enum_module_items_variant_statement(ast);
+ self.visit_statement(ast);
+ self.leave_enum_module_items_variant_statement(ast);
+ }
+
+ fn enter_enum_module_items_variant_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_module_items_variant_statement(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Statement<'alloc>>,
+ ) {
+ }
+
+ fn visit_module(&mut self, ast: &'alloc Module<'alloc>) {
+ self.enter_module(ast);
+ for item in &ast.directives {
+ self.visit_directive(item);
+ }
+ for item in &ast.items {
+ self.visit_module_items(item);
+ }
+ self.leave_module(ast);
+ }
+
+ fn enter_module(&mut self, ast: &'alloc Module<'alloc>) {
+ }
+
+ fn leave_module(&mut self, ast: &'alloc Module<'alloc>) {
+ }
+
+ fn visit_import(&mut self, ast: &'alloc Import<'alloc>) {
+ self.enter_import(ast);
+ if let Some(item) = &ast.default_binding {
+ self.visit_binding_identifier(item);
+ }
+ for item in &ast.named_imports {
+ self.visit_import_specifier(item);
+ }
+ self.leave_import(ast);
+ }
+
+ fn enter_import(&mut self, ast: &'alloc Import<'alloc>) {
+ }
+
+ fn leave_import(&mut self, ast: &'alloc Import<'alloc>) {
+ }
+
+ fn visit_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
+ self.enter_import_namespace(ast);
+ if let Some(item) = &ast.default_binding {
+ self.visit_binding_identifier(item);
+ }
+ self.visit_binding_identifier(&ast.namespace_binding);
+ self.leave_import_namespace(ast);
+ }
+
+ fn enter_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
+ }
+
+ fn leave_import_namespace(&mut self, ast: &'alloc ImportNamespace) {
+ }
+
+ fn visit_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
+ self.enter_import_specifier(ast);
+ if let Some(item) = &ast.name {
+ self.visit_identifier_name(item);
+ }
+ self.visit_binding_identifier(&ast.binding);
+ self.leave_import_specifier(ast);
+ }
+
+ fn enter_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
+ }
+
+ fn leave_import_specifier(&mut self, ast: &'alloc ImportSpecifier) {
+ }
+
+ fn visit_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
+ self.enter_export_all_from(ast);
+ self.leave_export_all_from(ast);
+ }
+
+ fn enter_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
+ }
+
+ fn leave_export_all_from(&mut self, ast: &'alloc ExportAllFrom) {
+ }
+
+ fn visit_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
+ self.enter_export_from(ast);
+ for item in &ast.named_exports {
+ self.visit_export_from_specifier(item);
+ }
+ self.leave_export_from(ast);
+ }
+
+ fn enter_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
+ }
+
+ fn leave_export_from(&mut self, ast: &'alloc ExportFrom<'alloc>) {
+ }
+
+ fn visit_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
+ self.enter_export_locals(ast);
+ for item in &ast.named_exports {
+ self.visit_export_local_specifier(item);
+ }
+ self.leave_export_locals(ast);
+ }
+
+ fn enter_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
+ }
+
+ fn leave_export_locals(&mut self, ast: &'alloc ExportLocals<'alloc>) {
+ }
+
+ fn visit_export(&mut self, ast: &'alloc Export<'alloc>) {
+ self.enter_export(ast);
+ match ast {
+ Export::FunctionDeclaration(ast) => {
+ self.visit_enum_export_variant_function_declaration(ast)
+ }
+ Export::ClassDeclaration(ast) => {
+ self.visit_enum_export_variant_class_declaration(ast)
+ }
+ Export::VariableDeclaration(ast) => {
+ self.visit_enum_export_variant_variable_declaration(ast)
+ }
+ }
+ self.leave_export(ast);
+ }
+
+ fn enter_export(&mut self, ast: &'alloc Export<'alloc>) {
+ }
+
+ fn leave_export(&mut self, ast: &'alloc Export<'alloc>) {
+ }
+
+ fn visit_enum_export_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ self.enter_enum_export_variant_function_declaration(ast);
+ self.visit_function(ast);
+ self.leave_enum_export_variant_function_declaration(ast);
+ }
+
+ fn enter_enum_export_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ self.enter_enum_export_variant_class_declaration(ast);
+ self.visit_class_declaration(ast);
+ self.leave_enum_export_variant_class_declaration(ast);
+ }
+
+ fn enter_enum_export_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ self.enter_enum_export_variant_variable_declaration(ast);
+ self.visit_variable_declaration(ast);
+ self.leave_enum_export_variant_variable_declaration(ast);
+ }
+
+ fn enter_enum_export_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
+ self.enter_export_default(ast);
+ match ast {
+ ExportDefault::FunctionDeclaration(ast) => {
+ self.visit_enum_export_default_variant_function_declaration(ast)
+ }
+ ExportDefault::ClassDeclaration(ast) => {
+ self.visit_enum_export_default_variant_class_declaration(ast)
+ }
+ ExportDefault::Expression(ast) => {
+ self.visit_enum_export_default_variant_expression(ast)
+ }
+ }
+ self.leave_export_default(ast);
+ }
+
+ fn enter_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
+ }
+
+ fn leave_export_default(&mut self, ast: &'alloc ExportDefault<'alloc>) {
+ }
+
+ fn visit_enum_export_default_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ self.enter_enum_export_default_variant_function_declaration(ast);
+ self.visit_function(ast);
+ self.leave_enum_export_default_variant_function_declaration(ast);
+ }
+
+ fn enter_enum_export_default_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_default_variant_function_declaration(
+ &mut self,
+ ast: &'alloc Function<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_default_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ self.enter_enum_export_default_variant_class_declaration(ast);
+ self.visit_class_declaration(ast);
+ self.leave_enum_export_default_variant_class_declaration(ast);
+ }
+
+ fn enter_enum_export_default_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_export_default_variant_class_declaration(
+ &mut self,
+ ast: &'alloc ClassDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_export_default_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_export_default_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_export_default_variant_expression(ast);
+ }
+
+ fn enter_enum_export_default_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_export_default_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
+ self.enter_export_from_specifier(ast);
+ self.visit_identifier_name(&ast.name);
+ if let Some(item) = &ast.exported_name {
+ self.visit_identifier_name(item);
+ }
+ self.leave_export_from_specifier(ast);
+ }
+
+ fn enter_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
+ }
+
+ fn leave_export_from_specifier(&mut self, ast: &'alloc ExportFromSpecifier) {
+ }
+
+ fn visit_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
+ self.enter_export_local_specifier(ast);
+ self.visit_identifier_expression(&ast.name);
+ if let Some(item) = &ast.exported_name {
+ self.visit_identifier_name(item);
+ }
+ self.leave_export_local_specifier(ast);
+ }
+
+ fn enter_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
+ }
+
+ fn leave_export_local_specifier(&mut self, ast: &'alloc ExportLocalSpecifier) {
+ }
+
+ fn visit_method(&mut self, ast: &'alloc Method<'alloc>) {
+ self.enter_method(ast);
+ self.visit_class_element_name(&ast.name);
+ self.visit_formal_parameters(&ast.params);
+ self.visit_function_body(&ast.body);
+ self.leave_method(ast);
+ }
+
+ fn enter_method(&mut self, ast: &'alloc Method<'alloc>) {
+ }
+
+ fn leave_method(&mut self, ast: &'alloc Method<'alloc>) {
+ }
+
+ fn visit_getter(&mut self, ast: &'alloc Getter<'alloc>) {
+ self.enter_getter(ast);
+ self.visit_class_element_name(&ast.property_name);
+ self.visit_function_body(&ast.body);
+ self.leave_getter(ast);
+ }
+
+ fn enter_getter(&mut self, ast: &'alloc Getter<'alloc>) {
+ }
+
+ fn leave_getter(&mut self, ast: &'alloc Getter<'alloc>) {
+ }
+
+ fn visit_setter(&mut self, ast: &'alloc Setter<'alloc>) {
+ self.enter_setter(ast);
+ self.visit_class_element_name(&ast.property_name);
+ self.visit_parameter(&ast.param);
+ self.visit_function_body(&ast.body);
+ self.leave_setter(ast);
+ }
+
+ fn enter_setter(&mut self, ast: &'alloc Setter<'alloc>) {
+ }
+
+ fn leave_setter(&mut self, ast: &'alloc Setter<'alloc>) {
+ }
+
+ fn visit_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
+ self.enter_data_property(ast);
+ self.visit_property_name(&ast.property_name);
+ self.visit_expression(&ast.expression);
+ self.leave_data_property(ast);
+ }
+
+ fn enter_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
+ }
+
+ fn leave_data_property(&mut self, ast: &'alloc DataProperty<'alloc>) {
+ }
+
+ fn visit_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
+ self.enter_shorthand_property(ast);
+ self.visit_identifier_expression(&ast.name);
+ self.leave_shorthand_property(ast);
+ }
+
+ fn enter_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
+ }
+
+ fn leave_shorthand_property(&mut self, ast: &'alloc ShorthandProperty) {
+ }
+
+ fn visit_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
+ self.enter_computed_property_name(ast);
+ self.visit_expression(&ast.expression);
+ self.leave_computed_property_name(ast);
+ }
+
+ fn enter_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
+ }
+
+ fn leave_computed_property_name(&mut self, ast: &'alloc ComputedPropertyName<'alloc>) {
+ }
+
+ fn visit_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
+ self.enter_static_property_name(ast);
+ self.leave_static_property_name(ast);
+ }
+
+ fn enter_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
+ }
+
+ fn leave_static_property_name(&mut self, ast: &'alloc StaticPropertyName) {
+ }
+
+ fn visit_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
+ self.enter_numeric_literal(ast);
+ self.leave_numeric_literal(ast);
+ }
+
+ fn enter_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
+ }
+
+ fn leave_numeric_literal(&mut self, ast: &'alloc NumericLiteral) {
+ }
+
+ fn visit_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
+ self.enter_array_expression_element(ast);
+ match ast {
+ ArrayExpressionElement::SpreadElement(ast) => {
+ self.visit_enum_array_expression_element_variant_spread_element(ast)
+ }
+ ArrayExpressionElement::Expression(ast) => {
+ self.visit_enum_array_expression_element_variant_expression(ast)
+ }
+ ArrayExpressionElement::Elision { .. } => {
+ self.visit_enum_array_expression_element_variant_elision()
+ }
+ }
+ self.leave_array_expression_element(ast);
+ }
+
+ fn enter_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
+ }
+
+ fn leave_array_expression_element(&mut self, ast: &'alloc ArrayExpressionElement<'alloc>) {
+ }
+
+ fn visit_enum_array_expression_element_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_array_expression_element_variant_spread_element(ast);
+ self.visit_expression(ast);
+ self.leave_enum_array_expression_element_variant_spread_element(ast);
+ }
+
+ fn enter_enum_array_expression_element_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_array_expression_element_variant_spread_element(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_array_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_array_expression_element_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_array_expression_element_variant_expression(ast);
+ }
+
+ fn enter_enum_array_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_array_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_array_expression_element_variant_elision(&mut self) {
+ }
+
+ fn visit_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
+ self.enter_array_expression(ast);
+ for item in &ast.elements {
+ self.visit_array_expression_element(item);
+ }
+ self.leave_array_expression(ast);
+ }
+
+ fn enter_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
+ }
+
+ fn leave_array_expression(&mut self, ast: &'alloc ArrayExpression<'alloc>) {
+ }
+
+ fn visit_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
+ self.enter_arrow_expression_body(ast);
+ match ast {
+ ArrowExpressionBody::FunctionBody(ast) => {
+ self.visit_enum_arrow_expression_body_variant_function_body(ast)
+ }
+ ArrowExpressionBody::Expression(ast) => {
+ self.visit_enum_arrow_expression_body_variant_expression(ast)
+ }
+ }
+ self.leave_arrow_expression_body(ast);
+ }
+
+ fn enter_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
+ }
+
+ fn leave_arrow_expression_body(&mut self, ast: &'alloc ArrowExpressionBody<'alloc>) {
+ }
+
+ fn visit_enum_arrow_expression_body_variant_function_body(
+ &mut self,
+ ast: &'alloc FunctionBody<'alloc>,
+ ) {
+ self.enter_enum_arrow_expression_body_variant_function_body(ast);
+ self.visit_function_body(ast);
+ self.leave_enum_arrow_expression_body_variant_function_body(ast);
+ }
+
+ fn enter_enum_arrow_expression_body_variant_function_body(
+ &mut self,
+ ast: &'alloc FunctionBody<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_arrow_expression_body_variant_function_body(
+ &mut self,
+ ast: &'alloc FunctionBody<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_arrow_expression_body_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_arrow_expression_body_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_arrow_expression_body_variant_expression(ast);
+ }
+
+ fn enter_enum_arrow_expression_body_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_arrow_expression_body_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
+ self.enter_computed_member_expression(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_expression(&ast.expression);
+ self.leave_computed_member_expression(ast);
+ }
+
+ fn enter_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
+ }
+
+ fn leave_computed_member_expression(&mut self, ast: &'alloc ComputedMemberExpression<'alloc>) {
+ }
+
+ fn visit_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
+ self.enter_identifier_expression(ast);
+ self.visit_identifier(&ast.name);
+ self.leave_identifier_expression(ast);
+ }
+
+ fn enter_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
+ }
+
+ fn leave_identifier_expression(&mut self, ast: &'alloc IdentifierExpression) {
+ }
+
+ fn visit_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
+ self.enter_object_expression(ast);
+ for item in &ast.properties {
+ self.visit_object_property(item);
+ }
+ self.leave_object_expression(ast);
+ }
+
+ fn enter_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
+ }
+
+ fn leave_object_expression(&mut self, ast: &'alloc ObjectExpression<'alloc>) {
+ }
+
+ fn visit_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
+ self.enter_static_member_expression(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_identifier_name(&ast.property);
+ self.leave_static_member_expression(ast);
+ }
+
+ fn enter_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
+ }
+
+ fn leave_static_member_expression(&mut self, ast: &'alloc StaticMemberExpression<'alloc>) {
+ }
+
+ fn visit_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
+ self.enter_private_field_expression(ast);
+ self.visit_expression_or_super(&ast.object);
+ self.visit_private_identifier(&ast.field);
+ self.leave_private_field_expression(ast);
+ }
+
+ fn enter_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
+ }
+
+ fn leave_private_field_expression(&mut self, ast: &'alloc PrivateFieldExpression<'alloc>) {
+ }
+
+ fn visit_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
+ self.enter_template_expression_element(ast);
+ match ast {
+ TemplateExpressionElement::Expression(ast) => {
+ self.visit_enum_template_expression_element_variant_expression(ast)
+ }
+ TemplateExpressionElement::TemplateElement(ast) => {
+ self.visit_enum_template_expression_element_variant_template_element(ast)
+ }
+ }
+ self.leave_template_expression_element(ast);
+ }
+
+ fn enter_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
+ }
+
+ fn leave_template_expression_element(&mut self, ast: &'alloc TemplateExpressionElement<'alloc>) {
+ }
+
+ fn visit_enum_template_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_template_expression_element_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_template_expression_element_variant_expression(ast);
+ }
+
+ fn enter_enum_template_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_template_expression_element_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_template_expression_element_variant_template_element(
+ &mut self,
+ ast: &'alloc TemplateElement,
+ ) {
+ self.enter_enum_template_expression_element_variant_template_element(ast);
+ self.visit_template_element(ast);
+ self.leave_enum_template_expression_element_variant_template_element(ast);
+ }
+
+ fn enter_enum_template_expression_element_variant_template_element(
+ &mut self,
+ ast: &'alloc TemplateElement,
+ ) {
+ }
+
+ fn leave_enum_template_expression_element_variant_template_element(
+ &mut self,
+ ast: &'alloc TemplateElement,
+ ) {
+ }
+
+ fn visit_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
+ self.enter_template_expression(ast);
+ if let Some(item) = &ast.tag {
+ self.visit_expression(item);
+ }
+ for item in &ast.elements {
+ self.visit_template_expression_element(item);
+ }
+ self.leave_template_expression(ast);
+ }
+
+ fn enter_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
+ }
+
+ fn leave_template_expression(&mut self, ast: &'alloc TemplateExpression<'alloc>) {
+ }
+
+ fn visit_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
+ self.enter_variable_declaration_or_assignment_target(ast);
+ match ast {
+ VariableDeclarationOrAssignmentTarget::VariableDeclaration(ast) => {
+ self.visit_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast)
+ }
+ VariableDeclarationOrAssignmentTarget::AssignmentTarget(ast) => {
+ self.visit_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast)
+ }
+ }
+ self.leave_variable_declaration_or_assignment_target(ast);
+ }
+
+ fn enter_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
+ }
+
+ fn leave_variable_declaration_or_assignment_target(&mut self, ast: &'alloc VariableDeclarationOrAssignmentTarget<'alloc>) {
+ }
+
+ fn visit_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ self.enter_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast);
+ self.visit_variable_declaration(ast);
+ self.leave_enum_variable_declaration_or_assignment_target_variant_variable_declaration(ast);
+ }
+
+ fn enter_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_variable_declaration_or_assignment_target_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_variable_declaration_or_assignment_target_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ self.enter_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast);
+ self.visit_assignment_target(ast);
+ self.leave_enum_variable_declaration_or_assignment_target_variant_assignment_target(ast);
+ }
+
+ fn enter_enum_variable_declaration_or_assignment_target_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_variable_declaration_or_assignment_target_variant_assignment_target(
+ &mut self,
+ ast: &'alloc AssignmentTarget<'alloc>,
+ ) {
+ }
+
+ fn visit_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
+ self.enter_variable_declaration_or_expression(ast);
+ match ast {
+ VariableDeclarationOrExpression::VariableDeclaration(ast) => {
+ self.visit_enum_variable_declaration_or_expression_variant_variable_declaration(ast)
+ }
+ VariableDeclarationOrExpression::Expression(ast) => {
+ self.visit_enum_variable_declaration_or_expression_variant_expression(ast)
+ }
+ }
+ self.leave_variable_declaration_or_expression(ast);
+ }
+
+ fn enter_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
+ }
+
+ fn leave_variable_declaration_or_expression(&mut self, ast: &'alloc VariableDeclarationOrExpression<'alloc>) {
+ }
+
+ fn visit_enum_variable_declaration_or_expression_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ self.enter_enum_variable_declaration_or_expression_variant_variable_declaration(ast);
+ self.visit_variable_declaration(ast);
+ self.leave_enum_variable_declaration_or_expression_variant_variable_declaration(ast);
+ }
+
+ fn enter_enum_variable_declaration_or_expression_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn leave_enum_variable_declaration_or_expression_variant_variable_declaration(
+ &mut self,
+ ast: &'alloc VariableDeclaration<'alloc>,
+ ) {
+ }
+
+ fn visit_enum_variable_declaration_or_expression_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_variable_declaration_or_expression_variant_expression(ast);
+ self.visit_expression(ast);
+ self.leave_enum_variable_declaration_or_expression_variant_expression(ast);
+ }
+
+ fn enter_enum_variable_declaration_or_expression_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_variable_declaration_or_expression_variant_expression(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_block(&mut self, ast: &'alloc Block<'alloc>) {
+ self.enter_block(ast);
+ for item in &ast.statements {
+ self.visit_statement(item);
+ }
+ if let Some(item) = &ast.declarations {
+ for item in item {
+ }
+ }
+ self.leave_block(ast);
+ }
+
+ fn enter_block(&mut self, ast: &'alloc Block<'alloc>) {
+ }
+
+ fn leave_block(&mut self, ast: &'alloc Block<'alloc>) {
+ }
+
+ fn visit_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
+ self.enter_catch_clause(ast);
+ if let Some(item) = &ast.binding {
+ self.visit_binding(item);
+ }
+ self.visit_block(&ast.body);
+ self.leave_catch_clause(ast);
+ }
+
+ fn enter_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
+ }
+
+ fn leave_catch_clause(&mut self, ast: &'alloc CatchClause<'alloc>) {
+ }
+
+ fn visit_directive(&mut self, ast: &'alloc Directive) {
+ self.enter_directive(ast);
+ self.leave_directive(ast);
+ }
+
+ fn enter_directive(&mut self, ast: &'alloc Directive) {
+ }
+
+ fn leave_directive(&mut self, ast: &'alloc Directive) {
+ }
+
+ fn visit_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
+ self.enter_formal_parameters(ast);
+ for item in &ast.items {
+ self.visit_parameter(item);
+ }
+ if let Some(item) = &ast.rest {
+ self.visit_binding(item);
+ }
+ self.leave_formal_parameters(ast);
+ }
+
+ fn enter_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
+ }
+
+ fn leave_formal_parameters(&mut self, ast: &'alloc FormalParameters<'alloc>) {
+ }
+
+ fn visit_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
+ self.enter_function_body(ast);
+ for item in &ast.directives {
+ self.visit_directive(item);
+ }
+ for item in &ast.statements {
+ self.visit_statement(item);
+ }
+ self.leave_function_body(ast);
+ }
+
+ fn enter_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
+ }
+
+ fn leave_function_body(&mut self, ast: &'alloc FunctionBody<'alloc>) {
+ }
+
+ fn visit_script(&mut self, ast: &'alloc Script<'alloc>) {
+ self.enter_script(ast);
+ for item in &ast.directives {
+ self.visit_directive(item);
+ }
+ for item in &ast.statements {
+ self.visit_statement(item);
+ }
+ self.leave_script(ast);
+ }
+
+ fn enter_script(&mut self, ast: &'alloc Script<'alloc>) {
+ }
+
+ fn leave_script(&mut self, ast: &'alloc Script<'alloc>) {
+ }
+
+ fn visit_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
+ self.enter_switch_case(ast);
+ self.visit_expression(&ast.test);
+ for item in &ast.consequent {
+ self.visit_statement(item);
+ }
+ self.leave_switch_case(ast);
+ }
+
+ fn enter_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
+ }
+
+ fn leave_switch_case(&mut self, ast: &'alloc SwitchCase<'alloc>) {
+ }
+
+ fn visit_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
+ self.enter_switch_default(ast);
+ for item in &ast.consequent {
+ self.visit_statement(item);
+ }
+ self.leave_switch_default(ast);
+ }
+
+ fn enter_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
+ }
+
+ fn leave_switch_default(&mut self, ast: &'alloc SwitchDefault<'alloc>) {
+ }
+
+ fn visit_template_element(&mut self, ast: &'alloc TemplateElement) {
+ self.enter_template_element(ast);
+ self.leave_template_element(ast);
+ }
+
+ fn enter_template_element(&mut self, ast: &'alloc TemplateElement) {
+ }
+
+ fn leave_template_element(&mut self, ast: &'alloc TemplateElement) {
+ }
+
+ fn visit_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
+ self.enter_variable_declaration(ast);
+ self.visit_variable_declaration_kind(&ast.kind);
+ for item in &ast.declarators {
+ self.visit_variable_declarator(item);
+ }
+ self.leave_variable_declaration(ast);
+ }
+
+ fn enter_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
+ }
+
+ fn leave_variable_declaration(&mut self, ast: &'alloc VariableDeclaration<'alloc>) {
+ }
+
+ fn visit_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
+ self.enter_variable_declarator(ast);
+ self.visit_binding(&ast.binding);
+ if let Some(item) = &ast.init {
+ self.visit_expression(item);
+ }
+ self.leave_variable_declarator(ast);
+ }
+
+ fn enter_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
+ }
+
+ fn leave_variable_declarator(&mut self, ast: &'alloc VariableDeclarator<'alloc>) {
+ }
+
+ fn visit_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
+ self.enter_cover_parenthesized(ast);
+ match ast {
+ CoverParenthesized::Expression { expression, .. } => {
+ self.visit_enum_cover_parenthesized_variant_expression(
+ expression,
+ )
+ }
+ CoverParenthesized::Parameters(ast) => {
+ self.visit_enum_cover_parenthesized_variant_parameters(ast)
+ }
+ }
+ self.leave_cover_parenthesized(ast);
+ }
+
+ fn enter_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
+ }
+
+ fn leave_cover_parenthesized(&mut self, ast: &'alloc CoverParenthesized<'alloc>) {
+ }
+
+ fn visit_enum_cover_parenthesized_variant_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ self.enter_enum_cover_parenthesized_variant_expression(
+ expression,
+ );
+ self.visit_expression(expression);
+ self.leave_enum_cover_parenthesized_variant_expression(
+ expression,
+ );
+ }
+
+ fn enter_enum_cover_parenthesized_variant_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_cover_parenthesized_variant_expression(
+ &mut self,
+ expression: &'alloc arena::Box<'alloc, Expression<'alloc>>,
+ ) {
+ }
+
+ fn visit_enum_cover_parenthesized_variant_parameters(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
+ ) {
+ self.enter_enum_cover_parenthesized_variant_parameters(ast);
+ self.visit_formal_parameters(ast);
+ self.leave_enum_cover_parenthesized_variant_parameters(ast);
+ }
+
+ fn enter_enum_cover_parenthesized_variant_parameters(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
+ ) {
+ }
+
+ fn leave_enum_cover_parenthesized_variant_parameters(
+ &mut self,
+ ast: &'alloc arena::Box<'alloc, FormalParameters<'alloc>>,
+ ) {
+ }
+
+}
+