[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/xref-find-extra 0ee767e92c2 2/3: Rename xref-find-definitions-by
From: |
Dmitry Gutov |
Subject: |
feature/xref-find-extra 0ee767e92c2 2/3: Rename xref-find-definitions-by-kind to xref-find-all-definitions |
Date: |
Thu, 23 Nov 2023 20:25:55 -0500 (EST) |
branch: feature/xref-find-extra
commit 0ee767e92c2283f154a7a6f03c6dd35b7265bfd2
Author: Dmitry Gutov <dmitry@gutov.dev>
Commit: Dmitry Gutov <dmitry@gutov.dev>
Rename xref-find-definitions-by-kind to xref-find-all-definitions
* lisp/progmodes/xref.el (xref-find-all-definitions): Rename from
'xref-find-definitions-by-kind' and change accordingly. Meaning
it collects definitions from all "kinds" by default (passing
through 'delete-dups', which only works if the items are
structurally the same) and asks for specific KIND only when called
with a prefix argument.
---
lisp/progmodes/xref.el | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 5f76ec440b4..59e496cb08c 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1640,10 +1640,11 @@ Use \\[xref-go-back] to return back to where you
invoked this command."
(xref--find-definitions identifier 'frame))
;;;###autoload
-(defun xref-find-definitions-by-kind (identifier &optional kind)
+(defun xref-find-all-definitions (identifier &optional kind)
"Find definitions of specific KIND for IDENTIFIER.
Interactively with prefix argument, or when there's no identifier
-at point, prompt for the identifier. Interactively, always
+at point, prompt for the identifier. Interactively, show matches
+for all supported kinds. When invoked with prefix argument,
prompt for KIND.
If only one location is found, display it in the selected window.
@@ -1656,18 +1657,35 @@ Use \\[xref-go-back] to return back to where you
invoked this command."
;; XXX: Choose the definition kind first? That would fail
;; to take advantage of the symbol-at-point, though.
(kinds (xref-backend-definition-kinds (xref-find-backend) id))
+ (_ (unless kinds (user-error "No supported kinds")))
;; FIXME: We should probably skip asking when there's just
;; one available kind, but let's keep completing-read while
;; collecting the initial feedback about the interface.
- (kind ;; (if (cdr kinds)
- (completing-read "Definition kind: " kinds nil t nil nil (car
kinds))
- ;; (car kinds)
- ;; )
- ))
- (unless kind (user-error "No supported kinds"))
+ (kind
+ (if current-prefix-arg
+ ;; (if (cdr kinds)
+ (completing-read "Definition kind: " kinds nil t nil nil (car
kinds))
+ ;; (car kinds)
+ 'all)))
(list id kind)))
(xref--show-defs
- (xref--create-fetcher identifier 'definitions-by-kind identifier kind)
+ (if (eq kind 'all)
+ (let ((fetchers
+ (mapcar (lambda (kind)
+ (xref--create-fetcher identifier 'definitions-by-kind
+ identifier kind))
+ (xref-backend-definition-kinds (xref-find-backend)
identifier))))
+ (lambda ()
+ (or
+ (delete-dups
+ (apply #'nconc (mapcar
+ (lambda (fetcher)
+ (condition-case nil
+ (funcall fetcher)
+ (user-error nil)))
+ fetchers)))
+ (user-error "Nothing found"))))
+ (xref--create-fetcher identifier 'definitions-by-kind identifier kind))
nil))
;;;###autoload
@@ -1770,7 +1788,7 @@ output of this command when the backend is etags."
;;;###autoload (define-key esc-map [?\C-,] #'xref-go-forward)
;;;###autoload (define-key esc-map "?" #'xref-find-references)
;;;###autoload (define-key esc-map [?\C-.] #'xref-find-apropos)
-;;;###autoload (define-key esc-map "'" #'xref-find-definitions-by-kind)
+;;;###autoload (define-key esc-map "'" #'xref-find-all-definitions)
;;;###autoload (define-key ctl-x-4-map "."
#'xref-find-definitions-other-window)
;;;###autoload (define-key ctl-x-5-map "." #'xref-find-definitions-other-frame)