1
0
forked from VimPlug/jedi

finally removed self-contained iterator from Parser - after knowing this since almost the beginning.

This commit is contained in:
Dave Halter
2014-02-25 01:25:45 +01:00
parent a7a8a73a2c
commit 44d560c53a

View File

@@ -104,7 +104,7 @@ class Parser(object):
names = [] names = []
if pre_used_token is None: if pre_used_token is None:
tok = self.next() tok = next(self._gen)
if tok.type != tokenize.NAME and tok.string != '*': if tok.type != tokenize.NAME and tok.string != '*':
return [], tok # TODO the fuck, why []? return [], tok # TODO the fuck, why []?
else: else:
@@ -118,10 +118,10 @@ class Parser(object):
append((tok.string, first_pos)) append((tok.string, first_pos))
while True: while True:
end_pos = tok.end end_pos = tok.end
tok = self.next() tok = next(self._gen)
if tok.string != '.': if tok.string != '.':
break break
tok = self.next() tok = next(self._gen)
if tok.type != tokenize.NAME: if tok.type != tokenize.NAME:
break break
append((tok.string, tok.start)) append((tok.string, tok.start))
@@ -151,12 +151,12 @@ class Parser(object):
+ list(set(keyword.kwlist) - set(['as'])) + list(set(keyword.kwlist) - set(['as']))
while True: while True:
defunct = False defunct = False
tok = self.next() tok = next(self._gen)
if tok.string == '(': # python allows only one `(` in the statement. if tok.string == '(': # python allows only one `(` in the statement.
brackets = True brackets = True
tok = self.next() tok = next(self._gen)
if brackets and tok.string == '\n': if brackets and tok.string == '\n':
tok = self.next() tok = next(self._gen)
i, tok = self._parse_dot_name(tok) i, tok = self._parse_dot_name(tok)
if not i: if not i:
defunct = True defunct = True
@@ -165,7 +165,7 @@ class Parser(object):
name2, tok = self._parse_dot_name() name2, tok = self._parse_dot_name()
imports.append((i, name2, defunct)) imports.append((i, name2, defunct))
while tok.string not in continue_kw: while tok.string not in continue_kw:
tok = self.next() tok = next(self._gen)
if not (tok.string == "," or brackets and tok.string == '\n'): if not (tok.string == "," or brackets and tok.string == '\n'):
break break
return imports return imports
@@ -208,25 +208,25 @@ class Parser(object):
:rtype: Function :rtype: Function
""" """
first_pos = self._gen.current.start first_pos = self._gen.current.start
tok = self.next() tok = next(self._gen)
if tok.type != tokenize.NAME: if tok.type != tokenize.NAME:
return None return None
fname = pr.Name(self.module, [(tok.string, tok.start)], tok.start, fname = pr.Name(self.module, [(tok.string, tok.start)], tok.start,
tok.end) tok.end)
tok = self.next() tok = next(self._gen)
if tok.string != '(': if tok.string != '(':
return None return None
params = self._parse_parentheses() params = self._parse_parentheses()
colon = self.next() colon = next(self._gen)
annotation = None annotation = None
if colon.string in ['-', '->']: if colon.string in ['-', '->']:
# parse annotations # parse annotations
if colon.string == '-': if colon.string == '-':
# The Python 2 tokenizer doesn't understand this # The Python 2 tokenizer doesn't understand this
colon = self.next() colon = next(self._gen)
if colon.string != '>': if colon.string != '>':
return None return None
annotation, colon = self._parse_statement(added_breaks=[':']) annotation, colon = self._parse_statement(added_breaks=[':'])
@@ -246,7 +246,7 @@ class Parser(object):
:rtype: Class :rtype: Class
""" """
first_pos = self._gen.current.start first_pos = self._gen.current.start
cname = self.next() cname = next(self._gen)
if cname.type != tokenize.NAME: if cname.type != tokenize.NAME:
debug.warning("class: syntax err, token is not a name@%s (%s: %s)", debug.warning("class: syntax err, token is not a name@%s (%s: %s)",
cname.start[0], tokenize.tok_name[cname.type], cname.string) cname.start[0], tokenize.tok_name[cname.type], cname.string)
@@ -256,10 +256,10 @@ class Parser(object):
cname.start, cname.end) cname.start, cname.end)
super = [] super = []
_next = self.next() _next = next(self._gen)
if _next.string == '(': if _next.string == '(':
super = self._parse_parentheses() super = self._parse_parentheses()
_next = self.next() _next = next(self._gen)
if _next.string != ':': if _next.string != ':':
debug.warning("class syntax: %s@%s", cname, _next.start[0]) debug.warning("class syntax: %s@%s", cname, _next.start[0])
@@ -288,12 +288,12 @@ class Parser(object):
if pre_used_token: if pre_used_token:
tok = pre_used_token tok = pre_used_token
else: else:
tok = self.next() tok = next(self._gen)
while tok.type == tokenize.COMMENT: while tok.type == tokenize.COMMENT:
# remove newline and comment # remove newline and comment
self.next() next(self._gen)
tok = self.next() tok = next(self._gen)
first_pos = tok.start first_pos = tok.start
opening_brackets = ['{', '(', '['] opening_brackets = ['{', '(', '[']
@@ -321,7 +321,7 @@ class Parser(object):
token_pr.Token.from_tuple(self._gen.current) token_pr.Token.from_tuple(self._gen.current)
) )
if tok.string == 'as': if tok.string == 'as':
tok = self.next() tok = next(self._gen)
if tok.type == tokenize.NAME: if tok.type == tokenize.NAME:
n, tok = self._parse_dot_name(self._gen.current) n, tok = self._parse_dot_name(self._gen.current)
if n: if n:
@@ -345,7 +345,7 @@ class Parser(object):
elif tok.string in closing_brackets: elif tok.string in closing_brackets:
level -= 1 level -= 1
tok = self.next() tok = next(self._gen)
except (StopIteration, common.MultiLevelStopIteration): except (StopIteration, common.MultiLevelStopIteration):
# comes from tokenizer # comes from tokenizer
break break
@@ -385,21 +385,6 @@ class Parser(object):
self._gen.push_last_back() self._gen.push_last_back()
return stmt, tok return stmt, tok
def next(self):
return self.__next__()
def __iter__(self):
return self
def __next__(self):
""" Generate the next tokenize pattern. """
#typ, tok, start_pos, end_pos = next(self._gen)
_current = next(self._gen)
# dedents shouldn't change positions
#self._current = typ, tok
return _current
def _parse(self): def _parse(self):
""" """
The main part of the program. It analyzes the given code-text and The main part of the program. It analyzes the given code-text and
@@ -416,9 +401,7 @@ class Parser(object):
self._decorators = [] self._decorators = []
self.freshscope = True self.freshscope = True
# This iterator stuff is not intentional. It grew historically. for tok in self._gen:
self.iterator = iter(self)
for tok in self.iterator:
token_type = tok.type token_type = tok.type
tok_str = tok.string tok_str = tok.string
first_pos = tok.start first_pos = tok.start
@@ -483,7 +466,7 @@ class Parser(object):
# take care for relative imports # take care for relative imports
relative_count = 0 relative_count = 0
while True: while True:
tok = self.next() tok = next(self._gen)
if tok.string != '.': if tok.string != '.':
break break
relative_count += 1 relative_count += 1
@@ -648,6 +631,9 @@ class PushBackTokenizer(object):
self.current = next(self._tokenizer) self.current = next(self._tokenizer)
return self.current return self.current
def __iter__(self):
return self
@property @property
def previous(self): def previous(self):
return self._tokenizer.previous return self._tokenizer.previous