diff --git a/jedi/parsing.py b/jedi/parsing.py index 99de9bb1..7b901275 100644 --- a/jedi/parsing.py +++ b/jedi/parsing.py @@ -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 == ':': diff --git a/jedi/parsing_representation.py b/jedi/parsing_representation.py index 381f20b8..e7abe932 100644 --- a/jedi/parsing_representation.py +++ b/jedi/parsing_representation.py @@ -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...)