emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[nongnu] elpa/clojure-mode 54a62cc02a 1/3: Fix infinite loop when revers


From: ELPA Syncer
Subject: [nongnu] elpa/clojure-mode 54a62cc02a 1/3: Fix infinite loop when reverse searching for next definition (#624)
Date: Tue, 19 Jul 2022 13:58:09 -0400 (EDT)

branch: elpa/clojure-mode
commit 54a62cc02a0901400a1a3660182a4c898626116d
Author: Vadim <47952597+OknoLombarda@users.noreply.github.com>
Commit: GitHub <noreply@github.com>

    Fix infinite loop when reverse searching for next definition (#624)
    
    Fixes #595
    Fixes #612
---
 CHANGELOG.md                     |  4 ++++
 clojure-mode.el                  |  7 +++++--
 test.clj                         |  4 ++++
 test/clojure-mode-syntax-test.el | 31 +++++++++++++++++++++++++++++++
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebcf9bdc19..2d55962072 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@
 * [#622](https://github.com/clojure-emacs/clojure-mode/issues/622): Add font 
locking for missing clojure.core macros
 * [#615](https://github.com/clojure-emacs/clojure-mode/issues/615): Support 
clojure-dart files.
 
+### Bugs fixed
+
+* [#595](https://github.com/clojure-emacs/clojure-mode/issues/595), 
[#612](https://github.com/clojure-emacs/clojure-mode/issues/612): Fix buffer 
freezing when typing metadata for a definition
+
 ## 5.14.0 (2022-03-07)
 
 ### New features
diff --git a/clojure-mode.el b/clojure-mode.el
index 929489260b..595ea0a0b3 100644
--- a/clojure-mode.el
+++ b/clojure-mode.el
@@ -754,8 +754,11 @@ Called by `imenu--generic-function'."
               (when (char-equal ?\) (char-after (point)))
                 (backward-sexp)))
           (cl-destructuring-bind (def-beg . def-end) (bounds-of-thing-at-point 
'sexp)
-            (if (char-equal ?^ (char-after def-beg))
-                (progn (forward-sexp) (backward-sexp))
+            (when (char-equal ?^ (char-after def-beg))
+              ;; move to the beginning of next sexp
+              (progn (forward-sexp) (backward-sexp)))
+            (when (or (not (char-equal ?^ (char-after (point))))
+                      (and (char-equal ?^ (char-after (point))) (= def-beg 
(point))))
               (setq found? t)
               (when (string= deftype "defmethod")
                 (setq def-end (progn (goto-char def-end)
diff --git a/test.clj b/test.clj
index 147171a1bb..a1d67dfaa3 100644
--- a/test.clj
+++ b/test.clj
@@ -223,6 +223,10 @@
   ([x y & more]
      (reduce1 max (max x y) more)))
 
+
+;; definitions with metadata only don't cause freezing
+(def ^String)
+
 (defn ^String reverse
   "Returns s with its characters reversed."
   {:added "1.2"}
diff --git a/test/clojure-mode-syntax-test.el b/test/clojure-mode-syntax-test.el
index bc71eaab21..8ac8938f91 100644
--- a/test/clojure-mode-syntax-test.el
+++ b/test/clojure-mode-syntax-test.el
@@ -60,6 +60,37 @@
       (expect (non-func "^hint " form) :to-be nil)
       (expect (non-func "#macro " form) :to-be nil))))
 
+(describe "clojure-match-next-def"
+  (let ((some-sexp "\n(list [1 2 3])"))
+    (it "handles vars with metadata"
+      (dolist (form '("(def ^Integer a 1)"
+                      "(def ^:a a 1)"
+                      "(def ^::a a 1)"
+                      "(def ^::a/b a 1)"
+                      "(def ^{:macro true} a 1)"))
+        (with-clojure-buffer (concat form some-sexp)
+          (end-of-buffer)
+          (clojure-match-next-def)
+          (expect (looking-at "(def")))))
+
+    (it "handles vars without metadata"
+      (with-clojure-buffer (concat "(def a 1)" some-sexp)
+        (end-of-buffer)
+        (clojure-match-next-def)
+        (expect (looking-at "(def"))))
+
+    (it "handles invalid def forms"
+      (dolist (form '("(def ^Integer)"
+                      "(def)"
+                      "(def ^{:macro})"
+                      "(def ^{:macro true})"
+                      "(def ^{:macro true} foo)"
+                      "(def ^{:macro} foo)"))
+        (with-clojure-buffer (concat form some-sexp)
+          (end-of-buffer)
+          (clojure-match-next-def)
+          (expect (looking-at "(def")))))))
+
 (describe "clojure syntax"
   (it "handles prefixed symbols"
     (dolist (form '(("#?@aaa" . "aaa")



reply via email to

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