mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
Simplify type hierarchy operations
Now that built-in types have classes that describe their relationships exactly like struct/eieio/oclosure classes, we can the code that navigates that DAG. * lisp/emacs-lisp/cl-generic.el (cl--generic-struct-tag): Move to `eieio-core.el`. (cl--generic-type-specializers): Rename from `cl--generic-struct-specializers`. Make it work for any class. (cl--generic-typeof-generalizer, cl--generic-oclosure-generalizer): Use it. (cl--generic-struct-generalizer): Delete generalizer. (cl-generic-generalizers :extra "cl-struct"): Delete method. (prefill 0 cl--generic-generalizer): Move to after the typeof. (cl-generic-generalizers :extra "typeof"): Rewrite to use classes rather than `cl--all-builtin-types`. (cl-generic--oclosure-specializers): Delete function. * lisp/emacs-lisp/cl-preloaded.el (cl--direct-supertypes-of-type) (cl--typeof-types, cl--all-builtin-types): Delete constants. * lisp/emacs-lisp/comp-cstr.el (comp--typeof-builtin-types): Delete constant. (comp--cl-class-hierarchy): Simplify. (comp--compute-typeof-types): Simplify now that `comp--cl-class-hierarchy` and `comp--all-classes` work for built-in types as well. (comp--direct-supertypes): Just use `cl--class-parents`. (comp-supertypes): Simplify since typeof-types should now be complete. * lisp/emacs-lisp/eieio-core.el (eieio-defclass-autoload): Use `superclasses` argument, so we can find parents before it's loaded. (eieio--class-precedence-c3, eieio--class-precedence-dfs): Don't add a `eieio-default-superclass` parent any more. (eieio--class/struct-parents): Delete function. (eieio--class-precedence-bfs): Use `eieio--class-parents` instead. Don't stop when reaching `eieio-default-superclass`. (cl--generic-struct-tag): Move from `cl-generic.el`.
This commit is contained in:
parent
945af4d9d1
commit
bd017175d4
4 changed files with 49 additions and 154 deletions
|
|
@ -433,36 +433,6 @@ For this build of Emacs it's %dbit."
|
|||
(setf (cl--class-parents (cl--find-class 'cl-structure-object))
|
||||
(list (cl--find-class 'record))))
|
||||
|
||||
(defconst cl--direct-supertypes-of-type
|
||||
;; Please run `sycdoc-update-type-hierarchy' in
|
||||
;; `admin/syncdoc-type-hierarchy.el' each time this is modified to
|
||||
;; reflect the change in the documentation.
|
||||
(let ((table (make-hash-table :test #'eq)))
|
||||
(mapatoms
|
||||
(lambda (type)
|
||||
(let ((class (get type 'cl--class)))
|
||||
(when (built-in-class-p class)
|
||||
(puthash type (mapcar #'cl--class-name (cl--class-parents class))
|
||||
table)))))
|
||||
table)
|
||||
"Hash table TYPE -> SUPERTYPES.")
|
||||
|
||||
(defconst cl--typeof-types
|
||||
(letrec ((alist nil))
|
||||
(maphash (lambda (type _)
|
||||
(let ((class (get type 'cl--class)))
|
||||
;; FIXME: Can't remember why `t' is excluded.
|
||||
(push (remq t (cl--class-allparents class)) alist)))
|
||||
cl--direct-supertypes-of-type)
|
||||
alist)
|
||||
"Alist of supertypes.
|
||||
Each element has the form (TYPE . SUPERTYPES) where TYPE is one of
|
||||
the symbols returned by `type-of', and SUPERTYPES is the list of its
|
||||
supertypes from the most specific to least specific.")
|
||||
|
||||
(defconst cl--all-builtin-types
|
||||
(delete-dups (copy-sequence (apply #'append cl--typeof-types))))
|
||||
|
||||
;; Make sure functions defined with cl-defsubst can be inlined even in
|
||||
;; packages which do not require CL. We don't put an autoload cookie
|
||||
;; directly on that function, since those cookies only go to cl-loaddefs.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue