emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 4cee95815b9: pp.el: Try and fix bug#70039


From: Stefan Monnier
Subject: master 4cee95815b9: pp.el: Try and fix bug#70039
Date: Thu, 28 Mar 2024 15:31:16 -0400 (EDT)

branch: master
commit 4cee95815b9d7d56f6f77abb1cc17e346c038685
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    pp.el: Try and fix bug#70039
    
    * lisp/emacs-lisp/pp.el (pp-fill): Avoid splitting `#N#` or `#[`.
    * test/lisp/emacs-lisp/pp-tests.el (pp-tests--sanity): New test.
---
 lisp/emacs-lisp/pp.el            | 27 +++++++++++++++++----------
 test/lisp/emacs-lisp/pp-tests.el | 19 +++++++++++++++++++
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/lisp/emacs-lisp/pp.el b/lisp/emacs-lisp/pp.el
index 26c77d6b047..d586fc59939 100644
--- a/lisp/emacs-lisp/pp.el
+++ b/lisp/emacs-lisp/pp.el
@@ -166,12 +166,19 @@ it inserts and pretty-prints that arg at point."
   (interactive "r")
   (if (null end) (pp--object beg #'pp-fill)
     (goto-char beg)
-    (let ((end (copy-marker end t))
-          (newline (lambda ()
-                     (skip-chars-forward ")]}")
-                     (unless (save-excursion (skip-chars-forward " \t") (eolp))
-                       (insert "\n")
-                       (indent-according-to-mode)))))
+    (let* ((end (copy-marker end t))
+           (avoid-unbreakable
+            (lambda ()
+              (and (memq (char-before) '(?# ?s ?f))
+                   (memq (char-after) '(?\[ ?\())
+                   (looking-back "#[sf]?" (- (point) 2))
+                   (goto-char (match-beginning 0)))))
+           (newline (lambda ()
+                      (skip-chars-forward ")]}")
+                      (unless (save-excursion (skip-chars-forward " \t") 
(eolp))
+                        (funcall avoid-unbreakable)
+                        (insert "\n")
+                        (indent-according-to-mode)))))
       (while (progn (forward-comment (point-max))
                     (< (point) end))
         (let ((beg (point))
@@ -198,10 +205,10 @@ it inserts and pretty-prints that arg at point."
                       ;; reduce the indentation depth.
                       ;; Similarly, we prefer to cut before a "." than after
                       ;; it because it reduces the indentation depth.
-                      (while (not (zerop (skip-chars-backward " \t({[',.")))
-                        (and (memq (char-before) '(?# ?s ?f))
-                             (looking-back "#[sf]?" (- (point) 2))
-                             (goto-char (match-beginning 0))))
+                      (while
+                          (progn
+                            (funcall avoid-unbreakable)
+                            (not (zerop (skip-chars-backward " \t({[',.")))))
                       (if (bolp)
                           ;; The sexp already starts on its own line.
                           (progn (goto-char beg) nil)
diff --git a/test/lisp/emacs-lisp/pp-tests.el b/test/lisp/emacs-lisp/pp-tests.el
index 7f7c798cde8..7606183d645 100644
--- a/test/lisp/emacs-lisp/pp-tests.el
+++ b/test/lisp/emacs-lisp/pp-tests.el
@@ -66,4 +66,23 @@
     (while (search-forward "." nil t)
       (should (not (eolp))))))
 
+(ert-deftest pp-tests--sanity ()
+  (with-temp-buffer
+    (lisp-data-mode)
+    (let ((testdata "(a b c #1=#[0 \"\" [] 0] #s(foo #1# bar))"))
+      (let ((res (car (read-from-string testdata))))
+      (dotimes (i (length testdata))
+        (erase-buffer)
+        (insert testdata)
+        (let ((fill-column i))
+          (pp-fill (point-min) (point-max))
+          (goto-char (point-min))
+          (condition-case err
+              (should (equal (read (current-buffer)) res))
+            (invalid-read-syntax
+             (message "Invalid fill result with i=%d:\n%s"
+                      i (buffer-string))
+             (signal (car err) (cdr err))
+             ))))))))
+
 ;;; pp-tests.el ends here.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]