From f9ec989835cc1decfb478bce92edc3cec4f992fb Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 13 Mar 2018 21:36:04 +0100 Subject: [PATCH] Fix REPL completion param name completion There were two issues: 1. The filter for parameters was wrong 2. In general the equal sign would not be added in some circumstances --- jedi/api/classes.py | 2 +- jedi/api/completion.py | 6 ++++-- jedi/utils.py | 1 + test/test_api/test_interpreter.py | 28 ++++++++++++++++------------ 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 7a475cfc..995ccf25 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -406,7 +406,7 @@ class Completion(BaseDefinition): and self.type == 'Function': append = '(' - if isinstance(self._name, ParamName) and self._stack is not None: + if self._name.api_type == 'param' and self._stack is not None: node_names = list(self._stack.get_node_names(self._evaluator.grammar._pgen_grammar)) if 'trailer' in node_names and 'argument' not in node_names: append += '=' diff --git a/jedi/api/completion.py b/jedi/api/completion.py index 61a5446e..dcf18ee3 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -25,8 +25,10 @@ def get_call_signature_param_names(call_signatures): # public API and we don't want to make the internal # Name object public. tree_param = tree.search_ancestor(tree_name, 'param') - if tree_param.star_count == 0: # no *args/**kwargs - yield p._name + if tree_param.star_count != 0: # no *args/**kwargs + continue + + yield p._name def filter_names(evaluator, completion_names, stack, like_name): diff --git a/jedi/utils.py b/jedi/utils.py index 3e924a73..0f42e7d5 100644 --- a/jedi/utils.py +++ b/jedi/utils.py @@ -95,6 +95,7 @@ def setup_readline(namespace_module=__main__): ) before = text[:len(text) - len(name)] completions = interpreter.completions() + logging.debug("REPL completions: %s", completions) except: logging.error("REPL Completion error:\n" + traceback.format_exc()) raise diff --git a/test/test_api/test_interpreter.py b/test/test_api/test_interpreter.py index f3a66053..7534dcd7 100644 --- a/test/test_api/test_interpreter.py +++ b/test/test_api/test_interpreter.py @@ -4,7 +4,7 @@ Tests of ``jedi.api.Interpreter``. import pytest import jedi -from jedi._compatibility import is_py3, py_version +from jedi._compatibility import is_py3, py_version, is_py35 from jedi.evaluate.compiled import mixed @@ -227,8 +227,7 @@ def test_param_completion(): lambd = lambda xyz: 3 _assert_interpreter_complete('foo(bar', locals(), ['bar']) - # TODO we're not yet using the Python3.5 inspect.signature, yet. - assert not jedi.Interpreter('lambd(xyz', [locals()]).completions() + assert bool(jedi.Interpreter('lambd(xyz', [locals()]).completions()) == is_py35 def test_endless_yield(): @@ -264,6 +263,20 @@ def test_completion_param_annotations(): assert {d.name for d in c._goto_definitions()} == {'int', 'float'} +def test_keyword_argument(): + def f(some_keyword_argument): + pass + + c, = jedi.Interpreter("f(some_keyw", [{'f': f}]).completions() + assert c.name == 'some_keyword_argument' + assert c.complete == 'ord_argument=' + + # Make it impossible for jedi to find the source of the function. + f.__name__ = 'xSOMETHING' + c, = jedi.Interpreter("x(some_keyw", [{'x': f}]).completions() + assert c.name == 'some_keyword_argument' + + def test_more_complex_instances(): class Something: def foo(self, other): @@ -326,12 +339,3 @@ def test_dir_magic_method(): foo = [c for c in completions if c.name == 'foo'][0] assert foo._goto_definitions() == [] - - -def test_keyword_argument(): - def f(some_keyword_argument): - pass - - c, = jedi.Interpreter("f(some_keyw", [{'f': f}]).completions() - assert c.name == 'some_keyword_argument' - assert c.complete == 'ord_argument='