diff --git a/jedi/api/completion.py b/jedi/api/completion.py index e28559fd..1b43657b 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -18,6 +18,7 @@ from jedi.inference.context import get_global_filters from jedi.inference.value import TreeInstance from jedi.inference.gradual.conversion import convert_values from jedi.parser_utils import cut_value_at_position +from jedi.plugins import plugin_manager def get_signature_param_names(signatures): @@ -74,6 +75,13 @@ def get_flow_scope_node(module_node, position): return node +@plugin_manager.decorate() +def complete_param_names(context, function_name): + # Basically there's no way to do param completion. The plugins are + # responsible for this. + return [] + + class Completion: def __init__(self, inference_state, module_context, code_lines, position, signatures_callback, fuzzy=False): @@ -217,7 +225,14 @@ class Completion: dot = self._module_node.get_leaf_for_position(self._position) completion_names += self._complete_trailer(dot.get_previous_leaf()) elif self._is_parameter_completion(): - pass + stack_node = self.stack[-2] + if stack_node.nonterminal == 'parameters': + stack_node = self.stack[-3] + if stack_node.nonterminal == 'funcdef': + context = get_user_context(self._module_context, self._position) + function_name = stack_node.nodes[1] + + completion_names += complete_param_names(context, function_name) else: completion_names += self._complete_global_scope() completion_names += self._complete_inherited(is_function=False) diff --git a/jedi/plugins/pytest.py b/jedi/plugins/pytest.py index 8cdfb609..b4e6d579 100644 --- a/jedi/plugins/pytest.py +++ b/jedi/plugins/pytest.py @@ -53,6 +53,18 @@ def goto_anonymous_param(func): return wrapper +def complete_param_names(func): + def wrapper(context, func_name): + module_context = context.get_root_context() + names = [] + for module_context in _iter_pytest_modules(module_context): + names += FixtureFilter(module_context).values() + if names: + return names + return func(context, func_name) + return wrapper + + def _goto_pytest_fixture(module_context, name): for module_context in _iter_pytest_modules(module_context): names = FixtureFilter(module_context).get(name) diff --git a/test/completion/pytest.py b/test/completion/pytest.py index b8423c16..b6f8adca 100644 --- a/test/completion/pytest.py +++ b/test/completion/pytest.py @@ -54,9 +54,21 @@ def test_x(MyClassFixture): #? 34 ['my_fixture'] def test_x(my_simple_fixture, my_fixture): return +#? 34 ['my_fixture'] +def test_x(my_simple_fixture, my_fixture): + return +#? ['my_fixture'] +def test_x(my_simple_fixture, my_f + return #? 18 ['my_simple_fixture'] def test_x(my_simple_fixture): return +#? ['my_simple_fixture'] +def test_x(my_simp + return +#? ['my_conftest_fixture'] +def test_x(my_con + return #? 18 ['my_conftest_fixture'] def test_x(my_conftest_fixture): return