1313 from .printer import PrintingVisitor
1414
1515
16- class Falsey (object ):
16+ class _Falsey (object ):
1717 def __nonzero__ (self ):
1818 return False
1919
@@ -22,15 +22,19 @@ def __bool__(self):
2222 return False
2323
2424
25- BREAK = object ()
26- REMOVE = Falsey ()
25+ class _Break (object ):
26+ pass
27+
28+
29+ BREAK = _Break ()
30+ REMOVE = _Falsey ()
2731
2832
2933class Stack (object ):
3034 __slots__ = "in_array" , "index" , "keys" , "edits" , "prev"
3135
3236 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
3438 self .in_array = in_array
3539 self .index = index
3640 self .keys = keys
@@ -46,7 +50,7 @@ def visit(root, visitor, key_map=None):
4650 in_array = isinstance (root , list )
4751 keys = [root ]
4852 index = - 1
49- edits = [] # type: List[Tuple[int, Any]]
53+ edits = [] # type: List[Tuple[Union[str, int] , Any]]
5054 parent = None # type: Optional[Node]
5155 path = [] # type: List
5256 ancestors = [] # type: List[Node]
@@ -75,7 +79,7 @@ def visit(root, visitor, key_map=None):
7579 edit_offset = 0
7680 for edit_key , edit_value in edits :
7781 if in_array :
78- edit_key -= edit_offset
82+ edit_key -= edit_offset # type: ignore
7983
8084 if in_array and edit_value is REMOVE :
8185 node .pop (edit_key ) # type: ignore
@@ -84,7 +88,6 @@ def visit(root, visitor, key_map=None):
8488 else :
8589 if isinstance (node , list ):
8690 node [edit_key ] = edit_value
87-
8891 else :
8992 setattr (node , edit_key , edit_value ) # type: ignore
9093
@@ -99,7 +102,6 @@ def visit(root, visitor, key_map=None):
99102 key = index if in_array else keys [index ]
100103 if isinstance (parent , list ):
101104 node = parent [key ]
102-
103105 else :
104106 node = getattr (parent , key , None )
105107
@@ -148,7 +150,11 @@ def visit(root, visitor, key_map=None):
148150 if not is_leaving :
149151 stack = Stack (in_array , index , keys , edits , stack )
150152 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
152158 index = - 1
153159 edits = []
154160
@@ -178,10 +184,11 @@ def enter(
178184 path , # type: List[Union[int, str]]
179185 ancestors , # type: List[Any]
180186 ):
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
183189 if method :
184190 return method (self , node , key , parent , path , ancestors )
191+ return None
185192
186193 def leave (
187194 self ,
@@ -191,10 +198,11 @@ def leave(
191198 path , # type: List[Union[int, str]]
192199 ancestors , # type: List[Any]
193200 ):
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
196203 if method :
197204 return method (self , node , key , parent , path , ancestors )
205+ return None
198206
199207
200208class ParallelVisitor (Visitor ):
@@ -203,7 +211,10 @@ class ParallelVisitor(Visitor):
203211 def __init__ (self , visitors ):
204212 # type: (List[Any]) -> None
205213 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
207218
208219 def enter (
209220 self ,
@@ -213,7 +224,7 @@ def enter(
213224 path , # type: List[Union[int, str]]
214225 ancestors , # type: List[Any]
215226 ):
216- # type: (...) -> Optional[ Any]
227+ # type: (...) -> Any
217228 for i , visitor in enumerate (self .visitors ):
218229 if not self .skipping [i ]:
219230 result = visitor .enter (node , key , parent , path , ancestors )
@@ -223,6 +234,7 @@ def enter(
223234 self .skipping [i ] = BREAK
224235 elif result is not None :
225236 return result
237+ return None
226238
227239 def leave (
228240 self ,
@@ -232,7 +244,7 @@ def leave(
232244 path , # type: List[Union[int, str]]
233245 ancestors , # type: List[Any]
234246 ):
235- # type: (...) -> Optional[ Any]
247+ # type: (...) -> Any
236248 for i , visitor in enumerate (self .visitors ):
237249 if not self .skipping [i ]:
238250 result = visitor .leave (node , key , parent , path , ancestors )
@@ -242,17 +254,14 @@ def leave(
242254 return result
243255 elif self .skipping [i ] == node :
244256 self .skipping [i ] = REMOVE
257+ return None
245258
246259
247260class TypeInfoVisitor (Visitor ):
248261 __slots__ = "visitor" , "type_info"
249262
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
256265 self .type_info = type_info
257266 self .visitor = visitor
258267
0 commit comments