13
13
from .printer import PrintingVisitor
14
14
15
15
16
- class Falsey (object ):
16
+ class _Falsey (object ):
17
17
def __nonzero__ (self ):
18
18
return False
19
19
@@ -22,15 +22,19 @@ def __bool__(self):
22
22
return False
23
23
24
24
25
- BREAK = object ()
26
- REMOVE = Falsey ()
25
+ class _Break (object ):
26
+ pass
27
+
28
+
29
+ BREAK = _Break ()
30
+ REMOVE = _Falsey ()
27
31
28
32
29
33
class Stack (object ):
30
34
__slots__ = "in_array" , "index" , "keys" , "edits" , "prev"
31
35
32
36
def __init__ (self , in_array , index , keys , edits , prev ):
33
- # type: (bool, int, Any, List[Tuple[str, str ]], Optional[Stack]) -> None
37
+ # type: (bool, int, Any, List[Tuple[Union[ str, int], Any ]], Optional[Stack]) -> None
34
38
self .in_array = in_array
35
39
self .index = index
36
40
self .keys = keys
@@ -46,7 +50,7 @@ def visit(root, visitor, key_map=None):
46
50
in_array = isinstance (root , list )
47
51
keys = [root ]
48
52
index = - 1
49
- edits = [] # type: List[Tuple[int, Any]]
53
+ edits = [] # type: List[Tuple[Union[str, int] , Any]]
50
54
parent = None # type: Optional[Node]
51
55
path = [] # type: List
52
56
ancestors = [] # type: List[Node]
@@ -75,7 +79,7 @@ def visit(root, visitor, key_map=None):
75
79
edit_offset = 0
76
80
for edit_key , edit_value in edits :
77
81
if in_array :
78
- edit_key -= edit_offset
82
+ edit_key -= edit_offset # type: ignore
79
83
80
84
if in_array and edit_value is REMOVE :
81
85
node .pop (edit_key ) # type: ignore
@@ -84,7 +88,6 @@ def visit(root, visitor, key_map=None):
84
88
else :
85
89
if isinstance (node , list ):
86
90
node [edit_key ] = edit_value
87
-
88
91
else :
89
92
setattr (node , edit_key , edit_value ) # type: ignore
90
93
@@ -99,7 +102,6 @@ def visit(root, visitor, key_map=None):
99
102
key = index if in_array else keys [index ]
100
103
if isinstance (parent , list ):
101
104
node = parent [key ]
102
-
103
105
else :
104
106
node = getattr (parent , key , None )
105
107
@@ -148,7 +150,11 @@ def visit(root, visitor, key_map=None):
148
150
if not is_leaving :
149
151
stack = Stack (in_array , index , keys , edits , stack )
150
152
in_array = isinstance (node , list )
151
- keys = node if in_array else visitor_keys .get (type (node ), None ) or []
153
+ keys = (
154
+ node
155
+ if in_array
156
+ else visitor_keys .get (type (node ), None ) or [] # type: ignore
157
+ ) # type: ignore
152
158
index = - 1
153
159
edits = []
154
160
@@ -178,10 +184,11 @@ def enter(
178
184
path , # type: List[Union[int, str]]
179
185
ancestors , # type: List[Any]
180
186
):
181
- # type: (...) -> Optional[ Any]
182
- method = self ._get_enter_handler (type (node ))
187
+ # type: (...) -> Any
188
+ method = self ._get_enter_handler (type (node )) # type: ignore
183
189
if method :
184
190
return method (self , node , key , parent , path , ancestors )
191
+ return None
185
192
186
193
def leave (
187
194
self ,
@@ -191,10 +198,11 @@ def leave(
191
198
path , # type: List[Union[int, str]]
192
199
ancestors , # type: List[Any]
193
200
):
194
- # type: (...) -> Optional[ Any]
195
- method = self ._get_leave_handler (type (node ))
201
+ # type: (...) -> Any
202
+ method = self ._get_leave_handler (type (node )) # type: ignore
196
203
if method :
197
204
return method (self , node , key , parent , path , ancestors )
205
+ return None
198
206
199
207
200
208
class ParallelVisitor (Visitor ):
@@ -203,7 +211,10 @@ class ParallelVisitor(Visitor):
203
211
def __init__ (self , visitors ):
204
212
# type: (List[Any]) -> None
205
213
self .visitors = visitors
206
- self .skipping = [None ] * len (visitors )
214
+ self .skipping = [None ] * len (
215
+ visitors
216
+ ) # type: List[Union[Node, _Break, _Falsey, None]]
217
+ return None
207
218
208
219
def enter (
209
220
self ,
@@ -213,7 +224,7 @@ def enter(
213
224
path , # type: List[Union[int, str]]
214
225
ancestors , # type: List[Any]
215
226
):
216
- # type: (...) -> Optional[ Any]
227
+ # type: (...) -> Any
217
228
for i , visitor in enumerate (self .visitors ):
218
229
if not self .skipping [i ]:
219
230
result = visitor .enter (node , key , parent , path , ancestors )
@@ -223,6 +234,7 @@ def enter(
223
234
self .skipping [i ] = BREAK
224
235
elif result is not None :
225
236
return result
237
+ return None
226
238
227
239
def leave (
228
240
self ,
@@ -232,7 +244,7 @@ def leave(
232
244
path , # type: List[Union[int, str]]
233
245
ancestors , # type: List[Any]
234
246
):
235
- # type: (...) -> Optional[ Any]
247
+ # type: (...) -> Any
236
248
for i , visitor in enumerate (self .visitors ):
237
249
if not self .skipping [i ]:
238
250
result = visitor .leave (node , key , parent , path , ancestors )
@@ -242,17 +254,14 @@ def leave(
242
254
return result
243
255
elif self .skipping [i ] == node :
244
256
self .skipping [i ] = REMOVE
257
+ return None
245
258
246
259
247
260
class TypeInfoVisitor (Visitor ):
248
261
__slots__ = "visitor" , "type_info"
249
262
250
- def __init__ (
251
- self ,
252
- type_info , # type: TypeInfo
253
- visitor , # type: Union[TestVisitor, ParallelVisitor, UsageVisitor]
254
- ):
255
- # type: (...) -> None
263
+ def __init__ (self , type_info , visitor ):
264
+ # type: (TypeInfo, Visitor) -> None
256
265
self .type_info = type_info
257
266
self .visitor = visitor
258
267
0 commit comments