diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index b6ec7b49..ea76ed76 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -206,10 +206,10 @@ class Evaluator(object): # The string tokens are just operations (+, -, etc.) elif isinstance(element, compiled.CompiledObject): return [element] - elif not isinstance(element, Token): - return self.eval_call(element) - else: + elif isinstance(element, Token): return [] + else: + return self.eval_call(element) def eval_call(self, call): """Follow a call is following a function, variable, string, etc.""" @@ -219,7 +219,8 @@ class Evaluator(object): s = call while not s.parent.isinstance(pr.IsScope): s = s.parent - return self.eval_call_path(path, s.parent, s.start_pos) + par = s.parent + return self.eval_call_path(path, par, s.start_pos) def eval_call_path(self, path, scope, position): """ diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 5e3d7d60..315a6842 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -161,6 +161,9 @@ def scan_statement_for_calls(stmt, search_name, assignment_details=False): if s_new.execution is not None: result += scan_array(s_new.execution, search_name) s_new = s_new.next + elif isinstance(c, pr.ListComprehension): + for s in c.stmt, c.middle, c.input: + result += scan_statement_for_calls(s, search_name) return result diff --git a/test/completion/dynamic.py b/test/completion/dynamic.py index 50a4ea9d..7214af13 100644 --- a/test/completion/dynamic.py +++ b/test/completion/dynamic.py @@ -394,3 +394,13 @@ def third(): return list(b) #? third()[0] + +# ----------------- +# list comprehensions +# ----------------- + +def from_comprehension(foo): + #? float() + return foo + +[from_comprehension(1.0) for n in (1,)]