]> git.eshelyaron.com Git - emacs.git/commitdiff
Only skip some variables that have function counterparts
authorDmitry Gutov <dgutov@yandex.ru>
Tue, 5 May 2015 12:11:14 +0000 (15:11 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Tue, 5 May 2015 12:11:14 +0000 (15:11 +0300)
* lisp/progmodes/elisp-mode.el (elisp--xref-identifier-location):
Only skip minor-mode-named variable if it's defined in a Lisp
file, and it's in minor-mode-list (bug#20506).

* test/automated/elisp-mode-tests.el
(elisp-xref-finds-both-function-and-variable)
(elisp-xref-finds-only-function-for-minor-mode): New tests.

lisp/progmodes/elisp-mode.el
test/automated/elisp-mode-tests.el

index 40561515ed2fe87d7c0441e906c5f263ba8629ae..f085dcfbef34e4a356637a0a0c90f3cb346cc946 100644 (file)
@@ -604,12 +604,16 @@ It can be quoted, or be inside a quoted form."
                        (setq sym (car fun-lib))
                        (cdr fun-lib))))
            (`defvar (and (boundp sym)
-                         ;; Don't show minor modes twice.
-                         ;; TODO: If TYPE ever becomes dependent on the
-                         ;; context, move this check outside.
-                         (not (fboundp sym))
-                         (or (symbol-file sym 'defvar)
-                             (help-C-file-name sym 'var))))
+                         (let ((el-file (symbol-file sym 'defvar)))
+                           (if el-file
+                               (and
+                                ;; Don't show minor modes twice.
+                                ;; TODO: If TYPE ever becomes dependent on the
+                                ;; context, move this check outside.
+                                (not (and (fboundp sym)
+                                          (memq sym minor-mode-list)))
+                                el-file)
+                             (help-C-file-name sym 'var)))))
            (`feature (and (featurep sym)
                           ;; Skip when a function with the same name
                           ;; is defined, because it's probably in the
index bfecfe7dc6bd751ee6b2aa2165af17ea79887d13..7af6dfcdc036cb7721a8748edd5df49872fd67ba 100644 (file)
@@ -22,6 +22,9 @@
 ;;; Code:
 
 (require 'ert)
+(require 'xref)
+
+;;; Completion
 
 (defun elisp--test-completions ()
   (let ((data (elisp-completion-at-point)))
       (should (member "backup-buffer" comps))
       (should-not (member "backup-inhibited" comps)))))
 
+;;; Navigation
+
+(ert-deftest elisp-xref-finds-both-function-and-variable ()
+  ;; "system-name" is both: a variable and a function
+  (let ((defs (elisp-xref-find 'definitions "system-name")))
+    (should (= (length defs) 2))
+    (should (string= (xref--xref-description (nth 0 defs))
+                     "(defun system-name)"))
+    (should (string= (xref--xref-description (nth 1 defs))
+                     "(defvar system-name)")))
+  ;; It's a minor mode, but the variable is defined in buffer.c
+  (let ((defs (elisp-xref-find 'definitions "abbrev-mode")))
+    (should (= (length defs) 2))))
+
+(ert-deftest elisp-xref-finds-only-function-for-minor-mode ()
+  ;; Both variable and function are defined in the same place.
+  (let ((defs (elisp-xref-find 'definitions "visible-mode")))
+    (should (= (length defs) 1))
+    (should (string= (xref--xref-description (nth 0 defs))
+                     "(defun visible-mode)"))))
+
 (provide 'elisp-mode-tests)
 ;;; elisp-mode-tests.el ends here