diff --git a/jedi/api/completion.py b/jedi/api/completion.py index e4fdc32f..71e3e10c 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -179,9 +179,11 @@ class Completion: scope = get_user_scope(self._module, self._position) if not scope.is_scope(): # Might be a flow (if/while/etc). scope = scope.get_parent_scope() + scope = self._evaluator.wrap(scope) + debug.dbg('global completion scope: %s', scope) names_dicts = global_names_dict_generator( self._evaluator, - self._evaluator.wrap(scope), + scope, self._position ) completion_names = [] diff --git a/jedi/api/interpreter.py b/jedi/api/interpreter.py index 90375676..93a50e78 100644 --- a/jedi/api/interpreter.py +++ b/jedi/api/interpreter.py @@ -22,6 +22,7 @@ from jedi.evaluate.compiled import mixed class MixedModule(object): resets_positions = True + type = 'mixed_module' def __init__(self, evaluator, parser_module, namespaces): self._evaluator = evaluator diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index 554e9871..864d90f6 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -235,7 +235,12 @@ class NameFinder(object): """ for n in names: definition = n.parent - if isinstance(definition, (tree.Function, tree.Class, tree.Module)): + if isinstance(definition, (compiled.CompiledObject, + iterable.BuiltinMethod)): + # TODO this if should really be removed by changing the type of + # those classes. + yield n + elif definition.type in ('funcdef', 'classdef', 'file_input'): yield self._evaluator.wrap(definition).name else: yield n diff --git a/test/test_api/test_interpreter.py b/test/test_api/test_interpreter.py index 7b744d22..eb5b5865 100644 --- a/test/test_api/test_interpreter.py +++ b/test/test_api/test_interpreter.py @@ -59,7 +59,8 @@ def test_side_effect_completion(): _GlobalNameSpace.SideEffectContainer.foo = 1 side_effect = get_completion('SideEffectContainer', _GlobalNameSpace.__dict__) - assert isinstance(side_effect._definition, mixed.MixedObject) + # It's a class that contains MixedObject. + assert isinstance(side_effect._definition.base, mixed.MixedObject) foo = get_completion('SideEffectContainer.foo', _GlobalNameSpace.__dict__) assert foo.name == 'foo'