\f
;;;; 3 arguments
-(defgeneric add-boundp-method (class generic-function slot-name))
-
-(defgeneric add-reader-method (class generic-function slot-name))
-
-(defgeneric add-writer-method (class generic-function slot-name))
-
(defgeneric (setf class-slot-value) (nv class slot-name))
;;; CMUCL comment (from Gerd Moellmann/Pierre Mai, 2002-10-19):
\f
;;;; 4 arguments
+(defgeneric add-boundp-method (class generic-function slot-name slot-documentation))
+
+(defgeneric add-reader-method (class generic-function slot-name slot-documentation))
+
+(defgeneric add-writer-method (class generic-function slot-name slot-documentation))
+
(defgeneric make-method-lambda (proto-generic-function
proto-method
lambda-expression
(fix-slot-accessors class dslotds 'remove))
(defun fix-slot-accessors (class dslotds add/remove)
- (flet ((fix (gfspec name r/w)
+ (flet ((fix (gfspec name r/w doc)
(let ((gf (cond ((eq add/remove 'add)
(or (find-generic-function gfspec nil)
(ensure-generic-function
(when gf
(case r/w
(r (if (eq add/remove 'add)
- (add-reader-method class gf name)
+ (add-reader-method class gf name doc)
(remove-reader-method class gf)))
(w (if (eq add/remove 'add)
- (add-writer-method class gf name)
+ (add-writer-method class gf name doc)
(remove-writer-method class gf))))))))
(dolist (dslotd dslotds)
- (let ((slot-name (slot-definition-name dslotd)))
+ (let ((slot-name (slot-definition-name dslotd))
+ (slot-doc (%slot-definition-documentation dslotd)))
(dolist (r (slot-definition-readers dslotd))
- (fix r slot-name 'r))
+ (fix r slot-name 'r slot-doc))
(dolist (w (slot-definition-writers dslotd))
- (fix w slot-name 'w))))))
+ (fix w slot-name 'w slot-doc))))))
\f
(defun add-direct-subclasses (class supers)
(dolist (super supers)
(declare (ignore direct-slot initargs))
(find-class 'standard-reader-method))
-(defmethod add-reader-method ((class slot-class) generic-function slot-name)
+(defmethod add-reader-method ((class slot-class) generic-function slot-name slot-documentation)
(add-method generic-function
(make-a-method 'standard-reader-method
()
(list (or (class-name class) 'object))
(list class)
(make-reader-method-function class slot-name)
- "automatically generated reader method"
+ (or slot-documentation "automatically generated reader method")
:slot-name slot-name
:object-class class
:method-class-function #'reader-method-class)))
(declare (ignore direct-slot initargs))
(find-class 'standard-writer-method))
-(defmethod add-writer-method ((class slot-class) generic-function slot-name)
+(defmethod add-writer-method ((class slot-class) generic-function slot-name slot-documentation)
(add-method generic-function
(make-a-method 'standard-writer-method
()
(list 'new-value (or (class-name class) 'object))
(list *the-class-t* class)
(make-writer-method-function class slot-name)
- "automatically generated writer method"
+ (or slot-documentation "automatically generated writer method")
:slot-name slot-name
:object-class class
:method-class-function #'writer-method-class)))
-(defmethod add-boundp-method ((class slot-class) generic-function slot-name)
+(defmethod add-boundp-method ((class slot-class) generic-function slot-name slot-documentation)
(add-method generic-function
(make-a-method (constantly (find-class 'standard-boundp-method))
class
(list (or (class-name class) 'object))
(list class)
(make-boundp-method-function class slot-name)
- "automatically generated boundp method"
+ (or slot-documentation "automatically generated boundp method")
slot-name)))
(defmethod remove-reader-method ((class slot-class) generic-function)
(assert (raises-error? (funcall fun *foo*)))
(assert (= 3 (b-of *foo*)))
(assert (raises-error? (c-of *foo*)))))
+
+;; test that :documentation argument to slot specifiers are used as
+;; the docstrings of accessor methods.
+(defclass foo ()
+ ((a :reader a-of :documentation "docstring for A")
+ (b :writer set-b-of :documentation "docstring for B")
+ (c :accessor c :documentation "docstring for C")))
+
+(flet ((doc (fun)
+ (documentation fun t)))
+ (assert (string= (doc (find-method #'a-of nil '((foo)))) "docstring for A"))
+ (assert (string= (doc (find-method #'set-b-of nil '(t (foo)))) "docstring for B"))
+ (assert (string= (doc (find-method #'c nil '((foo)))) "docstring for C"))
+ (assert (string= (doc (find-method #'(setf c) nil '(t (foo)))) "docstring for C")))