diff --git a/jedi/api/completion.py b/jedi/api/completion.py index 62425506..22e75b56 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -6,7 +6,6 @@ from jedi.api import classes from jedi.api import helpers from jedi.evaluate import imports from jedi.api import keywords -from jedi.evaluate import compiled from jedi.evaluate.helpers import evaluate_call_of_leaf from jedi.evaluate.filters import get_global_filters @@ -14,15 +13,15 @@ from jedi.evaluate.filters import get_global_filters def get_call_signature_param_names(call_signatures): # add named params for call_sig in call_signatures: - # Allow protected access, because it's a public API. - module = call_sig._name.get_root_context() - # Compiled modules typically don't allow keyword arguments. - if not isinstance(module, compiled.CompiledObject): - for p in call_sig.params: + for p in call_sig.params: + # Allow protected access, because it's a public API. + tree_name = p._name.tree_name + # Compiled modules typically don't allow keyword arguments. + if tree_name is not None: # Allow access on _definition here, because it's a # public API and we don't want to make the internal # Name object public. - tree_param = tree.search_ancestor(p._name.tree_name, 'param') + tree_param = tree.search_ancestor(tree_name, 'param') if tree_param.stars == 0: # no *args/**kwargs yield p._name diff --git a/test/test_api/test_completion_context.py b/test/test_api/test_completion_context.py index fee4f0e1..5b910e37 100644 --- a/test/test_api/test_completion_context.py +++ b/test/test_api/test_completion_context.py @@ -7,3 +7,11 @@ def test_in_whitespace(): def x(): pass''') assert len(Script(code, column=2).completions()) > 20 + + +def test_empty_init(): + """This was actually an issue.""" + code = dedent('''\ + class X(object): pass + X(''') + assert Script(code).completions()