diff options
author | Philipp Stephani <phst@google.com> | 2020-08-02 17:17:00 +0200 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2020-08-02 17:39:24 +0200 |
commit | d8ab98843edccd233c2354d3c518c7a4b18023bd (patch) | |
tree | ad0785f91068e823fd3b74782c19d8e05d9bb572 /lisp/emacs-lisp | |
parent | a07ec21bf24b8d1dc41808f997dd0fb78cad3870 (diff) | |
download | emacs-d8ab98843edccd233c2354d3c518c7a4b18023bd.tar.gz emacs-d8ab98843edccd233c2354d3c518c7a4b18023bd.tar.bz2 emacs-d8ab98843edccd233c2354d3c518c7a4b18023bd.zip |
Avoid duplicate Edebug symbols when using ‘cl-flet’ (Bug#41989)
* lisp/emacs-lisp/edebug.el (edebug-match-:unique): Add a new
‘:unique’ specifier to generate unique names.
* lisp/emacs-lisp/cl-macs.el (cl-flet): Use it. This requires
inlining the ‘cl-defun’ specification.
* test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-cl-flet): New
unit test.
* doc/lispref/edebug.texi (Specification List): Document new ‘:unique’
construct.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/cl-macs.el | 7 | ||||
-rw-r--r-- | lisp/emacs-lisp/edebug.el | 12 |
2 files changed, 18 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 6c1426ce5cb..c38019d4a73 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -2016,7 +2016,12 @@ info node `(cl) Function Bindings' for details. \(fn ((FUNC ARGLIST BODY...) ...) FORM...)" (declare (indent 1) - (debug ((&rest [&or (&define name function-form) (cl-defun)]) + (debug ((&rest [&or (&define name :unique "cl-flet@" function-form) + (&define name :unique "cl-flet@" + cl-lambda-list + cl-declarations-or-string + [&optional ("interactive" interactive)] + def-body)]) cl-declarations body))) (let ((binds ()) (newenv macroexpand-all-environment)) (dolist (binding bindings) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 7627829e034..cef97e0fb45 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -1725,6 +1725,7 @@ contains a circular object." (&define . edebug-match-&define) (name . edebug-match-name) (:name . edebug-match-colon-name) + (:unique . edebug-match-:unique) (arg . edebug-match-arg) (def-body . edebug-match-def-body) (def-form . edebug-match-def-form) @@ -2037,6 +2038,17 @@ contains a circular object." spec)) nil) +(defun edebug-match-:unique (_cursor spec) + "Match a `:unique PREFIX' specifier. +SPEC is the symbol name prefix for `gensym'." + (let ((suffix (gensym spec))) + (setq edebug-def-name + (if edebug-def-name + ;; Construct a new name by appending to previous name. + (intern (format "%s@%s" edebug-def-name suffix)) + suffix))) + nil) + (defun edebug-match-cl-generic-method-qualifier (cursor) "Match a QUALIFIER for `cl-defmethod' at CURSOR." (let ((args (edebug-top-element-required cursor "Expected qualifier"))) |