diff --git a/jedi/api/completion.py b/jedi/api/completion.py index f4704974..672fbeb9 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -52,6 +52,7 @@ def get_user_scope(module_context, position): Returns the scope in which the user resides. This includes flows. """ user_stmt = module_context.module_node.get_statement_for_position(position) + evaluator = module_context.evaluator if user_stmt is None: def scan(scope): for s in scope.children: @@ -62,9 +63,17 @@ def get_user_scope(module_context, position): return scan(s) return None - return scan(module) or module_context + scanned_node = scan(module_context.module_node) + if scanned_node: + return evaluator.create_context(module_context, scanned_node) + return module_context else: - return user_stmt.get_parent_scope(include_flows=True) + scope_node = user_stmt.get_parent_scope(include_flows=True) + return evaluator.create_context(module_context, scope_node) + + # TODO need something like this in this func? + #if not context.is_scope(): # Might be a flow (if/while/etc). + #context = context.get_parent_scope() class Completion: @@ -172,16 +181,13 @@ class Completion: yield keywords.keyword(self._evaluator, k).name def _global_completions(self): - scope = get_user_scope(self._module_context, self._position) - if not scope.is_scope(): # Might be a flow (if/while/etc). - scope = scope.get_parent_scope() - scope = self._evaluator.create_context(self._module_context, scope) - debug.dbg('global completion scope: %s', scope) + context = get_user_scope(self._module_context, self._position) + debug.dbg('global completion scope: %s', context) filters = get_global_filters( self._evaluator, - scope, + context, self._position, - origin_scope=scope + origin_scope=context ) completion_names = [] for filter in filters: @@ -189,13 +195,13 @@ class Completion: return completion_names def _trailer_completions(self, atom_expr): - user_scope = get_user_scope(self._module_context, self._position) + user_context = get_user_scope(self._module_context, self._position) evaluation_context = self._evaluator.create_context(self._module_context, atom_expr) contexts = self._evaluator.eval_element(evaluation_context, atom_expr) completion_names = [] debug.dbg('trailer completion contexts: %s', contexts) for context in contexts: - for filter in context.get_filters(search_global=False, origin_scope=user_scope): + for filter in context.get_filters(search_global=False, origin_scope=user_context): completion_names += filter.values() return completion_names diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index 37919d65..dce94830 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -377,8 +377,11 @@ def _name_to_types(evaluator, context, name, scope): # TODO an exception can also be a tuple. Check for those. # TODO check for types that are not classes and add it to # the static analysis report. - exceptions = evaluator.eval_element(name.get_previous_sibling().get_previous_sibling()) - types = set(chain.from_iterable(evaluator.execute(t) for t in exceptions)) + exceptions = context.eval_node(name.get_previous_sibling().get_previous_sibling()) + types = unite( + evaluator.execute(t, param.ValuesArguments([])) + for t in exceptions + ) else: raise DeprecationWarning types = set([node]) diff --git a/test/run.py b/test/run.py index d89bba61..c998f1a9 100755 --- a/test/run.py +++ b/test/run.py @@ -191,11 +191,8 @@ class IntegrationTestCase(object): parser.get_root_node().move(self.line_nr) element = parser.get_parsed_node() module_context = script._get_module() - # TODO remove - element.parent = jedi.api.completion.get_user_scope( - module_context, - (self.line_nr, self.column) - ) + # The context shouldn't matter for the test results. + element.parent = module_context.module_node results = evaluator.eval_element(module_context, element) if not results: raise Exception('Could not resolve %s on line %s'