Use compiler macros for the key syntax checks
Compile-time key string syntax checks are better written using compiler macros than with byte-hunk-handlers inside the compiler proper. * lisp/emacs-lisp/bytecomp.el (byte-compile-define-keymap) (byte-compile-define-keymap--define): Remove. * lisp/keymap.el (keymap--compile-check): New. (keymap-set, keymap-global-set, keymap-local-set, keymap-global-unset) (keymap-local-unset, keymap-unset, keymap-substitute) (keymap-set-after, key-translate, keymap-lookup, keymap-local-lookup) (keymap-global-lookup): Use compiler-macro for argument checks. * lisp/subr.el (define-keymap--compile): New. (define-keymap--define): Fold into define-keymap. (define-keymap): Use compiler-macro. (defvar-keymap): Use define-keymap.
This commit is contained in:
parent
1e8074f5ea
commit
d50e0bdbac
3 changed files with 46 additions and 69 deletions
|
@ -5050,69 +5050,6 @@ binding slots have been popped."
|
|||
(_ (byte-compile-keep-pending form))))
|
||||
|
||||
|
||||
|
||||
;; Key syntax warnings.
|
||||
|
||||
(mapc
|
||||
(lambda (elem)
|
||||
(put (car elem) 'byte-hunk-handler
|
||||
(lambda (form)
|
||||
(dolist (idx (cdr elem))
|
||||
(let ((key (elt form idx)))
|
||||
(when (or (vectorp key)
|
||||
(and (stringp key)
|
||||
(not (key-valid-p key))))
|
||||
(byte-compile-warn "Invalid `kbd' syntax: %S" key))))
|
||||
form)))
|
||||
;; Functions and the place(s) for the key definition(s).
|
||||
'((keymap-set 2)
|
||||
(keymap-global-set 1)
|
||||
(keymap-local-set 1)
|
||||
(keymap-unset 2)
|
||||
(keymap-global-unset 1)
|
||||
(keymap-local-unset 1)
|
||||
(keymap-substitute 2 3)
|
||||
(keymap-set-after 2)
|
||||
(key-translate 1 2)
|
||||
(keymap-lookup 2)
|
||||
(keymap-global-lookup 1)
|
||||
(keymap-local-lookup 1)))
|
||||
|
||||
(put 'define-keymap 'byte-hunk-handler #'byte-compile-define-keymap)
|
||||
(defun byte-compile-define-keymap (form)
|
||||
(let ((result nil)
|
||||
(orig-form form))
|
||||
(push (pop form) result)
|
||||
(while (and form
|
||||
(keywordp (car form))
|
||||
(not (eq (car form) :menu)))
|
||||
(unless (memq (car form)
|
||||
'(:full :keymap :parent :suppress :name :prefix))
|
||||
(byte-compile-warn "Invalid keyword: %s" (car form)))
|
||||
(push (pop form) result)
|
||||
(when (null form)
|
||||
(byte-compile-warn "Uneven number of keywords in %S" form))
|
||||
(push (pop form) result))
|
||||
;; Bindings.
|
||||
(while form
|
||||
(let ((key (pop form)))
|
||||
(when (stringp key)
|
||||
(unless (key-valid-p key)
|
||||
(byte-compile-warn "Invalid `kbd' syntax: %S" key)))
|
||||
;; No improvement.
|
||||
(push key result))
|
||||
(when (null form)
|
||||
(byte-compile-warn "Uneven number of key bindings in %S" form))
|
||||
(push (pop form) result))
|
||||
orig-form))
|
||||
|
||||
(put 'define-keymap--define 'byte-hunk-handler
|
||||
#'byte-compile-define-keymap--define)
|
||||
(defun byte-compile-define-keymap--define (form)
|
||||
(when (consp (nth 1 form))
|
||||
(byte-compile-define-keymap (nth 1 form)))
|
||||
form)
|
||||
|
||||
|
||||
;;; tags
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue