[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")