From f175141aeade5d6795d22d40c1eb001c6ba49025 Mon Sep 17 00:00:00 2001 From: kobarity Date: Sun, 5 Mar 2023 17:06:26 +0900 Subject: [PATCH] Fix searching for end of string in python-nav-end-of-statement * lisp/progmodes/python.el (python-nav-end-of-statement): Add searching for corresponding string-quote. * test/lisp/progmodes/python-tests.el (python-nav-end-of-statement-3) (python-nav-end-of-statement-4, python-info-current-defun-4): New tests. (Bug#58780) --- lisp/progmodes/python.el | 14 ++++++--- test/lisp/progmodes/python-tests.el | 44 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 630250c15c3..ccf78e13148 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2076,10 +2076,16 @@ of the statement." (goto-char (+ (point) (python-syntax-count-quotes (char-after (point)) (point)))) - (setq last-string-end - (or (re-search-forward - (rx (syntax string-delimiter)) nil t) - (goto-char (point-max))))))) + (setq + last-string-end + (or (if (eq t (nth 3 (syntax-ppss))) + (re-search-forward + (rx (syntax string-delimiter)) nil t) + (ignore-error scan-error + (goto-char string-start) + (python-nav--lisp-forward-sexp) + (point))) + (goto-char (point-max))))))) ((python-syntax-context 'paren) ;; The statement won't end before we've escaped ;; at least one level of parenthesis. diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index 6928e313dc4..7e2f66e9095 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -2955,6 +2955,36 @@ string "'\n''\n" (python-nav-end-of-statement))) +(ert-deftest python-nav-end-of-statement-3 () + "Test unmatched quotes (Bug#58780)." + (python-tests-with-temp-buffer + " +' \"\"\" +v = 1 +" + (python-tests-look-at "v =") + (should (= (save-excursion + (python-nav-end-of-statement) + (point)) + (save-excursion + (point-max)))))) + +(ert-deftest python-nav-end-of-statement-4 () + (python-tests-with-temp-buffer + " +abc = 'a\\ +b\\ +c' +d = '''d''' +" + (python-tests-look-at "b\\") + (should (= (save-excursion + (python-nav-end-of-statement) + (point)) + (save-excursion + (python-tests-look-at "c'") + (pos-eol)))))) + (ert-deftest python-nav-forward-statement-1 () (python-tests-with-temp-buffer " @@ -5221,6 +5251,20 @@ def decoratorFunctionWithArguments(arg1, arg2, arg3): (should (string= (python-info-current-defun t) "def decoratorFunctionWithArguments")))) +(ert-deftest python-info-current-defun-4 () + "Ensure unmatched quotes do not cause hang (Bug#58780)." + (python-tests-with-temp-buffer + " +def func(): + ' \"\"\" + v = 1 +" + (python-tests-look-at "v = 1") + (should (string= (python-info-current-defun) + "func")) + (should (string= (python-info-current-defun t) + "def func")))) + (ert-deftest python-info-current-symbol-1 () (python-tests-with-temp-buffer " -- 2.39.2