mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-30 09:00:31 -08:00
Add online-help support to describe types
* lisp/help-fns.el (describe-symbol-backends): Move to help-mode.el. (describe-symbol): Improve the selection of default. * lisp/help-mode.el: Require cl-lib. (describe-symbol-backends): Move from help-fns.el. (help-make-xrefs): Use it. * lisp/emacs-lisp/cl-extra.el (describe-symbol-backends): Add entry for types. (cl--typedef-regexp): New const. (find-function-regexp-alist): Add entry for types. (cl-help-type, cl-type-definition): New buttons. (cl-find-class): New function. (cl-describe-type): New command. (cl--describe-class, cl--describe-class-slot) (cl--describe-class-slots): New functions, moved from eieio-opt.el. * lisp/emacs-lisp/cl-generic.el (cl--generic-method-documentation) (cl--generic-all-functions, cl--generic-specializers-apply-to-type-p): New functions. Moved from eieio-opt.el. (cl--generic-class-parents): New function, extracted from cl--generic-struct-specializers. (cl--generic-struct-specializers): Use it. * lisp/emacs-lisp/cl-macs.el (cl-defstruct): Use pcase-dolist. Improve constructor's docstrings. (cl-struct-unknown-slot): New error. (cl-struct-slot-offset): Use it. * lisp/emacs-lisp/cl-preloaded.el (cl-struct-define): Record the type definition in current-load-list. * lisp/emacs-lisp/eieio-core.el (eieio--known-slot-names): New var. (eieio--add-new-slot): Set it. (eieio-defclass-internal): Use new name for current-load-list. (eieio-oref): Add compiler-macro to warn about unknown slots. * lisp/emacs-lisp/eieio.el (defclass): Update eieio--known-slot-names as compile-time as well. Improve constructor docstrings. * lisp/emacs-lisp/eieio-opt.el (eieio-help-class) (eieio--help-print-slot, eieio-help-class-slots): Move to cl-extra.el. (eieio-class-def): Remove button. (eieio-help-constructor): Use new name for load-history element. (eieio--specializers-apply-to-class-p, eieio-all-generic-functions) (eieio-method-documentation): Move to cl-generic.el. (eieio-display-method-list): Use new names. * lisp/emacs-lisp/lisp-mode.el (lisp-imenu-generic-expression): Add "define-linline". (lisp-fdefs): Remove "defsubst". (el-fdefs): Add "defsubst", "cl-defsubst", and "define-linline". * lisp/emacs-lisp/macroexp.el (macroexp--warned): New var. (macroexp--warn-and-return): Use it to avoid inf-loops. Add `compile-only' argument.
This commit is contained in:
parent
287bce9888
commit
59b5723c9b
11 changed files with 358 additions and 286 deletions
|
|
@ -261,6 +261,8 @@ It creates an autoload function for CNAME's constructor."
|
|||
(and (eieio-object-p obj)
|
||||
(object-of-class-p obj class))))
|
||||
|
||||
(defvar eieio--known-slot-names nil)
|
||||
|
||||
(defun eieio-defclass-internal (cname superclasses slots options)
|
||||
"Define CNAME as a new subclass of SUPERCLASSES.
|
||||
SLOTS are the slots residing in that class definition, and OPTIONS
|
||||
|
|
@ -473,7 +475,7 @@ See `defclass' for more information."
|
|||
(put cname 'variable-documentation docstring)))
|
||||
|
||||
;; Save the file location where this class is defined.
|
||||
(add-to-list 'current-load-list `(eieio-defclass . ,cname))
|
||||
(add-to-list 'current-load-list `(define-type . ,cname))
|
||||
|
||||
;; We have a list of custom groups. Store them into the options.
|
||||
(let ((g (eieio--class-option-assoc options :custom-groups)))
|
||||
|
|
@ -603,47 +605,48 @@ if default value is nil."
|
|||
:key #'cl--slot-descriptor-name)))
|
||||
(cold (car (cl-member a (eieio--class-class-slots newc)
|
||||
:key #'cl--slot-descriptor-name))))
|
||||
(condition-case nil
|
||||
(if (sequencep d) (setq d (copy-sequence d)))
|
||||
;; This copy can fail on a cons cell with a non-cons in the cdr. Let's
|
||||
;; skip it if it doesn't work.
|
||||
(error nil))
|
||||
;; (if (sequencep type) (setq type (copy-sequence type)))
|
||||
;; (if (sequencep cust) (setq cust (copy-sequence cust)))
|
||||
;; (if (sequencep custg) (setq custg (copy-sequence custg)))
|
||||
(cl-pushnew a eieio--known-slot-names)
|
||||
(condition-case nil
|
||||
(if (sequencep d) (setq d (copy-sequence d)))
|
||||
;; This copy can fail on a cons cell with a non-cons in the cdr. Let's
|
||||
;; skip it if it doesn't work.
|
||||
(error nil))
|
||||
;; (if (sequencep type) (setq type (copy-sequence type)))
|
||||
;; (if (sequencep cust) (setq cust (copy-sequence cust)))
|
||||
;; (if (sequencep custg) (setq custg (copy-sequence custg)))
|
||||
|
||||
;; To prevent override information w/out specification of storage,
|
||||
;; we need to do this little hack.
|
||||
(if cold (setq alloc :class))
|
||||
;; To prevent override information w/out specification of storage,
|
||||
;; we need to do this little hack.
|
||||
(if cold (setq alloc :class))
|
||||
|
||||
(if (memq alloc '(nil :instance))
|
||||
;; In this case, we modify the INSTANCE version of a given slot.
|
||||
(progn
|
||||
;; Only add this element if it is so-far unique
|
||||
(if (not old)
|
||||
(progn
|
||||
(eieio--perform-slot-validation-for-default slot skipnil)
|
||||
(push slot (eieio--class-slots newc))
|
||||
)
|
||||
;; When defaultoverride is true, we are usually adding new local
|
||||
;; attributes which must override the default value of any slot
|
||||
;; passed in by one of the parent classes.
|
||||
(when defaultoverride
|
||||
(eieio--slot-override old slot skipnil)))
|
||||
(when init
|
||||
(cl-pushnew (cons init a) (eieio--class-initarg-tuples newc)
|
||||
:test #'equal)))
|
||||
|
||||
;; CLASS ALLOCATED SLOTS
|
||||
(if (not cold)
|
||||
(if (memq alloc '(nil :instance))
|
||||
;; In this case, we modify the INSTANCE version of a given slot.
|
||||
(progn
|
||||
(eieio--perform-slot-validation-for-default slot skipnil)
|
||||
;; Here we have found a :class version of a slot. This
|
||||
;; requires a very different approach.
|
||||
(push slot (eieio--class-class-slots newc)))
|
||||
(when defaultoverride
|
||||
;; There is a match, and we must override the old value.
|
||||
(eieio--slot-override cold slot skipnil))))))
|
||||
;; Only add this element if it is so-far unique
|
||||
(if (not old)
|
||||
(progn
|
||||
(eieio--perform-slot-validation-for-default slot skipnil)
|
||||
(push slot (eieio--class-slots newc))
|
||||
)
|
||||
;; When defaultoverride is true, we are usually adding new local
|
||||
;; attributes which must override the default value of any slot
|
||||
;; passed in by one of the parent classes.
|
||||
(when defaultoverride
|
||||
(eieio--slot-override old slot skipnil)))
|
||||
(when init
|
||||
(cl-pushnew (cons init a) (eieio--class-initarg-tuples newc)
|
||||
:test #'equal)))
|
||||
|
||||
;; CLASS ALLOCATED SLOTS
|
||||
(if (not cold)
|
||||
(progn
|
||||
(eieio--perform-slot-validation-for-default slot skipnil)
|
||||
;; Here we have found a :class version of a slot. This
|
||||
;; requires a very different approach.
|
||||
(push slot (eieio--class-class-slots newc)))
|
||||
(when defaultoverride
|
||||
;; There is a match, and we must override the old value.
|
||||
(eieio--slot-override cold slot skipnil))))))
|
||||
|
||||
(defun eieio-copy-parents-into-subclass (newc)
|
||||
"Copy into NEWC the slots of PARENTS.
|
||||
|
|
@ -720,9 +723,18 @@ Argument FN is the function calling this verifier."
|
|||
|
||||
|
||||
;;; Get/Set slots in an object.
|
||||
;;
|
||||
|
||||
(defun eieio-oref (obj slot)
|
||||
"Return the value in OBJ at SLOT in the object vector."
|
||||
(declare (compiler-macro
|
||||
(lambda (exp)
|
||||
(ignore obj)
|
||||
(pcase slot
|
||||
((and (or `',name (and name (pred keywordp)))
|
||||
(guard (not (memq name eieio--known-slot-names))))
|
||||
(macroexp--warn-and-return
|
||||
(format "Unknown slot `%S'" name) exp 'compile-only))
|
||||
(_ exp)))))
|
||||
(cl-check-type slot symbol)
|
||||
(cl-check-type obj (or eieio-object class))
|
||||
(let* ((class (cond ((symbolp obj)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue