]> git.eshelyaron.com Git - emacs.git/commitdiff
Teach Edebug about the special '&whole' syntax for compiler macros.
authorPhilipp Stephani <phst@google.com>
Thu, 3 Mar 2022 18:56:09 +0000 (19:56 +0100)
committerPhilipp Stephani <phst@google.com>
Thu, 3 Mar 2022 18:57:00 +0000 (19:57 +0100)
* lisp/emacs-lisp/cl-macs.el (cl-define-compiler-macro-list): New
Edebug element specification.
(cl-define-compiler-macro): Use it.

* test/lisp/emacs-lisp/cl-macs-tests.el
(cl-define-compiler-macro/edebug): New unit test.

lisp/emacs-lisp/cl-macs.el
test/lisp/emacs-lisp/cl-macs-tests.el

index 50852172505713aca66f90a2eba4e401f0844b18..accd70dc4efc6e28ebf57435116ced3782ebed02 100644 (file)
@@ -3489,6 +3489,10 @@ omitted, a default message listing FORM itself is used."
 
 ;;; Compiler macros.
 
+(def-edebug-elem-spec 'cl-define-compiler-macro-list
+  `(([&optional "&whole" arg]
+     ,@(car (get 'cl-macro-list 'edebug-elem-spec)))))
+
 ;;;###autoload
 (defmacro cl-define-compiler-macro (func args &rest body)
   "Define a compiler-only macro.
@@ -3501,7 +3505,10 @@ compiler macros are expanded repeatedly until no further expansions are
 possible.  Unlike regular macros, BODY can decide to \"punt\" and leave the
 original function call alone by declaring an initial `&whole foo' parameter
 and then returning foo."
-  (declare (debug cl-defmacro) (indent 2))
+  ;; Like `cl-defmacro', but with the `&whole' special case.
+  (declare (debug (&define name cl-define-compiler-macro-list
+                           cl-declarations-or-string def-body))
+           (indent 2))
   (let ((p args) (res nil))
     (while (consp p) (push (pop p) res))
     (setq args (nconc (nreverse res) (and p (list '&rest p)))))
index 008ec0de4a687be070e726e921dd33f9e7ae2d69..036ee30966be58a72463cc0c2acf44035ade60c7 100644 (file)
@@ -23,6 +23,7 @@
 
 (require 'cl-lib)
 (require 'cl-macs)
+(require 'edebug)
 (require 'ert)
 
 \f
@@ -694,4 +695,18 @@ collection clause."
                    (list cl-macs--test1 cl-macs--test2))
                  '(1 2))))
 
+(ert-deftest cl-define-compiler-macro/edebug ()
+  "Check that we can instrument compiler macros."
+  (with-temp-buffer
+    (dolist (form '((defun cl-define-compiler-macro/edebug (a b) nil)
+                    (cl-define-compiler-macro
+                        cl-define-compiler-macro/edebug
+                        (&whole w a b)
+                      w)))
+      (print form (current-buffer)))
+    (let ((edebug-all-defs t)
+          (edebug-initial-mode 'Go-nonstop))
+      ;; Just make sure the forms can be instrumented.
+      (eval-buffer))))
+
 ;;; cl-macs-tests.el ends here