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)))