Blame fix-searching-for-end-of-string-in-python-nav-end-of.patch

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