@@ -233,12 +233,18 @@ def _token_idx_matching(self, funcs, start=0, end=None, reverse=False):
233233 if not isinstance (funcs , (list , tuple )):
234234 funcs = (funcs ,)
235235
236- iterable = enumerate (self .tokens [start :end ], start = start )
237-
238- for idx , token in iterable :
239- for func in funcs :
240- if func (token ):
241- return idx , token
236+ if reverse :
237+ assert end is None
238+ for idx in range (start - 2 , - 1 , - 1 ):
239+ token = self .tokens [idx ]
240+ for func in funcs :
241+ if func (token ):
242+ return idx , token
243+ else :
244+ for idx , token in enumerate (self .tokens [start :end ], start = start ):
245+ for func in funcs :
246+ if func (token ):
247+ return idx , token
242248 return None , None
243249
244250 def _token_matching (self , funcs , start = 0 , end = None , reverse = False ):
@@ -312,6 +318,16 @@ def token_not_matching(self, idx, funcs):
312318 def token_matching (self , idx , funcs ):
313319 return self ._token_matching (funcs , idx )
314320
321+ def token_idx_prev (self , idx , skip_ws = True ):
322+ """Returns the previous token relative to *idx*.
323+
324+ If *skip_ws* is ``True`` (the default) whitespace tokens are ignored.
325+ ``None`` is returned if there's no previous token.
326+ """
327+ idx += 1 # alot of code usage current pre-compensates for this
328+ funcs = lambda tk : not (tk .is_whitespace () and skip_ws )
329+ return self ._token_idx_matching (funcs , idx , reverse = True )
330+
315331 def token_prev (self , idx , skip_ws = True ):
316332 """Returns the previous token relative to *idx*.
317333
0 commit comments