-
Notifications
You must be signed in to change notification settings - Fork 6
/
function.lisp
49 lines (44 loc) · 2.13 KB
/
function.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(defpackage #:40ants-doc/locatives/function
(:use #:cl)
(:import-from #:40ants-doc/locatives/base
#:locate-error
#:locate-object
#:define-locative-type)
(:import-from #:swank-backend)
(:import-from #:swank-mop)
(:import-from #:40ants-doc/reference-api
#:canonical-reference)
(:import-from #:40ants-doc/builder/bullet)
(:import-from #:40ants-doc/render/args)
(:import-from #:40ants-doc/args)
(:import-from #:40ants-doc/document
#:document-object)
(:import-from #:40ants-doc/reference)
(:import-from #:40ants-doc/args)
(:import-from #:40ants-doc/render/print))
(in-package 40ants-doc/locatives/function)
(define-locative-type function ()
"Note that the arglist in the generated documentation depends on
the quality of SWANK-BACKEND:ARGLIST. It may be that default
values of optional and keyword arguments are missing.")
(defmethod locate-object (symbol (locative-type (eql 'function)) locative-args)
(declare (ignore locative-args))
(when (macro-function symbol)
(locate-error "~S is a macro, not a function." symbol))
(let ((function (symbol-function symbol)))
(when (typep function 'generic-function)
(locate-error "~S is a generic function, not a plain function." symbol))
function))
(defmethod canonical-reference ((function function))
(40ants-doc/reference::make-reference (swank-backend:function-name function) 'function))
(defmethod document-object ((function function) stream)
(let ((reference (canonical-reference function)))
(40ants-doc/builder/bullet::print-bullet reference stream)
(write-char #\Space stream)
(let ((arglist (swank-backend:arglist function)))
(40ants-doc/render/args::print-arglist arglist stream)
(40ants-doc/builder/bullet::print-end-bullet stream)
(40ants-doc/args::with-dislocated-symbols ((40ants-doc/args::function-arg-names arglist))
(40ants-doc/render/print::maybe-print-docstring (40ants-doc/reference::reference-object reference)
'function
stream)))))