[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
emacs-29 f175141aead 1/2: Fix searching for end of string in python-nav-
From: |
Eli Zaretskii |
Subject: |
emacs-29 f175141aead 1/2: Fix searching for end of string in python-nav-end-of-statement |
Date: |
Thu, 9 Mar 2023 05:15:33 -0500 (EST) |
branch: emacs-29
commit f175141aeade5d6795d22d40c1eb001c6ba49025
Author: kobarity <kobarity@gmail.com>
Commit: Eli Zaretskii <eliz@gnu.org>
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
"