From 715ea9e33d18f5ced08101e2d95261c52b4814e8 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Tue, 25 Feb 2025 20:57:48 +0100 Subject: [PATCH] Recognize extracted functions as such --- lisp/emacs-lisp/scope.el | 8 ++++++-- lisp/progmodes/refactor-elisp.el | 7 +++++++ lisp/progmodes/refactor.el | 11 +++++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lisp/emacs-lisp/scope.el b/lisp/emacs-lisp/scope.el index d37db1e64f0..9c8c5a24748 100644 --- a/lisp/emacs-lisp/scope.el +++ b/lisp/emacs-lisp/scope.el @@ -30,6 +30,8 @@ (defvar scope-counter nil) +(defvar scope-local-functions nil) + (defvar scope--local nil) (defvar scope-callback #'ignore) @@ -1530,7 +1532,6 @@ a (possibly empty) list of safe macros.") ;; Hence we cannot interpret their arguments. ) ((setq this (function-get bare 'scope-analyzer)) (apply this local form)) - ((functionp bare) (scope-report-s f 'function) (scope-n local forms)) ((special-form-p bare) (scope-report-s f 'special-form) (scope-n local forms)) ((macrop bare) (scope-report-s f 'macro) (cond @@ -1539,11 +1540,14 @@ a (possibly empty) list of safe macros.") (let* ((warning-minimum-log-level :emergency) (macroexp-inhibit-compiler-macros t) (symbols-with-pos-enabled t) + (message-log-max nil) + (inhibit-message t) (macroexpand-all-environment (append (mapcar #'list scope-unsafe-macros) macroexpand-all-environment)) (expanded (ignore-errors (macroexpand-1 form macroexpand-all-environment)))) (scope-1 local expanded))))) - (scope-assume-func-p (scope-report-s f 'function) (scope-n local forms)))))) + ((or (functionp bare) (memq bare scope-local-functions) scope-assume-func-p) + (scope-report-s f 'function) (scope-n local forms)))))) ((symbol-with-pos-p form) (scope-s local form)))) (defun scope-n (local body) (dolist (form body) (scope-1 local form))) diff --git a/lisp/progmodes/refactor-elisp.el b/lisp/progmodes/refactor-elisp.el index 1d0688178b8..9e41d07ba0b 100644 --- a/lisp/progmodes/refactor-elisp.el +++ b/lisp/progmodes/refactor-elisp.el @@ -109,5 +109,12 @@ ;; Replace `beg'-`end' region with call to `new' function. (,beg ,end ,(concat "(" new (when bound " ") vstr ")")))))))) +(defvar scope-local-functions) + +(cl-defmethod refactor-backend-extract-done ((_backend (eql elisp)) new) + (let ((sym (intern new))) + (unless (memq sym scope-local-functions) + (setq-local scope-local-functions (cons sym scope-local-functions))))) + (provide 'refactor-elisp) ;;; refactor-elisp.el ends here diff --git a/lisp/progmodes/refactor.el b/lisp/progmodes/refactor.el index 24e8bdf2d65..d02c4df2d10 100644 --- a/lisp/progmodes/refactor.el +++ b/lisp/progmodes/refactor.el @@ -123,10 +123,11 @@ operations that BACKEND supports.") (when-let ((err (refactor-backend-extract-validate-region backend beg end))) (user-error "Cannot extract region: %s" err)) (deactivate-mark) - (refactor-apply-edits - (refactor-backend-extract-edits - backend (region-beginning) (region-end) - (refactor-backend-read-new-function-name backend))))) + (let ((new (refactor-backend-read-new-function-name backend))) + (refactor-apply-edits + (refactor-backend-extract-edits + backend (region-beginning) (region-end) new)) + (refactor-backend-extract-done backend new)))) ;;;###autoload (defun refactor-rename (backend) @@ -238,6 +239,8 @@ region is not valid.") See `refactor-apply-edits' for the format of the return value.") +(cl-defgeneric refactor-backend-extract-done (backend new)) + (cl-defgeneric refactor-backend-rename-edits (backend old new scope) "Return alist of edits for renaming OLD to NEW across SCOPE using BACKEND. -- 2.39.5