]> git.eshelyaron.com Git - emacs.git/commitdiff
Change xref-find-apropos to pass PATTERN to backend verbatim
authorDmitry Gutov <dgutov@yandex.ru>
Mon, 1 Jun 2020 01:44:33 +0000 (04:44 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Mon, 1 Jun 2020 02:28:43 +0000 (05:28 +0300)
* lisp/progmodes/xref.el (xref-backend-apropos): Rename this
generic's second arg to PATTERN, to clarify that it should be
handled entirely in the backend, with no pre-processing by the
command.
(xref-find-apropos): Update accordingly, but keep compatibility
with backends in older Emacs versions.
(xref-apropos-regexp): Extract from xref-find-apropos.

* lisp/progmodes/etags.el (xref-backend-apropos): Use it here.

* lisp/progmodes/elisp-mode.el (xref-backend-apropos): And here.

lisp/progmodes/elisp-mode.el
lisp/progmodes/etags.el
lisp/progmodes/xref.el

index d37eb8c152dae04c72d43e536d1bd150ac431e74..a0a0a0dc6a9149feefe84eb3309466857a29f1d0 100644 (file)
@@ -863,9 +863,10 @@ non-nil result supercedes the xrefs produced by
 
 (declare-function project-external-roots "project")
 
-(cl-defmethod xref-backend-apropos ((_backend (eql elisp)) regexp)
+(cl-defmethod xref-backend-apropos ((_backend (eql elisp)) pattern)
   (apply #'nconc
-         (let (lst)
+         (let ((regexp (xref-apropos-regexp pattern))
+               lst)
            (dolist (sym (apropos-internal regexp))
              (push (elisp--xref-find-definitions sym) lst))
            (nreverse lst))))
index 897f105019e000ae3829292c96ab702b5c022b40..edadbbdafc1c30b916e87540550f8ac431b1b56b 100644 (file)
@@ -2080,8 +2080,8 @@ file name, add `tag-partial-file-name-match-p' to the list value.")
 (cl-defmethod xref-backend-definitions ((_backend (eql etags)) symbol)
   (etags--xref-find-definitions symbol))
 
-(cl-defmethod xref-backend-apropos ((_backend (eql etags)) symbol)
-  (etags--xref-find-definitions symbol t))
+(cl-defmethod xref-backend-apropos ((_backend (eql etags)) pattern)
+  (etags--xref-find-definitions (xref-apropos-regexp pattern) t))
 
 (defun etags--xref-find-definitions (pattern &optional regexp?)
   ;; This emulates the behavior of `find-tag-in-order' but instead of
index 2477884f1abf1f1443e68a4717da4ecca66aa5af..5b5fb4bc47aa474425cae82702f96a136eda359c 100644 (file)
@@ -273,7 +273,11 @@ find a search tool; by default, this uses \"find | grep\" in the
       (project-external-roots pr)))))
 
 (cl-defgeneric xref-backend-apropos (backend pattern)
-  "Find all symbols that match regexp PATTERN.")
+  "Find all symbols that match PATTERN string.
+The second argument has the same meaning as in `apropos'.
+
+If BACKEND is implemented in Lisp, it can use
+`xref-apropos-regexp' to convert the pattern to regexp.")
 
 (cl-defgeneric xref-backend-identifier-at-point (_backend)
   "Return the relevant identifier at point.
@@ -1098,14 +1102,24 @@ The argument has the same meaning as in `apropos'."
                       "Search for pattern (word list or regexp): "
                       nil 'xref--read-pattern-history)))
   (require 'apropos)
-  (xref--find-xrefs pattern 'apropos
-                    (apropos-parse-pattern
-                     (if (string-equal (regexp-quote pattern) pattern)
-                         ;; Split into words
-                         (or (split-string pattern "[ \t]+" t)
-                             (user-error "No word list given"))
-                       pattern))
-                    nil))
+  (let* ((newpat
+          (if (and (version< emacs-version "28.0.50")
+                   (memq (xref-find-backend) '(elisp etags)))
+              ;; Handle backends in older Emacs.
+              (xref-apropos-regexp pattern)
+            ;; Delegate pattern handling to the backend fully.
+            ;; The old way didn't work for "external" backends.
+            pattern)))
+    (xref--find-xrefs pattern 'apropos newpat nil)))
+
+(defun xref-apropos-regexp (pattern)
+  "Return an Emacs regexp from PATTERN similar to `apropos'."
+  (apropos-parse-pattern
+   (if (string-equal (regexp-quote pattern) pattern)
+       ;; Split into words
+       (or (split-string pattern "[ \t]+" t)
+           (user-error "No word list given"))
+     pattern)))
 
 \f
 ;;; Key bindings