33 * @copyright 2017 Toru Nagashima. All rights reserved.
44 * See LICENSE file in root directory for full license.
55 */
6+ import Evk , { VisitorKeys } from "eslint-visitor-keys"
67import { Node } from "./nodes"
78
89//------------------------------------------------------------------------------
910// Helpers
1011//------------------------------------------------------------------------------
1112
12- type KeyMap = { [ key : string ] : string [ ] | undefined }
13-
14- const KEYS : KeyMap = {
15- AssignmentExpression : [ "left" , "right" ] ,
16- AssignmentPattern : [ "left" , "right" ] ,
17- ArrayExpression : [ "elements" ] ,
18- ArrayPattern : [ "elements" ] ,
19- ArrowFunctionExpression : [ "params" , "body" ] ,
20- AwaitExpression : [ "argument" ] ,
21- BlockStatement : [ "body" ] ,
22- BinaryExpression : [ "left" , "right" ] ,
23- BreakStatement : [ "label" ] ,
24- CallExpression : [ "callee" , "arguments" ] ,
25- CatchClause : [ "param" , "body" ] ,
26- ClassBody : [ "body" ] ,
27- ClassDeclaration : [ "id" , "superClass" , "body" ] ,
28- ClassExpression : [ "id" , "superClass" , "body" ] ,
29- ConditionalExpression : [ "test" , "consequent" , "alternate" ] ,
30- ContinueStatement : [ "label" ] ,
31- DebuggerStatement : [ ] ,
32- DirectiveStatement : [ ] ,
33- DoWhileStatement : [ "body" , "test" ] ,
34- EmptyStatement : [ ] ,
35- ExportAllDeclaration : [ "source" ] ,
36- ExportDefaultDeclaration : [ "declaration" ] ,
37- ExportNamedDeclaration : [ "declaration" , "specifiers" , "source" ] ,
38- ExportSpecifier : [ "exported" , "local" ] ,
39- ExpressionStatement : [ "expression" ] ,
40- ForStatement : [ "init" , "test" , "update" , "body" ] ,
41- ForInStatement : [ "left" , "right" , "body" ] ,
42- ForOfStatement : [ "left" , "right" , "body" ] ,
43- FunctionDeclaration : [ "id" , "params" , "body" ] ,
44- FunctionExpression : [ "id" , "params" , "body" ] ,
45- Identifier : [ ] ,
46- IfStatement : [ "test" , "consequent" , "alternate" ] ,
47- ImportDeclaration : [ "specifiers" , "source" ] ,
48- ImportDefaultSpecifier : [ "local" ] ,
49- ImportNamespaceSpecifier : [ "local" ] ,
50- ImportSpecifier : [ "imported" , "local" ] ,
51- Literal : [ ] ,
52- LabeledStatement : [ "label" , "body" ] ,
53- LogicalExpression : [ "left" , "right" ] ,
54- MemberExpression : [ "object" , "property" ] ,
55- MetaProperty : [ "meta" , "property" ] ,
56- MethodDefinition : [ "key" , "value" ] ,
57- ModuleSpecifier : [ ] ,
58- NewExpression : [ "callee" , "arguments" ] ,
59- ObjectExpression : [ "properties" ] ,
60- ObjectPattern : [ "properties" ] ,
61- Program : [ "body" ] ,
62- Property : [ "key" , "value" ] ,
63- RestElement : [ "argument" ] ,
64- ReturnStatement : [ "argument" ] ,
65- SequenceExpression : [ "expressions" ] ,
66- SpreadElement : [ "argument" ] ,
67- Super : [ ] ,
68- SwitchStatement : [ "discriminant" , "cases" ] ,
69- SwitchCase : [ "test" , "consequent" ] ,
70- TaggedTemplateExpression : [ "tag" , "quasi" ] ,
71- TemplateElement : [ ] ,
72- TemplateLiteral : [ "quasis" , "expressions" ] ,
73- ThisExpression : [ ] ,
74- ThrowStatement : [ "argument" ] ,
75- TryStatement : [ "block" , "handler" , "finalizer" ] ,
76- UnaryExpression : [ "argument" ] ,
77- UpdateExpression : [ "argument" ] ,
78- VariableDeclaration : [ "declarations" ] ,
79- VariableDeclarator : [ "id" , "init" ] ,
80- WhileStatement : [ "test" , "body" ] ,
81- WithStatement : [ "object" , "body" ] ,
82- YieldExpression : [ "argument" ] ,
83-
84- // Legacy
85- RestProperty : [ "argument" ] ,
86- ExperimentalRestProperty : [ "argument" ] ,
87- SpreadProperty : [ "argument" ] ,
88- ExperimentalSpreadProperty : [ "argument" ] ,
89-
90- // JSX
91- JSXIdentifier : [ ] ,
92- JSXMemberExpression : [ "object" , "property" ] ,
93- JSXNamespacedName : [ "namespace" , "name" ] ,
94- JSXEmptyExpression : [ ] ,
95- JSXExpressionContainer : [ "expression" ] ,
96- JSXSpreadChild : [ "expression" ] ,
97- JSXOpeningElement : [ "name" , "attributes" ] ,
98- JSXClosingElement : [ "name" ] ,
99- JSXAttribute : [ "name" , "value" ] ,
100- JSXSpreadAttribute : [ "argument" ] ,
101- JSXText : [ ] ,
102- JSXElement : [ "openingElement" , "children" , "closingElement" ] ,
103-
104- // Vue.js
13+ const KEYS = Evk . unionWith ( {
10514 VAttribute : [ "key" , "value" ] ,
10615 VDirectiveKey : [ ] ,
10716 VDocumentFragment : [ "children" ] ,
@@ -114,7 +23,7 @@ const KEYS: KeyMap = {
11423 VOnExpression : [ "body" ] ,
11524 VStartTag : [ "attributes" ] ,
11625 VText : [ ] ,
117- }
26+ } )
11827
11928/**
12029 * Check that the given key should be traversed or not.
@@ -159,7 +68,7 @@ function traverse(node: Node, parent: Node | null, visitor: Visitor) {
15968
16069 visitor . enterNode ( node , parent )
16170
162- const keys = KEYS [ node . type ] || getFallbackKeys ( node )
71+ const keys = ( visitor . visitorKeys || KEYS ) [ node . type ] || getFallbackKeys ( node )
16372 for ( i = 0 ; i < keys . length ; ++ i ) {
16473 const child = ( node as any ) [ keys [ i ] ]
16574
@@ -183,6 +92,7 @@ function traverse(node: Node, parent: Node | null, visitor: Visitor) {
18392//------------------------------------------------------------------------------
18493
18594export interface Visitor {
95+ visitorKeys ?: VisitorKeys
18696 enterNode ( node : Node , parent : Node | null ) : void
18797 leaveNode ( node : Node , parent : Node | null ) : void
18898}
0 commit comments