diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index bc32e8ed..9199c7e7 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -476,6 +476,7 @@ def _a_generator(foo): _SPECIAL_OBJECTS = { 'FUNCTION_CLASS': type(load_module), + 'METHOD_CLASS': type(CompiledObject.is_class), 'MODULE_CLASS': type(os), 'GENERATOR_OBJECT': _a_generator(1.0), 'BUILTINS': _builtins, diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 4502d10f..8f3d642c 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -579,7 +579,7 @@ class Function(use_metaclass(CachedMetaClass, Wrapper)): if search_global: yield self.names_dict else: - scope = compiled.get_special_object(self._evaluator, 'FUNCTION_CLASS') + scope = self.py__class__() for names_dict in scope.names_dicts(False): yield names_dict @@ -605,7 +605,13 @@ class Function(use_metaclass(CachedMetaClass, Wrapper)): return dct def py__class__(self): - return compiled.get_special_object(self._evaluator, 'FUNCTION_CLASS') + # This differentiation is only necessary for Python2. Python3 does not + # use a different method class. + if isinstance(self.base.get_parent_scope(), tree.Class): + name = 'METHOD_CLASS' + else: + name = 'FUNCTION_CLASS' + return compiled.get_special_object(self._evaluator, name) def __getattr__(self, name): return getattr(self.base_func, name) diff --git a/test/test_evaluate/test_compiled.py b/test/test_evaluate/test_compiled.py index 7efe64d6..762260e4 100644 --- a/test/test_evaluate/test_compiled.py +++ b/test/test_evaluate/test_compiled.py @@ -1,3 +1,5 @@ +from textwrap import dedent + from jedi._compatibility import builtins, is_py3 from jedi.parser import load_grammar from jedi.parser.tree import Function @@ -67,3 +69,18 @@ def test_string_literals(): else: assert typ('b""') == 'str' assert typ('u""') == 'unicode' + + +def test_method_completion(): + code = dedent(''' + class Foo: + def bar(self): + pass + + foo = Foo() + foo.bar.__func__''') + if is_py3: + result = [] + else: + result = ['__func__'] + assert [c.name for c in Script(code).completions()] == result