(in-package "SB-PCL")
-;;; FIXME: Lots of bare calls to INFO here could be handled
-;;; more cleanly by calling the FDOCUMENTATION function instead.
-
(defun fun-doc (x)
- (etypecase x
- (generic-function
- (slot-value x '%documentation))
- #+sb-eval
- (sb-eval:interpreted-function
- (sb-eval:interpreted-function-documentation x))
- (function
- (%fun-doc x))))
+ (if (typep x 'generic-function)
+ (slot-value x '%documentation)
+ (%fun-doc x)))
+
+(defun (setf fun-doc) (new-value x)
+ (if (typep x 'generic-function)
+ (setf (slot-value x '%documentation) new-value)
+ (setf (%fun-doc x) new-value)))
;;; functions, macros, and special forms
(defmethod documentation ((x function) (doc-type (eql 't)))
(fun-doc x))
(defmethod documentation ((x list) (doc-type (eql 'function)))
- (and (legal-fun-name-p x)
- (fboundp x)
- (documentation (fdefinition x) t)))
+ (when (and (legal-fun-name-p x) (fboundp x))
+ (fun-doc (fdefinition x))))
(defmethod documentation ((x list) (doc-type (eql 'compiler-macro)))
- (random-documentation x 'compiler-macro))
+ (awhen (compiler-macro-function x)
+ (documentation it t)))
(defmethod documentation ((x symbol) (doc-type (eql 'function)))
- (or (values (info :function :documentation x))
- ;; Try the pcl function documentation.
- (and (fboundp x) (documentation (fdefinition x) t))))
+ (when (and (legal-fun-name-p x) (fboundp x))
+ (fun-doc (or (macro-function x) (fdefinition x)))))
(defmethod documentation ((x symbol) (doc-type (eql 'compiler-macro)))
- (random-documentation x 'compiler-macro))
+ (awhen (compiler-macro-function x)
+ (documentation it t)))
(defmethod documentation ((x symbol) (doc-type (eql 'setf)))
- (values (info :setf :documentation x)))
+ (fdocumentation x 'setf))
(defmethod documentation ((x symbol) (doc-type (eql 'optimize)))
(random-documentation x 'optimize))
-(defun (setf fun-doc) (new-value x)
- (etypecase x
- (generic-function
- (setf (slot-value x '%documentation) new-value))
- #+sb-eval
- (sb-eval:interpreted-function
- (setf (sb-eval:interpreted-function-documentation x)
- new-value))
- (function
- (let ((name (%fun-name x)))
- (when (valid-function-name-p name)
- (setf (info :function :documentation name) new-value)))))
- new-value)
-
-
(defmethod (setf documentation) (new-value (x function) (doc-type (eql 't)))
(setf (fun-doc x) new-value))
-(defmethod (setf documentation) (new-value
- (x function)
- (doc-type (eql 'function)))
+(defmethod (setf documentation) (new-value (x function) (doc-type (eql 'function)))
(setf (fun-doc x) new-value))
(defmethod (setf documentation) (new-value (x list) (doc-type (eql 'function)))
- (setf (info :function :documentation x) new-value))
+ (when (and (legal-fun-name-p x) (fboundp x))
+ (setf (documentation (fdefinition x) t) new-value)))
-(defmethod (setf documentation)
- (new-value (x list) (doc-type (eql 'compiler-macro)))
- (setf (random-documentation x 'compiler-macro) new-value))
+(defmethod (setf documentation) (new-value (x list) (doc-type (eql 'compiler-macro)))
+ (awhen (compiler-macro-function x)
+ (setf (documentation it t) new-value)))
-(defmethod (setf documentation) (new-value
- (x symbol)
- (doc-type (eql 'function)))
- (setf (info :function :documentation x) new-value))
+(defmethod (setf documentation) (new-value (x symbol) (doc-type (eql 'function)))
+ (when (and (legal-fun-name-p x) (fboundp x))
+ (setf (documentation (symbol-function x) t) new-value)))
-(defmethod (setf documentation)
- (new-value (x symbol) (doc-type (eql 'compiler-macro)))
- (setf (random-documentation x 'compiler-macro) new-value))
+(defmethod (setf documentation) (new-value (x symbol) (doc-type (eql 'compiler-macro)))
+ (awhen (compiler-macro-function x)
+ (setf (documentation it t) new-value)))
(defmethod (setf documentation) (new-value (x symbol) (doc-type (eql 'setf)))
- (setf (info :setf :documentation x) new-value))
+ (setf (fdocumentation x 'setf) new-value))
\f
;;; method combinations
(defmethod documentation ((x method-combination) (doc-type (eql 't)))
\f
;;; types, classes, and structure names
(defmethod documentation ((x structure-class) (doc-type (eql 't)))
- (values (info :type :documentation (class-name x))))
+ (fdocumentation (class-name x) 'type))
(defmethod documentation ((x structure-class) (doc-type (eql 'type)))
- (values (info :type :documentation (class-name x))))
+ (fdocumentation (class-name x) 'type))
(defmethod documentation ((x standard-class) (doc-type (eql 't)))
(slot-value x '%documentation))
;;; condition-class is in fact not implemented as a standard-class or
;;; structure-class).
(defmethod documentation ((x condition-class) (doc-type (eql 't)))
- (values (info :type :documentation (class-name x))))
+ (fdocumentation (class-name x) 'type))
(defmethod documentation ((x condition-class) (doc-type (eql 'type)))
- (values (info :type :documentation (class-name x))))
+ (fdocumentation (class-name x) 'type))
(defmethod documentation ((x symbol) (doc-type (eql 'type)))
- (or (values (info :type :documentation x))
+ (or (fdocumentation x 'type)
(let ((class (find-class x nil)))
(when class
(slot-value class '%documentation)))))
(defmethod documentation ((x symbol) (doc-type (eql 'structure)))
- (cond
- ((structure-type-p x)
- (values (info :type :documentation x)))
- ((info :typed-structure :info x)
- (values (info :typed-structure :documentation x)))
- (t nil)))
+ (fdocumentation x 'structure))
(defmethod (setf documentation) (new-value
(x structure-class)
(doc-type (eql 't)))
- (setf (info :type :documentation (class-name x)) new-value))
+ (setf (fdocumentation (class-name x) 'type) new-value))
(defmethod (setf documentation) (new-value
(x structure-class)
(doc-type (eql 'type)))
- (setf (info :type :documentation (class-name x)) new-value))
+ (setf (fdocumentation (class-name x) 'type) new-value))
(defmethod (setf documentation) (new-value
(x standard-class)
(defmethod (setf documentation) (new-value
(x condition-class)
(doc-type (eql 't)))
- (setf (info :type :documentation (class-name x)) new-value))
+ (setf (fdocumentation (class-name x) 'type) new-value))
(defmethod (setf documentation) (new-value
(x condition-class)
(doc-type (eql 'type)))
- (setf (info :type :documentation (class-name x)) new-value))
+ (setf (fdocumentation (class-name x) 'type) new-value))
(defmethod (setf documentation) (new-value (x symbol) (doc-type (eql 'type)))
(if (or (structure-type-p x) (condition-type-p x))
- (setf (info :type :documentation x) new-value)
+ (setf (fdocumentation x 'type) new-value)
(let ((class (find-class x nil)))
(if class
(setf (slot-value class '%documentation) new-value)
- (setf (info :type :documentation x) new-value)))))
+ (setf (fdocumentation x 'type) new-value)))))
(defmethod (setf documentation) (new-value
(x symbol)
(doc-type (eql 'structure)))
- (cond
- ((structure-type-p x)
- (setf (info :type :documentation x) new-value))
- ((info :typed-structure :info x)
- (setf (info :typed-structure :documentation x) new-value))
- (t new-value)))
+ (setf (fdocumentation x 'structure) new-value))
\f
;;; variables
(defmethod documentation ((x symbol) (doc-type (eql 'variable)))
- (values (info :variable :documentation x)))
+ (fdocumentation x 'variable))
(defmethod (setf documentation) (new-value
(x symbol)
(doc-type (eql 'variable)))
- (setf (info :variable :documentation x) new-value))
+ (setf (fdocumentation x 'variable) new-value))
\f
;;; default if DOC-TYPE doesn't match one of the specified types
(defmethod documentation (object doc-type)
- (warn "unsupported DOCUMENTATION: type ~S for object ~S"
+ (warn "unsupported DOCUMENTATION: type ~S for object of type ~S"
doc-type
(type-of object))
nil)