1
0
forked from VimPlug/jedi

add a names_are_set_vars variable to statement

This commit is contained in:
David Halter
2013-09-03 01:01:46 +04:30
parent 1fa5d34878
commit 31d992207c
2 changed files with 17 additions and 11 deletions

View File

@@ -300,7 +300,7 @@ class Parser(object):
return scope
def _parse_statement(self, pre_used_token=None, added_breaks=None,
stmt_class=pr.Statement):
stmt_class=pr.Statement, names_are_set_vars=False):
"""
Parses statements like::
@@ -409,7 +409,8 @@ class Parser(object):
stmt = stmt_class(self.module, set_vars, used_vars, tok_list,
first_pos, self.end_pos, as_names=as_names)
first_pos, self.end_pos, as_names=as_names,
names_are_set_vars=names_are_set_vars)
stmt.parent = self.top_module
self._check_user_stmt(stmt)
@@ -572,7 +573,8 @@ class Parser(object):
self.freshscope = False
# loops
elif tok == 'for':
set_stmt, tok = self._parse_statement(added_breaks=['in'])
set_stmt, tok = self._parse_statement(added_breaks=['in'],
names_are_set_vars=True)
if tok == 'in':
statement, tok = self._parse_statement()
if tok == ':':

View File

@@ -638,7 +638,7 @@ class ForFlow(Flow):
set_stmt.parent = self.use_as_parent
self.is_list_comp = is_list_comp
self.set_vars = [t for t in set_stmt.token_list if isinstance(t, Name)]
self.set_vars = set_stmt.get_set_vars()
for s in self.set_vars:
s.parent.parent = self.use_as_parent
s.parent = self.use_as_parent
@@ -755,13 +755,15 @@ class Statement(Simple):
"""
__slots__ = ('token_list', '_used_vars',
'_set_vars', 'as_names', '_commands', '_assignment_details',
'docstr')
'docstr', '_names_are_set_vars')
def __init__(self, module, set_vars, used_vars, token_list,
start_pos, end_pos, parent=None, as_names=(), set_name_parents=True):
start_pos, end_pos, parent=None, as_names=(),
names_are_set_vars=False, set_name_parents=True):
super(Statement, self).__init__(module, start_pos, end_pos)
self._used_vars = used_vars
self.token_list = token_list
self._names_are_set_vars = names_are_set_vars
if set_name_parents:
for t in token_list:
if isinstance(t, Name):
@@ -820,7 +822,7 @@ class Statement(Simple):
for calls, operation in self.assignment_details:
search_calls(calls)
if not self.assignment_details and isinstance(self, Param):
if not self.assignment_details and self._names_are_set_vars:
# In the case of Param, it's also a defining name without ``=``
search_calls(self.get_commands())
return self._set_vars + self.as_names
@@ -985,7 +987,8 @@ class Statement(Simple):
return lambd, tok
def parse_list_comp(token_iterator, token_list, start_pos, end_pos):
def parse_stmt_or_arr(token_iterator, added_breaks=()):
def parse_stmt_or_arr(token_iterator, added_breaks=(),
names_are_set_vars=False):
stmt, tok = parse_stmt(token_iterator,
added_breaks=added_breaks)
if not stmt:
@@ -1006,13 +1009,13 @@ class Statement(Simple):
for t in stmt.token_list:
if isinstance(t, Name):
t.parent = stmt
stmt._names_are_set_vars = names_are_set_vars
return stmt, tok
st = Statement(self._sub_module, [], [], token_list, start_pos,
end_pos, set_name_parents=False)
middle, tok = parse_stmt_or_arr(token_iterator,
added_breaks=['in'])
middle, tok = parse_stmt_or_arr(token_iterator, ['in'], True)
if tok != 'in' or middle is None:
debug.warning('list comprehension middle @%s' % str(start_pos))
return None, tok
@@ -1127,7 +1130,8 @@ class Param(Statement):
'parent_function')
def __init__(self, *args, **kwargs):
super(Param, self).__init__(*args, **kwargs)
kwargs.pop('names_are_set_vars', None)
super(Param, self).__init__(*args, names_are_set_vars=True, **kwargs)
# this is defined by the parser later on, not at the initialization
# it is the position in the call (first argument, second...)