Function: xref-mode-local-overload
xref-mode-local-overload is a byte-compiled function defined in
mode-local.el.gz.
Signature
(xref-mode-local-overload SYMBOL)
Documentation
For elisp-xref-find-def-functions; add overloads for SYMBOL.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/mode-local.el.gz
(defun xref-mode-local-overload (symbol)
"For `elisp-xref-find-def-functions'; add overloads for SYMBOL."
;; Current buffer is the buffer where xref-find-definitions was invoked.
(when (mode-local--function-overload-p symbol)
(let* ((symbol-file (find-lisp-object-file-name
symbol (symbol-function symbol)))
(default (intern-soft (format "%s-default" (symbol-name symbol))))
(default-file (when default (find-lisp-object-file-name
default (symbol-function default))))
modes
xrefs)
(mapatoms
(lambda (sym) (when (get sym 'mode-local-symbol-table) (push sym modes)))
obarray)
;; mode-local-overrides are inherited from parent modes; we
;; don't want to list the same function twice. So order ‘modes’
;; with parents first, and check for duplicates.
(setq modes
(sort modes
(lambda (a b)
;; a is not a child, or not a child of b
(not (equal b (get a 'mode-local-parent))))))
(dolist (mode modes)
(let* ((major-mode mode)
(override (fetch-overload symbol))
(override-file (when override
(find-lisp-object-file-name
override (symbol-function override)))))
(when (and override override-file)
(let ((meta-name (cons override major-mode))
;; For the declaration:
;;
;;(define-mode-local-override xref-elisp-foo c-mode
;;
;; The override symbol name is
;; "xref-elisp-foo-c-mode". The summary should match
;; the declaration, so strip the mode from the
;; symbol name.
(summary (format elisp--xref-format-extra
'define-mode-local-override
(substring (symbol-name override) 0 (- (1+ (length (symbol-name major-mode)))))
major-mode)))
(unless (xref-mode-local--override-present override xrefs)
(push (elisp--xref-make-xref
'define-mode-local-override meta-name override-file summary)
xrefs))))))
;; %s-default is interned whether it is a separate function or
;; not, so we have to check that here.
(when (and (functionp default) default-file)
(push (elisp--xref-make-xref nil default default-file) xrefs))
(when symbol-file
(push (elisp--xref-make-xref 'define-overloadable-function
symbol symbol-file)
xrefs))
xrefs)))