diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 7dc00e696..d38b8783a 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -420,14 +420,25 @@ def find_signatures(self, line=None, column=None): @validate_line_column def get_context(self, line=None, column=None): - leaf = self._module_node.get_leaf_for_position((line, column), include_prefixes=True) - if leaf.start_pos > (line, column) or leaf.type == 'endmarker': + pos = (line, column) + leaf = self._module_node.get_leaf_for_position(pos, include_prefixes=True) + if leaf.start_pos > pos or leaf.type == 'endmarker': previous_leaf = leaf.get_previous_leaf() if previous_leaf is not None: leaf = previous_leaf module_context = self._get_module_context() - context = module_context.create_context(leaf) + + n = tree.search_ancestor(leaf, 'funcdef', 'classdef') + if n is not None and n.start_pos < pos <= n.children[-1].start_pos: + # This is a bit of a special case. The context of a function/class + # name/param/keyword is always it's parent context, not the + # function itself. Catch all the cases here where we are before the + # suite object, but still in the function. + context = module_context.create_value(n).as_context() + else: + context = module_context.create_context(leaf) + while context.name is None: context = context.parent_context # comprehensions diff --git a/test/test_api/test_context.py b/test/test_api/test_context.py index 82297c114..6fabb2731 100644 --- a/test/test_api/test_context.py +++ b/test/test_api/test_context.py @@ -61,8 +61,9 @@ def x(): (func_code, 1, 0, 'myfile', []), (func_code, 1, None, 'myfile.func1', ['func1']), - #(func_code, 1, 4, 'myfile.func1', ['func1']), - #(func_code, 1, 10, 'myfile.func1', ['func1']), + (func_code, 1, 1, 'myfile.func1', ['func1']), + (func_code, 1, 4, 'myfile.func1', ['func1']), + (func_code, 1, 10, 'myfile.func1', ['func1']), (func_code, 3, 0, 'myfile', []), (func_code, 5, None, 'myfile.func2', ['func2']), @@ -84,6 +85,7 @@ def x(): (cls_code, 4, 5, 'myfile.Foo.x', ['Foo', 'x']), (cls_code, 4, 8, 'myfile.Foo.x', ['Foo', 'x']), (cls_code, 4, 12, None, ['Foo', 'x', 'y']), + (cls_code, 1, 1, 'myfile.Foo', ['Foo']), (cls_nested, 4, None, 'myfile.C.D.f', ['C', 'D', 'f']), (cls_nested, 4, 3, 'myfile.C', ['C']),