From ddf6149d2d93ac04cbe0bb51f71fe0983ed68945 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Mon, 20 Jan 2025 19:53:13 +0100 Subject: [PATCH] scope.el: Improve handling of cl-destructuring-bind --- lisp/emacs-lisp/scope.el | 44 ++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/lisp/emacs-lisp/scope.el b/lisp/emacs-lisp/scope.el index 2f33bf90026..34a29a1b0f7 100644 --- a/lisp/emacs-lisp/scope.el +++ b/lisp/emacs-lisp/scope.el @@ -848,24 +848,26 @@ Optional argument LOCAL is a local context to extend." (defun scope-cl-lambda-1 (local arglist more body) (cond (arglist - (let ((head (car arglist))) - (if (consp head) - (scope-cl-lambda-1 local head (cons (cdr arglist) more) body) - (let ((bare (scope-sym-bare head))) - (if (memq bare '(&optional &rest &body &key &aux &whole)) - (progn + (if (consp arglist) + (let ((head (car arglist))) + (if (consp head) + (scope-cl-lambda-1 local head (cons (cdr arglist) more) body) + (let ((bare (scope-sym-bare head))) + (if (memq bare '(&optional &rest &body &key &aux &whole)) + (progn + (when-let ((beg (scope-sym-pos head))) + (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil)) + (cl-case bare + (&optional (scope-cl-lambda-optional local (cadr arglist) (cddr arglist) more body)) + ((&rest &body) (scope-cl-lambda-rest local (cadr arglist) (cddr arglist) more body)) + (&key (scope-cl-lambda-key local (cadr arglist) (cddr arglist) more body)) + (&aux (scope-cl-lambda-aux local (cadr arglist) (cddr arglist) more body)) + (&whole (scope-cl-lambda-1 local (cdr arglist) more body)))) (when-let ((beg (scope-sym-pos head))) - (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil)) - (cl-case bare - (&optional (scope-cl-lambda-optional local (cadr arglist) (cddr arglist) more body)) - ((&rest &body) (scope-cl-lambda-rest local (cadr arglist) (cddr arglist) more body)) - (&key (scope-cl-lambda-key local (cadr arglist) (cddr arglist) more body)) - (&aux (scope-cl-lambda-aux local (cadr arglist) (cddr arglist) more body)) - (&whole (scope-cl-lambda-1 local (cdr arglist) more body)))) - (when-let ((beg (scope-sym-pos head))) - (funcall scope-callback 'variable beg (length (symbol-name bare)) beg)) - (scope-cl-lambda-1 (scope-local-new bare (scope-sym-pos head) local) - (cdr arglist) more body)))))) + (funcall scope-callback 'variable beg (length (symbol-name bare)) beg)) + (scope-cl-lambda-1 (scope-local-new bare (scope-sym-pos head) local) + (cdr arglist) more body))))) + (scope-cl-lambda-1 local (list '&rest arglist) more body))) (more (scope-cl-lambda-1 local (car more) (cdr more) body)) (t (scope-lambda local nil body)))) @@ -941,6 +943,11 @@ Optional argument LOCAL is a local context to extend." (not (cddr var)) ;; VAR is (KEYWORD VAR) (setq var (cadr var))) + (when-let ((bare (scope-sym-bare kw)) + ((keywordp bare))) + (when-let ((beg (scope-sym-pos kw))) + (funcall scope-callback 'constant beg (length (symbol-name bare)) nil)) + (setq l (scope-local-new bare (scope-sym-pos svar) l))) (if (consp var) (scope-cl-lambda-1 l var (cons (append (when svar (list svar)) (cons '&key arglist)) @@ -1279,6 +1286,9 @@ a (possibly empty) list of safe macros.") (scope-defmethod local (car forms) (cdr forms))) ((memq bare '(cl-defun cl-defmacro)) (scope-cl-defun local (car forms) (cadr forms) (cddr forms))) + ((memq bare '(cl-destructuring-bind)) + (scope-1 local (cadr forms)) + (scope-cl-lambda local (car forms) (cddr forms))) ((memq bare '(declare-function)) (scope-declare-function local (car forms) (cadr forms) (caddr forms) (cadddr forms))) -- 2.39.5