aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorStephen Leake2015-08-11 14:28:17 -0500
committerStephen Leake2015-08-11 14:29:34 -0500
commit85f7e5115f9f409126d355997e8103ea5126ada2 (patch)
treea70e6c131fa45969de0efd7dca0eca681581f7df /test
parent6171d5b1f9edb09ca43c219f08e7a372de8740b2 (diff)
downloademacs-85f7e5115f9f409126d355997e8103ea5126ada2.tar.gz
emacs-85f7e5115f9f409126d355997e8103ea5126ada2.zip
elisp--xref-find-definitions handle cl-defstuct default constructor
* lisp/progmodes/elisp-mode.el (elisp-xref-find): Add FIXME. (elisp--xref-format-extra): Rename from elisp--xref-format-cl-defmethod. (elisp--xref-find-definitions): Handle cl-defstuct default constructor. * test/automated/elisp-mode-tests.el (xref-elisp-test-run): Split out from xref-elisp-test for ease of debugging. (xref-elisp-deftest): Rename from xref-elisp-test. (find-defs-constructor): New test. (find-defs-defgeneric-el): Match batch test config. (compile): Required for find-defs compilation-minor-mode test. (find-defs-defvar-el): Match code change. (find-defs-face-el): Match code change. * lisp/progmodes/xref.el (xref-find-function, xref-find-definitions): Improve doc string.
Diffstat (limited to 'test')
-rw-r--r--test/automated/elisp-mode-tests.el121
1 files changed, 58 insertions, 63 deletions
diff --git a/test/automated/elisp-mode-tests.el b/test/automated/elisp-mode-tests.el
index 114b71cfc63..9b4014a8a55 100644
--- a/test/automated/elisp-mode-tests.el
+++ b/test/automated/elisp-mode-tests.el
@@ -176,28 +176,30 @@
176 ))) 176 )))
177 177
178 178
179(defmacro xref-elisp-test (name computed-xrefs expected-xrefs) 179(defun xref-elisp-test-run (xrefs expecteds)
180 (while xrefs
181 (should (= (length xrefs) (length expecteds)))
182 (let ((xref (pop xrefs))
183 (expected (pop expecteds)))
184
185 (should (equal xref
186 (or (when (consp expected) (car expected)) expected)))
187
188 (xref--goto-location (xref-item-location xref))
189 (should (looking-at (or (when (consp expected) (cdr expected))
190 (xref-elisp-test-descr-to-target expected)))))
191 ))
192
193(defmacro xref-elisp-deftest (name computed-xrefs expected-xrefs)
180 "Define an ert test for an xref-elisp feature. 194 "Define an ert test for an xref-elisp feature.
181COMPUTED-XREFS and EXPECTED-XREFS are lists of xrefs, except if 195COMPUTED-XREFS and EXPECTED-XREFS are lists of xrefs, except if
182an element of EXPECTED-XREFS is a cons (XREF . TARGET), TARGET is 196an element of EXPECTED-XREFS is a cons (XREF . TARGET), TARGET is
183matched to the found location; otherwise, match 197matched to the found location; otherwise, match
184to (xref-elisp-test-descr-to-target xref)." 198to (xref-elisp-test-descr-to-target xref)."
185 (declare (indent defun)) 199 (declare (indent defun)
186 (declare (debug (symbolp "name"))) 200 (debug (symbolp "name")))
187 `(ert-deftest ,(intern (concat "xref-elisp-test-" (symbol-name name))) () 201 `(ert-deftest ,(intern (concat "xref-elisp-test-" (symbol-name name))) ()
188 (let ((xrefs ,computed-xrefs) 202 (xref-elisp-test-run ,computed-xrefs ,expected-xrefs)
189 (expecteds ,expected-xrefs))
190 (while xrefs
191 (let ((xref (pop xrefs))
192 (expected (pop expecteds)))
193
194 (should (equal xref
195 (or (when (consp expected) (car expected)) expected)))
196
197 (xref--goto-location (xref-item-location xref))
198 (should (looking-at (or (when (consp expected) (cdr expected))
199 (xref-elisp-test-descr-to-target expected)))))
200 ))
201 )) 203 ))
202 204
203;; When tests are run from the Makefile, 'default-directory' is $HOME, 205;; When tests are run from the Makefile, 'default-directory' is $HOME,
@@ -212,7 +214,22 @@ to (xref-elisp-test-descr-to-target xref)."
212;; FIXME: defalias-defun-c cmpl-prefix-entry-head 214;; FIXME: defalias-defun-c cmpl-prefix-entry-head
213;; FIXME: defalias-defvar-el allout-mode-map 215;; FIXME: defalias-defvar-el allout-mode-map
214 216
215(xref-elisp-test find-defs-defalias-defun-el 217(xref-elisp-deftest find-defs-constructor
218 (elisp--xref-find-definitions 'xref-make-elisp-location)
219 ;; 'xref-make-elisp-location' is just a name for the default
220 ;; constructor created by the cl-defstruct, so the location is the
221 ;; cl-defstruct location.
222 (list
223 (cons
224 (xref-make "(cl-defstruct (xref-elisp-location (:constructor xref-make-elisp-location)))"
225 (xref-make-elisp-location
226 'xref-elisp-location 'define-type
227 (expand-file-name "../../lisp/progmodes/elisp-mode.el" emacs-test-dir)))
228 ;; It's not worth adding another special case to `xref-elisp-test-descr-to-target' for this
229 "(cl-defstruct (xref-elisp-location")
230 ))
231
232(xref-elisp-deftest find-defs-defalias-defun-el
216 (elisp--xref-find-definitions 'Buffer-menu-sort) 233 (elisp--xref-find-definitions 'Buffer-menu-sort)
217 (list 234 (list
218 (xref-make "(defalias Buffer-menu-sort)" 235 (xref-make "(defalias Buffer-menu-sort)"
@@ -227,7 +244,7 @@ to (xref-elisp-test-descr-to-target xref)."
227 244
228;; FIXME: defconst 245;; FIXME: defconst
229 246
230(xref-elisp-test find-defs-defgeneric-el 247(xref-elisp-deftest find-defs-defgeneric-el
231 (elisp--xref-find-definitions 'xref-location-marker) 248 (elisp--xref-find-definitions 'xref-location-marker)
232 (list 249 (list
233 (xref-make "(cl-defgeneric xref-location-marker)" 250 (xref-make "(cl-defgeneric xref-location-marker)"
@@ -250,20 +267,14 @@ to (xref-elisp-test-descr-to-target xref)."
250 (xref-make-elisp-location 267 (xref-make-elisp-location
251 '(xref-location-marker xref-bogus-location) 'cl-defmethod 268 '(xref-location-marker xref-bogus-location) 'cl-defmethod
252 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir))) 269 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir)))
253 (xref-make "(cl-defmethod xref-location-marker ((l xref-etags-location)))" 270 ;; etags is not loaded at test time
254 (xref-make-elisp-location
255 '(xref-location-marker xref-etags-location) 'cl-defmethod
256 (expand-file-name "../../lisp/progmodes/etags.el" emacs-test-dir)))
257 )) 271 ))
258 272
259;; FIXME: constructor xref-make-elisp-location; location is 273(xref-elisp-deftest find-defs-defgeneric-eval
260;; cl-defstruct location. use :constructor in description.
261
262(xref-elisp-test find-defs-defgeneric-eval
263 (elisp--xref-find-definitions (eval '(cl-defgeneric stephe-leake-cl-defgeneric ()))) 274 (elisp--xref-find-definitions (eval '(cl-defgeneric stephe-leake-cl-defgeneric ())))
264 nil) 275 nil)
265 276
266(xref-elisp-test find-defs-defun-el 277(xref-elisp-deftest find-defs-defun-el
267 (elisp--xref-find-definitions 'xref-find-definitions) 278 (elisp--xref-find-definitions 'xref-find-definitions)
268 (list 279 (list
269 (xref-make "(defun xref-find-definitions)" 280 (xref-make "(defun xref-find-definitions)"
@@ -271,11 +282,11 @@ to (xref-elisp-test-descr-to-target xref)."
271 'xref-find-definitions nil 282 'xref-find-definitions nil
272 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir))))) 283 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir)))))
273 284
274(xref-elisp-test find-defs-defun-eval 285(xref-elisp-deftest find-defs-defun-eval
275 (elisp--xref-find-definitions (eval '(defun stephe-leake-defun ()))) 286 (elisp--xref-find-definitions (eval '(defun stephe-leake-defun ())))
276 nil) 287 nil)
277 288
278(xref-elisp-test find-defs-defun-c 289(xref-elisp-deftest find-defs-defun-c
279 (elisp--xref-find-definitions 'buffer-live-p) 290 (elisp--xref-find-definitions 'buffer-live-p)
280 (list 291 (list
281 (xref-make "(defun buffer-live-p)" 292 (xref-make "(defun buffer-live-p)"
@@ -283,7 +294,7 @@ to (xref-elisp-test-descr-to-target xref)."
283 294
284;; FIXME: deftype 295;; FIXME: deftype
285 296
286(xref-elisp-test find-defs-defun-c-defvar-c 297(xref-elisp-deftest find-defs-defun-c-defvar-c
287 (elisp-xref-find 'definitions "system-name") 298 (elisp-xref-find 'definitions "system-name")
288 (list 299 (list
289 (xref-make "(defvar system-name)" 300 (xref-make "(defvar system-name)"
@@ -292,7 +303,7 @@ to (xref-elisp-test-descr-to-target xref)."
292 (xref-make-elisp-location 'system-name nil "src/editfns.c"))) 303 (xref-make-elisp-location 'system-name nil "src/editfns.c")))
293 ) 304 )
294 305
295(xref-elisp-test find-defs-defun-el-defvar-c 306(xref-elisp-deftest find-defs-defun-el-defvar-c
296 (elisp-xref-find 'definitions "abbrev-mode") 307 (elisp-xref-find 'definitions "abbrev-mode")
297 ;; It's a minor mode, but the variable is defined in buffer.c 308 ;; It's a minor mode, but the variable is defined in buffer.c
298 (list 309 (list
@@ -310,42 +321,34 @@ to (xref-elisp-test-descr-to-target xref)."
310;; compilation-minor-mode". There is no way to tell that from the 321;; compilation-minor-mode". There is no way to tell that from the
311;; symbol. find-function-regexp-alist uses find-function-regexp for 322;; symbol. find-function-regexp-alist uses find-function-regexp for
312;; this, but that matches too many things for use in this test. 323;; this, but that matches too many things for use in this test.
313(xref-elisp-test find-defs-defun-defvar-el 324(require 'compile) ;; not loaded by default at test time
325(xref-elisp-deftest find-defs-defun-defvar-el
314 (elisp--xref-find-definitions 'compilation-minor-mode) 326 (elisp--xref-find-definitions 'compilation-minor-mode)
315 (list 327 (list
316 (cons 328 (cons
317 (xref-make "(defun compilation-minor-mode)"
318 (xref-make-elisp-location
319 'compilation-minor-mode nil
320 (expand-file-name "../../lisp/progmodes/compile.el" emacs-test-dir)))
321 "(define-minor-mode compilation-minor-mode")
322 (cons
323 (xref-make "(defvar compilation-minor-mode)" 329 (xref-make "(defvar compilation-minor-mode)"
324 (xref-make-elisp-location 330 (xref-make-elisp-location
325 'compilation-minor-mode 'defvar 331 'compilation-minor-mode 'defvar
326 (expand-file-name "../../lisp/progmodes/compile.el" emacs-test-dir))) 332 (expand-file-name "../../lisp/progmodes/compile.el" emacs-test-dir)))
327 "(define-minor-mode compilation-minor-mode") 333 "(define-minor-mode compilation-minor-mode")
328 ) 334 (cons
329 ) 335 (xref-make "(defun compilation-minor-mode)"
336 (xref-make-elisp-location
337 'compilation-minor-mode nil
338 (expand-file-name "../../lisp/progmodes/compile.el" emacs-test-dir)))
339 "(define-minor-mode compilation-minor-mode")
340 ))
330 341
331(xref-elisp-test find-defs-defvar-el 342(xref-elisp-deftest find-defs-defvar-el
332 (elisp--xref-find-definitions 'xref--marker-ring) 343 (elisp--xref-find-definitions 'xref--marker-ring)
333 ;; This is a defconst, which creates an alias and a variable.
334 ;; FIXME: try not to show the alias in this case
335 (list 344 (list
336 (xref-make "(defvar xref--marker-ring)" 345 (xref-make "(defvar xref--marker-ring)"
337 (xref-make-elisp-location 346 (xref-make-elisp-location
338 'xref--marker-ring 'defvar 347 'xref--marker-ring 'defvar
339 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir))) 348 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir)))
340 (cons
341 (xref-make "(defalias xref--marker-ring)"
342 (xref-make-elisp-location
343 'xref--marker-ring 'defalias
344 (expand-file-name "../../lisp/progmodes/xref.elc" emacs-test-dir)))
345 "(defvar xref--marker-ring")
346 )) 349 ))
347 350
348(xref-elisp-test find-defs-defvar-c 351(xref-elisp-deftest find-defs-defvar-c
349 (elisp--xref-find-definitions 'default-directory) 352 (elisp--xref-find-definitions 'default-directory)
350 (list 353 (list
351 (cons 354 (cons
@@ -354,15 +357,13 @@ to (xref-elisp-test-descr-to-target xref)."
354 ;; IMPROVEME: we might be able to compute this target 357 ;; IMPROVEME: we might be able to compute this target
355 "DEFVAR_PER_BUFFER (\"default-directory\""))) 358 "DEFVAR_PER_BUFFER (\"default-directory\"")))
356 359
357(xref-elisp-test find-defs-defvar-eval 360(xref-elisp-deftest find-defs-defvar-eval
358 (elisp--xref-find-definitions (eval '(defvar stephe-leake-defvar nil))) 361 (elisp--xref-find-definitions (eval '(defvar stephe-leake-defvar nil)))
359 nil) 362 nil)
360 363
361(xref-elisp-test find-defs-face-el 364(xref-elisp-deftest find-defs-face-el
362 (elisp--xref-find-definitions 'font-lock-keyword-face) 365 (elisp--xref-find-definitions 'font-lock-keyword-face)
363 ;; 'font-lock-keyword-face is both a face and a var 366 ;; 'font-lock-keyword-face is both a face and a var
364 ;; defface creates both a face and an alias
365 ;; FIXME: try to not show the alias in this case
366 (list 367 (list
367 (xref-make "(defvar font-lock-keyword-face)" 368 (xref-make "(defvar font-lock-keyword-face)"
368 (xref-make-elisp-location 369 (xref-make-elisp-location
@@ -372,19 +373,13 @@ to (xref-elisp-test-descr-to-target xref)."
372 (xref-make-elisp-location 373 (xref-make-elisp-location
373 'font-lock-keyword-face 'defface 374 'font-lock-keyword-face 'defface
374 (expand-file-name "../../lisp/font-lock.el" emacs-test-dir))) 375 (expand-file-name "../../lisp/font-lock.el" emacs-test-dir)))
375 (cons
376 (xref-make "(defalias font-lock-keyword-face)"
377 (xref-make-elisp-location
378 'font-lock-keyword-face 'defalias
379 (expand-file-name "../../lisp/font-lock.elc" emacs-test-dir)))
380 "(defface font-lock-keyword-face")
381 )) 376 ))
382 377
383(xref-elisp-test find-defs-face-eval 378(xref-elisp-deftest find-defs-face-eval
384 (elisp--xref-find-definitions (eval '(defface stephe-leake-defface nil ""))) 379 (elisp--xref-find-definitions (eval '(defface stephe-leake-defface nil "")))
385 nil) 380 nil)
386 381
387(xref-elisp-test find-defs-feature-el 382(xref-elisp-deftest find-defs-feature-el
388 (elisp--xref-find-definitions 'xref) 383 (elisp--xref-find-definitions 'xref)
389 (list 384 (list
390 (xref-make "(feature xref)" 385 (xref-make "(feature xref)"
@@ -392,7 +387,7 @@ to (xref-elisp-test-descr-to-target xref)."
392 'xref 'feature 387 'xref 'feature
393 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir))))) 388 (expand-file-name "../../lisp/progmodes/xref.el" emacs-test-dir)))))
394 389
395(xref-elisp-test find-defs-feature-eval 390(xref-elisp-deftest find-defs-feature-eval
396 (elisp--xref-find-definitions (eval '(provide 'stephe-leake-feature))) 391 (elisp--xref-find-definitions (eval '(provide 'stephe-leake-feature)))
397 nil) 392 nil)
398 393