Skip to content

Commit 54a62cc

Browse files
authored
Fix infinite loop when reverse searching for next definition (#624)
Fixes #595 Fixes #612
1 parent fee38d7 commit 54a62cc

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
* [#622](https://github.com/clojure-emacs/clojure-mode/issues/622): Add font locking for missing clojure.core macros
88
* [#615](https://github.com/clojure-emacs/clojure-mode/issues/615): Support clojure-dart files.
99

10+
### Bugs fixed
11+
12+
* [#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
13+
1014
## 5.14.0 (2022-03-07)
1115

1216
### New features

clojure-mode.el

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -754,8 +754,11 @@ Called by `imenu--generic-function'."
754754
(when (char-equal ?\) (char-after (point)))
755755
(backward-sexp)))
756756
(cl-destructuring-bind (def-beg . def-end) (bounds-of-thing-at-point 'sexp)
757-
(if (char-equal ?^ (char-after def-beg))
758-
(progn (forward-sexp) (backward-sexp))
757+
(when (char-equal ?^ (char-after def-beg))
758+
;; move to the beginning of next sexp
759+
(progn (forward-sexp) (backward-sexp)))
760+
(when (or (not (char-equal ?^ (char-after (point))))
761+
(and (char-equal ?^ (char-after (point))) (= def-beg (point))))
759762
(setq found? t)
760763
(when (string= deftype "defmethod")
761764
(setq def-end (progn (goto-char def-end)

test.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@
223223
([x y & more]
224224
(reduce1 max (max x y) more)))
225225

226+
227+
;; definitions with metadata only don't cause freezing
228+
(def ^String)
229+
226230
(defn ^String reverse
227231
"Returns s with its characters reversed."
228232
{:added "1.2"}

test/clojure-mode-syntax-test.el

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,37 @@
6060
(expect (non-func "^hint " form) :to-be nil)
6161
(expect (non-func "#macro " form) :to-be nil))))
6262

63+
(describe "clojure-match-next-def"
64+
(let ((some-sexp "\n(list [1 2 3])"))
65+
(it "handles vars with metadata"
66+
(dolist (form '("(def ^Integer a 1)"
67+
"(def ^:a a 1)"
68+
"(def ^::a a 1)"
69+
"(def ^::a/b a 1)"
70+
"(def ^{:macro true} a 1)"))
71+
(with-clojure-buffer (concat form some-sexp)
72+
(end-of-buffer)
73+
(clojure-match-next-def)
74+
(expect (looking-at "(def")))))
75+
76+
(it "handles vars without metadata"
77+
(with-clojure-buffer (concat "(def a 1)" some-sexp)
78+
(end-of-buffer)
79+
(clojure-match-next-def)
80+
(expect (looking-at "(def"))))
81+
82+
(it "handles invalid def forms"
83+
(dolist (form '("(def ^Integer)"
84+
"(def)"
85+
"(def ^{:macro})"
86+
"(def ^{:macro true})"
87+
"(def ^{:macro true} foo)"
88+
"(def ^{:macro} foo)"))
89+
(with-clojure-buffer (concat form some-sexp)
90+
(end-of-buffer)
91+
(clojure-match-next-def)
92+
(expect (looking-at "(def")))))))
93+
6394
(describe "clojure syntax"
6495
(it "handles prefixed symbols"
6596
(dolist (form '(("#?@aaa" . "aaa")

0 commit comments

Comments
 (0)