316 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @type {VisitorKeys}
 | |
|  */
 | |
| const KEYS = {
 | |
|     ArrayExpression: [
 | |
|         "elements"
 | |
|     ],
 | |
|     ArrayPattern: [
 | |
|         "elements"
 | |
|     ],
 | |
|     ArrowFunctionExpression: [
 | |
|         "params",
 | |
|         "body"
 | |
|     ],
 | |
|     AssignmentExpression: [
 | |
|         "left",
 | |
|         "right"
 | |
|     ],
 | |
|     AssignmentPattern: [
 | |
|         "left",
 | |
|         "right"
 | |
|     ],
 | |
|     AwaitExpression: [
 | |
|         "argument"
 | |
|     ],
 | |
|     BinaryExpression: [
 | |
|         "left",
 | |
|         "right"
 | |
|     ],
 | |
|     BlockStatement: [
 | |
|         "body"
 | |
|     ],
 | |
|     BreakStatement: [
 | |
|         "label"
 | |
|     ],
 | |
|     CallExpression: [
 | |
|         "callee",
 | |
|         "arguments"
 | |
|     ],
 | |
|     CatchClause: [
 | |
|         "param",
 | |
|         "body"
 | |
|     ],
 | |
|     ChainExpression: [
 | |
|         "expression"
 | |
|     ],
 | |
|     ClassBody: [
 | |
|         "body"
 | |
|     ],
 | |
|     ClassDeclaration: [
 | |
|         "id",
 | |
|         "superClass",
 | |
|         "body"
 | |
|     ],
 | |
|     ClassExpression: [
 | |
|         "id",
 | |
|         "superClass",
 | |
|         "body"
 | |
|     ],
 | |
|     ConditionalExpression: [
 | |
|         "test",
 | |
|         "consequent",
 | |
|         "alternate"
 | |
|     ],
 | |
|     ContinueStatement: [
 | |
|         "label"
 | |
|     ],
 | |
|     DebuggerStatement: [],
 | |
|     DoWhileStatement: [
 | |
|         "body",
 | |
|         "test"
 | |
|     ],
 | |
|     EmptyStatement: [],
 | |
|     ExperimentalRestProperty: [
 | |
|         "argument"
 | |
|     ],
 | |
|     ExperimentalSpreadProperty: [
 | |
|         "argument"
 | |
|     ],
 | |
|     ExportAllDeclaration: [
 | |
|         "exported",
 | |
|         "source"
 | |
|     ],
 | |
|     ExportDefaultDeclaration: [
 | |
|         "declaration"
 | |
|     ],
 | |
|     ExportNamedDeclaration: [
 | |
|         "declaration",
 | |
|         "specifiers",
 | |
|         "source"
 | |
|     ],
 | |
|     ExportSpecifier: [
 | |
|         "exported",
 | |
|         "local"
 | |
|     ],
 | |
|     ExpressionStatement: [
 | |
|         "expression"
 | |
|     ],
 | |
|     ForInStatement: [
 | |
|         "left",
 | |
|         "right",
 | |
|         "body"
 | |
|     ],
 | |
|     ForOfStatement: [
 | |
|         "left",
 | |
|         "right",
 | |
|         "body"
 | |
|     ],
 | |
|     ForStatement: [
 | |
|         "init",
 | |
|         "test",
 | |
|         "update",
 | |
|         "body"
 | |
|     ],
 | |
|     FunctionDeclaration: [
 | |
|         "id",
 | |
|         "params",
 | |
|         "body"
 | |
|     ],
 | |
|     FunctionExpression: [
 | |
|         "id",
 | |
|         "params",
 | |
|         "body"
 | |
|     ],
 | |
|     Identifier: [],
 | |
|     IfStatement: [
 | |
|         "test",
 | |
|         "consequent",
 | |
|         "alternate"
 | |
|     ],
 | |
|     ImportDeclaration: [
 | |
|         "specifiers",
 | |
|         "source"
 | |
|     ],
 | |
|     ImportDefaultSpecifier: [
 | |
|         "local"
 | |
|     ],
 | |
|     ImportExpression: [
 | |
|         "source"
 | |
|     ],
 | |
|     ImportNamespaceSpecifier: [
 | |
|         "local"
 | |
|     ],
 | |
|     ImportSpecifier: [
 | |
|         "imported",
 | |
|         "local"
 | |
|     ],
 | |
|     JSXAttribute: [
 | |
|         "name",
 | |
|         "value"
 | |
|     ],
 | |
|     JSXClosingElement: [
 | |
|         "name"
 | |
|     ],
 | |
|     JSXClosingFragment: [],
 | |
|     JSXElement: [
 | |
|         "openingElement",
 | |
|         "children",
 | |
|         "closingElement"
 | |
|     ],
 | |
|     JSXEmptyExpression: [],
 | |
|     JSXExpressionContainer: [
 | |
|         "expression"
 | |
|     ],
 | |
|     JSXFragment: [
 | |
|         "openingFragment",
 | |
|         "children",
 | |
|         "closingFragment"
 | |
|     ],
 | |
|     JSXIdentifier: [],
 | |
|     JSXMemberExpression: [
 | |
|         "object",
 | |
|         "property"
 | |
|     ],
 | |
|     JSXNamespacedName: [
 | |
|         "namespace",
 | |
|         "name"
 | |
|     ],
 | |
|     JSXOpeningElement: [
 | |
|         "name",
 | |
|         "attributes"
 | |
|     ],
 | |
|     JSXOpeningFragment: [],
 | |
|     JSXSpreadAttribute: [
 | |
|         "argument"
 | |
|     ],
 | |
|     JSXSpreadChild: [
 | |
|         "expression"
 | |
|     ],
 | |
|     JSXText: [],
 | |
|     LabeledStatement: [
 | |
|         "label",
 | |
|         "body"
 | |
|     ],
 | |
|     Literal: [],
 | |
|     LogicalExpression: [
 | |
|         "left",
 | |
|         "right"
 | |
|     ],
 | |
|     MemberExpression: [
 | |
|         "object",
 | |
|         "property"
 | |
|     ],
 | |
|     MetaProperty: [
 | |
|         "meta",
 | |
|         "property"
 | |
|     ],
 | |
|     MethodDefinition: [
 | |
|         "key",
 | |
|         "value"
 | |
|     ],
 | |
|     NewExpression: [
 | |
|         "callee",
 | |
|         "arguments"
 | |
|     ],
 | |
|     ObjectExpression: [
 | |
|         "properties"
 | |
|     ],
 | |
|     ObjectPattern: [
 | |
|         "properties"
 | |
|     ],
 | |
|     PrivateIdentifier: [],
 | |
|     Program: [
 | |
|         "body"
 | |
|     ],
 | |
|     Property: [
 | |
|         "key",
 | |
|         "value"
 | |
|     ],
 | |
|     PropertyDefinition: [
 | |
|         "key",
 | |
|         "value"
 | |
|     ],
 | |
|     RestElement: [
 | |
|         "argument"
 | |
|     ],
 | |
|     ReturnStatement: [
 | |
|         "argument"
 | |
|     ],
 | |
|     SequenceExpression: [
 | |
|         "expressions"
 | |
|     ],
 | |
|     SpreadElement: [
 | |
|         "argument"
 | |
|     ],
 | |
|     StaticBlock: [
 | |
|         "body"
 | |
|     ],
 | |
|     Super: [],
 | |
|     SwitchCase: [
 | |
|         "test",
 | |
|         "consequent"
 | |
|     ],
 | |
|     SwitchStatement: [
 | |
|         "discriminant",
 | |
|         "cases"
 | |
|     ],
 | |
|     TaggedTemplateExpression: [
 | |
|         "tag",
 | |
|         "quasi"
 | |
|     ],
 | |
|     TemplateElement: [],
 | |
|     TemplateLiteral: [
 | |
|         "quasis",
 | |
|         "expressions"
 | |
|     ],
 | |
|     ThisExpression: [],
 | |
|     ThrowStatement: [
 | |
|         "argument"
 | |
|     ],
 | |
|     TryStatement: [
 | |
|         "block",
 | |
|         "handler",
 | |
|         "finalizer"
 | |
|     ],
 | |
|     UnaryExpression: [
 | |
|         "argument"
 | |
|     ],
 | |
|     UpdateExpression: [
 | |
|         "argument"
 | |
|     ],
 | |
|     VariableDeclaration: [
 | |
|         "declarations"
 | |
|     ],
 | |
|     VariableDeclarator: [
 | |
|         "id",
 | |
|         "init"
 | |
|     ],
 | |
|     WhileStatement: [
 | |
|         "test",
 | |
|         "body"
 | |
|     ],
 | |
|     WithStatement: [
 | |
|         "object",
 | |
|         "body"
 | |
|     ],
 | |
|     YieldExpression: [
 | |
|         "argument"
 | |
|     ]
 | |
| };
 | |
| 
 | |
| // Types.
 | |
| const NODE_TYPES = Object.keys(KEYS);
 | |
| 
 | |
| // Freeze the keys.
 | |
| for (const type of NODE_TYPES) {
 | |
|     Object.freeze(KEYS[type]);
 | |
| }
 | |
| Object.freeze(KEYS);
 | |
| 
 | |
| export default KEYS;
 |