From eca8278eef3faf1dcf263e63d4c3a1d3e687e22b Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 23 Dec 2019 10:08:43 +0100 Subject: [PATCH] Fix an error recovery goto issue, fixes davidhalter/jedi-vim#962 --- jedi/api/__init__.py | 1 - jedi/inference/helpers.py | 2 +- jedi/inference/imports.py | 1 - test/completion/classes.py | 14 ++++++++++++++ test/completion/goto.py | 7 +++++++ test/completion/import_tree/pkg/base.py | 3 +++ test/test_api/test_api.py | 2 +- 7 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 test/completion/import_tree/pkg/base.py diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index d38b8783..8b2958dd 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -12,7 +12,6 @@ arguments. import os import sys import warnings -import keyword import parso from parso.python import tree diff --git a/jedi/inference/helpers.py b/jedi/inference/helpers.py index 2dffba4b..aeefc31d 100644 --- a/jedi/inference/helpers.py +++ b/jedi/inference/helpers.py @@ -94,7 +94,7 @@ def infer_call_of_leaf(context, leaf, cut_own_trailer=False): base = power.children[start] if base.type != 'trailer': break - trailers = power.children[start + 1: index + 1] + trailers = power.children[start + 1:cut] else: base = power.children[0] trailers = power.children[1:cut] diff --git a/jedi/inference/imports.py b/jedi/inference/imports.py index 27fcb758..70384526 100644 --- a/jedi/inference/imports.py +++ b/jedi/inference/imports.py @@ -618,4 +618,3 @@ def follow_error_node_imports_if_possible(context, name): return Importer( context.inference_state, names, context.get_root_context(), level).follow() return None - diff --git a/test/completion/classes.py b/test/completion/classes.py index 33b749c8..94db0a8b 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -607,3 +607,17 @@ DefaultArg().y() DefaultArg.x() #? str() DefaultArg.y() + + +# ----------------- +# Error Recovery +# ----------------- + +from import_tree.pkg.base import MyBase + +class C1(MyBase): + def f3(self): + #! 13 ['def f1'] + self.f1() . # hey''' + #? 13 MyBase.f1 + self.f1() . # hey''' diff --git a/test/completion/goto.py b/test/completion/goto.py index 3deabf33..9a05c110 100644 --- a/test/completion/goto.py +++ b/test/completion/goto.py @@ -37,6 +37,7 @@ foo = 10;print(foo) # classes # ----------------- class C(object): + x = 3 def b(self): #! ['b = math'] b @@ -44,8 +45,14 @@ class C(object): self.b #! 14 ['def b'] self.b() + #! 14 ['def b'] + self.b. #! 11 ['param self'] self.b + #! ['x = 3'] + self.x + #! 14 ['x = 3'] + self.x. return 1 #! ['def b'] diff --git a/test/completion/import_tree/pkg/base.py b/test/completion/import_tree/pkg/base.py new file mode 100644 index 00000000..e3de9b5a --- /dev/null +++ b/test/completion/import_tree/pkg/base.py @@ -0,0 +1,3 @@ +class MyBase: + def f1(self): + pass diff --git a/test/test_api/test_api.py b/test/test_api/test_api.py index 7982f197..2a41eb79 100644 --- a/test/test_api/test_api.py +++ b/test/test_api/test_api.py @@ -13,7 +13,7 @@ from parso import cache from jedi._compatibility import unicode from jedi import preload_module from jedi.inference.gradual import typeshed -from test.helpers import test_dir +from test.helpers import test_dir, get_example_dir @pytest.mark.skipif(sys.version_info[0] == 2, reason="Ignore Python 2, EoL")