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 return scope
def _parse_statement(self, pre_used_token=None, added_breaks=None, 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:: Parses statements like::
@@ -409,7 +409,8 @@ class Parser(object):
stmt = stmt_class(self.module, set_vars, used_vars, tok_list, 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 stmt.parent = self.top_module
self._check_user_stmt(stmt) self._check_user_stmt(stmt)
@@ -572,7 +573,8 @@ class Parser(object):
self.freshscope = False self.freshscope = False
# loops # loops
elif tok == 'for': 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': if tok == 'in':
statement, tok = self._parse_statement() statement, tok = self._parse_statement()
if tok == ':': if tok == ':':

View File

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