From feb9906cece4a1fbce6417e9225a937aa7e8c830 Mon Sep 17 00:00:00 2001 From: Jens Schmidt Date: Fri, 29 Sep 2023 22:04:43 +0200 Subject: [PATCH] Silence macro expansion during completion-at-point * lisp/emacs-lisp/macroexp.el (macroexp-inhibit-compiler-macros): Add variable. (macroexp--compiler-macro): Inspect that new variable and, if it is non-nil, return the input form unchanged. * lisp/progmodes/elisp-mode.el (elisp--local-variables): Silence messages. Avoid compiler macros. Suppress all errors during macro expansion. (Bug#58396) --- lisp/emacs-lisp/macroexp.el | 20 ++++++++++++++------ lisp/progmodes/elisp-mode.el | 12 ++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el index 3ef924a5c73..6eb670d6dc1 100644 --- a/lisp/emacs-lisp/macroexp.el +++ b/lisp/emacs-lisp/macroexp.el @@ -105,13 +105,21 @@ macroexp--all-clauses (macroexp--all-forms clause skip) clause))) +(defvar macroexp-inhibit-compiler-macros nil + "Inhibit application of compiler macros if non-nil.") + (defun macroexp--compiler-macro (handler form) - (condition-case-unless-debug err - (apply handler form (cdr form)) - (error - (message "Warning: Optimization failure for %S: Handler: %S\n%S" - (car form) handler err) - form))) + "Apply compiler macro HANDLER to FORM and return the result. +Unless `macroexp-inhibit-compiler-macros' is non-nil, in which +case return FORM unchanged." + (if macroexp-inhibit-compiler-macros + form + (condition-case-unless-debug err + (apply handler form (cdr form)) + (error + (message "Warning: Optimization failure for %S: Handler: %S\n%S" + (car form) handler err) + form)))) (defun macroexp--funcall-if-compiled (_form) "Pseudo function used internally by macroexp to delay warnings. diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index 664299df288..434b493ed55 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -458,11 +458,19 @@ elisp--local-variables (apply expander form args) ((debug error) (message "Ignoring macroexpansion error: %S" err) form)))) + ;; Avoid any macro expansion errors when attempting + ;; completion at point (bug#58148). As Stefan suggested + ;; there: Silence messages [1], avoid compiler macros + ;; [2], and suppress all errors [3]. (sexp (unwind-protect - (let ((warning-minimum-log-level :emergency)) + (let ((inhibit-message t) ;[1] + (macroexp-inhibit-compiler-macros t) ;[2] + (warning-minimum-log-level :emergency)) (advice-add 'macroexpand-1 :around macroexpand-advice) - (macroexpand-all sexp elisp--local-macroenv)) + (condition-case nil ;[3] + (macroexpand-all sexp elisp--local-macroenv) + (t sexp))) (advice-remove 'macroexpand-1 macroexpand-advice))) (vars (elisp--local-variables-1 nil sexp))) (delq nil -- 2.30.2