@@ -448,43 +448,52 @@ def get_enter_leave_for_kind(self, kind: str) -> EnterLeaveVisitor:
448448 return self .enter_leave_map [kind ]
449449 except KeyError :
450450 has_visitor = False
451- enter_list : list [Callable [..., VisitorAction | None ] | None ] = []
452- leave_list : list [Callable [..., VisitorAction | None ] | None ] = []
453- for visitor in self .visitors :
451+ enter_list : list [
452+ tuple [int , Callable [..., VisitorAction | None ] | None ]
453+ ] = []
454+ leave_list : list [
455+ tuple [int , Callable [..., VisitorAction | None ] | None ]
456+ ] = []
457+ for i , visitor in enumerate (self .visitors ):
454458 enter , leave = visitor .get_enter_leave_for_kind (kind )
455459 if not has_visitor and (enter or leave ):
456460 has_visitor = True
457- enter_list .append (enter )
458- leave_list .append (leave )
461+ enter_list .append ((i , enter ))
462+ leave_list .append ((i , leave ))
463+
464+ enter_pairs = tuple (enter_list )
465+ leave_pairs = tuple (leave_list )
459466
460467 if has_visitor :
461468
462469 def enter (node : Node , * args : Any ) -> VisitorAction | None :
463470 skipping = self .skipping
464- for i , fn in enumerate (enter_list ):
471+ args = (node , * args )
472+ for i , fn in enter_pairs :
465473 if not skipping [i ] and fn :
466- result = fn (node , * args )
474+ result = fn (* args )
475+ if result is None :
476+ continue
467477 if result is SKIP or result is False :
468478 skipping [i ] = node
469479 elif result is BREAK or result is True :
470480 skipping [i ] = BREAK
471- elif result is not None :
481+ else :
472482 return result
473483 return None
474484
475485 def leave (node : Node , * args : Any ) -> VisitorAction | None :
476486 skipping = self .skipping
477- for i , fn in enumerate (leave_list ):
487+ args = (node , * args )
488+ for i , fn in leave_pairs :
478489 if not skipping [i ]:
479490 if fn :
480- result = fn (node , * args )
491+ result = fn (* args )
492+ if result is None :
493+ continue
481494 if result is BREAK or result is True :
482495 skipping [i ] = BREAK
483- elif (
484- result is not None
485- and result is not SKIP
486- and result is not False
487- ):
496+ elif result is not SKIP and result is not False :
488497 return result
489498 elif skipping [i ] is node :
490499 skipping [i ] = None
0 commit comments