clojure-indent-function: (wrong-type-argument number-or-marker-p nil)
manuel-uberti opened this issue · 8 comments
Expected behavior
With the whole buffer marked, I expect indent-region to indent it all with no errors.
Actual behavior
Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
#f(compiled-function (method) #<bytecode -0x11a418d65ea601b1>)(nil)
clojure-indent-function(17 (1 1 5 nil nil nil 0 nil nil (1) nil))
calculate-lisp-indent((1 1 5 nil nil nil 0 nil nil (1) nil))
lisp-indent-line()
clojure-indent-line()
indent-according-to-mode()
indent-region-line-by-line(1 546)
indent-region(1 546)
clojure-indent-region(1 546)
indent-region(1 546 nil)
funcall-interactively(indent-region 1 546 nil)
call-interactively(indent-region record nil)
command-execute(indent-region record)
execute-extended-command(nil "indent-region" nil)
funcall-interactively(execute-extended-command nil "indent-region" nil)
call-interactively(execute-extended-command nil nil)
command-execute(execute-extended-command)
Steps to reproduce the problem
- emacs -Q
- install
clojure-mode(I usedstraight.el) - visit a Clojure file (I used core.clj)
- C-x h
- M-x indent-region
Environment & Version information
clojure-mode version
clojure-mode (version 5.13.0-snapshot)
Emacs version
GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.18, cairo version 1.16.0)
of 2021-03-03
Operating system
Ubuntu 20.04 LTS
I don't know if this could be helpful, but following the above steps when I evaluate (clojure--find-indent-spec) I get nil.
On further debugging I noticed that in clojure--find-indent-spec-backtracking I get a 1 for method (line 1359). Then on line 1367 I see:
(when (numberp method)
(setq method (list method)))And then on line 1376:
(`1 (let ((head (elt method 0)))
(when (or (= pos 0) (sequencep head))
head)))But it looks like that head is never returned, because head is not a sequence? This is, of course, if I have been understanding it all correctly. :)
I have the same error with emacs compiled from the latest master, but not with 27.1. Furthermore, it's something that changed recently, as I recompile emacs every couple of weeks, and noticed this regression only yesterday.
I don't have the time to bisect the master right now, sorry for not providing additional info.
I hard reset to commit 6bf56a3614ccd23a31e34ae997b2a6bb0d158489 and it seems to work now.
@omar-polo I saw many changes on pcase in Emacs master. Could it be related? Both clojure--find-indent-spec-backtracking and clojure-indent-function use pcase.
This commit seems only about comments and a style change, so maybe the culprit is some commit after?
Since clojure-indent-function & friends weren't touched recently, this could be an emacs bug in the recent pcase changes you mentioned.
Yes I explicitly reverted to the first commit I found without changes to pcase. I wrote to emacs-devel[1] pointing at this issue here to see if I can get some help on this, provided it is indeed related to the changes on pcase.
[1] https://lists.gnu.org/archive/html/emacs-devel/2021-03/msg00172.html
As per the exchange on emacs-devel, clojure-indent-function could be fixed by changing:
(pcase method
((or (pred integerp) `(,method))
(let ((pos -1))
[...]to:
(pcase method
((or (pred integerp) `(m))
(let ((method (if (integerp method) method m))
(pos -1))
[...]Not sure how to make the change backward compatible, though, but since this is related to changes on Emacs master, I guess we can close this.