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;
 |