107 lines
3.8 KiB
Diff
107 lines
3.8 KiB
Diff
|
From 62cfa24a89fdbf90cbe866ad88ca635327eb1f49 Mon Sep 17 00:00:00 2001
|
||
|
From: kobarity <kobarity@gmail.com>
|
||
|
Date: Sun, 5 Mar 2023 17:06:26 +0900
|
||
|
Subject: [PATCH 1/2] 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 1f970633bfc..cc4ece1669c 100644
|
||
|
--- a/lisp/progmodes/python.el
|
||
|
+++ b/lisp/progmodes/python.el
|
||
|
@@ -2076,10 +2076,16 @@ python-nav-end-of-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 4f24c042c6a..e9df4a2c843 100644
|
||
|
--- a/test/lisp/progmodes/python-tests.el
|
||
|
+++ b/test/lisp/progmodes/python-tests.el
|
||
|
@@ -2943,6 +2943,36 @@ python-nav-end-of-statement-2
|
||
|
"'\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
|
||
|
"
|
||
|
@@ -5209,6 +5239,20 @@ python-info-current-defun-3
|
||
|
(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.34.1
|
||
|
|