diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 00eefa70..7bd1e336 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -326,7 +326,7 @@ class BaseDefinition(object): raise AttributeError() followed = followed[0] # only check the first one. - if followed.isinstance(er.Function): + if followed.type == 'funcdef': if isinstance(followed, er.InstanceElement): params = followed.params[1:] else: diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index bf62c643..0f5babfa 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -85,6 +85,8 @@ class CompiledObject(Base): def params(self): params_str, ret = self._parse_function_doc() tokens = params_str.split(',') + if inspect.ismethoddescriptor(self._cls().obj): + tokens.insert(0, 'self') params = [] for p in tokens: parts = [FakeName(part) for part in p.strip().split('=')] diff --git a/test/test_api/test_call_signatures.py b/test/test_api/test_call_signatures.py index 5f56954f..0f968e94 100644 --- a/test/test_api/test_call_signatures.py +++ b/test/test_api/test_call_signatures.py @@ -230,6 +230,18 @@ class TestParams(TestCase): assert p[0].name in ['file', 'name'] assert p[1].name == 'mode' + def test_builtins(self): + """ + The self keyword should be visible even for builtins, if not + instantiated. + """ + p = self.params('str.endswith(') + assert p[0].name == 'self' + assert p[1].name == 'suffix' + p = self.params('str.endswith(') + assert p[0].name == 'suffix' + + def test_signature_is_definition(): """