Skip to content

Commit 8f7968e

Browse files
sjoerdjobvmuriart
authored andcommitted
Index-based token_idx_prev
Prevent some more calls to token_index in group_identifier_list. They are now all gone.
1 parent 67dc823 commit 8f7968e

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

sqlparse/engine/grouping.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,11 @@ def group_identifier_list(tlist):
166166

167167
tidx, token = tlist.token_idx_next_by(m=M_COMMA)
168168
while token:
169-
before, after = tlist.token_prev(tidx), tlist.token_next(tidx)
169+
before_idx, before = tlist.token_idx_prev(tidx)
170+
after = tlist.token_next(tidx)
170171

171172
if func(before) and func(after):
172-
tidx = tlist.token_index(before)
173+
tidx = before_idx
173174
token = tlist.group_tokens_between(sql.IdentifierList, tidx, after, extend=True)
174175

175176
tidx, token = tlist.token_idx_next_by(m=M_COMMA, idx=tidx + 1)

sqlparse/sql.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)