]> git.eshelyaron.com Git - emacs.git/commitdiff
Edebug: Make it possible to debug `gv-expander`s in `declare`
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 13 Feb 2021 03:53:38 +0000 (22:53 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 13 Feb 2021 03:53:38 +0000 (22:53 -0500)
Arrange for declarations to be able to specify their own specs via
the `edebug-declaration-spec` property.

* lisp/emacs-lisp/edebug.el: (edebug--get-declare-spec): New function.
(def-declarations): New spec element.
(defun, defmacro): Use it in their spec.

* lisp/emacs-lisp/gv.el (gv-expander, gv-setter):
Set `edebug-declaration-spec`.

* test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-gv-expander): New test.

* test/lisp/emacs-lisp/edebug-resources/edebug-test-code.el
(edebug-test-code-use-gv-expander): New test case.

lisp/emacs-lisp/edebug.el
lisp/emacs-lisp/gv.el
test/lisp/emacs-lisp/edebug-resources/edebug-test-code.el
test/lisp/emacs-lisp/edebug-tests.el

index 47b45614e711fb6154d0188a958ef146e4e6b467..394f47090ca4450d42549ee03f9fd9e651d145a9 100644 (file)
@@ -2207,14 +2207,12 @@ into `edebug--cl-macrolet-defs' which is checked in `edebug-list-form-args'."
        ;; `defun' and `defmacro' are not special forms (any more), but it's
        ;; more convenient to define their Edebug spec here.
        (defun ( &define name lambda-list lambda-doc
-               [&optional ("declare" &rest sexp)]
+               [&optional ("declare" def-declarations)]
                [&optional ("interactive" &optional &or stringp def-form)]
                def-body))
 
-       ;; FIXME: Improve `declare' so we can Edebug gv-expander and
-       ;; gv-setter declarations.
        (defmacro ( &define name lambda-list lambda-doc
-                   [&optional ("declare" &rest sexp)]
+                   [&optional ("declare" def-declarations)]
                    def-body))
 
        ;; function expects a symbol or a lambda or macro expression
@@ -2243,6 +2241,12 @@ into `edebug--cl-macrolet-defs' which is checked in `edebug-list-form-args'."
        ))
     (put name 'edebug-form-spec spec))
 
+(defun edebug--get-declare-spec (head)
+  (get head 'edebug-declaration-spec))
+
+(def-edebug-elem-spec 'def-declarations
+  '(&rest &or (&lookup symbolp edebug--get-declare-spec) sexp))
+
 (def-edebug-elem-spec 'lambda-list
   '(([&rest arg]
      [&optional ["&optional" arg &rest arg]]
index c160aa1fd358c55c0c17866e3b85a6b2c8acecfa..edacdf7f0c833585d635339cf1a0b15fca434f96 100644 (file)
@@ -187,6 +187,11 @@ arguments as NAME.  DO is a function as defined in `gv-get'."
     (push (list 'gv-setter #'gv--setter-defun-declaration)
          defun-declarations-alist))
 
+;;;###autoload
+(let ((spec '(&or symbolp ("lambda" &define lambda-list def-body))))
+  (put 'gv-expander 'edebug-declaration-spec spec)
+  (put 'gv-setter 'edebug-declaration-spec spec))
+
 ;; (defmacro gv-define-expand (name expander)
 ;;   "Use EXPANDER to handle NAME as a generalized var.
 ;; NAME is a symbol: the name of a function, macro, or special form.
index d77df3c3c518b09d2eb44d3cdf52fe2385c2c0ed..835d3781d0905175e30df8848ff956224b87dcc9 100644 (file)
     ;; of the same name.
     (message "Hi %s" (gate 7))))
 
+(defun edebug-test-code-use-gv-expander (x)
+  (declare (gv-expander
+            (lambda (do)
+              (funcall do `(car ,x) (lambda (v) `(setcar ,x ,v))))))
+  (car x))
+
 (provide 'edebug-test-code)
 ;;; edebug-test-code.el ends here
index c11bfcf0012b81152e9f6b2d14d5b38892b76149..dfe2cb32065c9b3152323f117a1f03e253e7632d 100644 (file)
@@ -959,6 +959,17 @@ primary ones (Bug#42671)."
   (edebug-tests-with-normal-env
    (edebug-tests-setup-@ "cl-flet1" '(10) t)))
 
+(ert-deftest edebug-tests-gv-expander ()
+  "Edebug can instrument `gv-expander' expressions."
+  (edebug-tests-with-normal-env
+   (edebug-tests-setup-@ "use-gv-expander" nil t)
+   (should (equal
+            (catch 'text
+              (run-at-time 0 nil
+                           (lambda () (throw 'text (buffer-substring (point) (+ (point) 5)))))
+              (eval '(setf (edebug-test-code-use-gv-expander (cons 'a 'b)) 3) t))
+            "(func"))))
+
 (ert-deftest edebug-tests-cl-flet ()
   "Check that Edebug can instrument `cl-flet' forms without name
 clashes (Bug#41853)."