* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
;;; eieio-custom.el -- eieio object customization -*- lexical-binding:t -*-
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
2016-01-01 01:16:19 -08:00
|
|
|
|
;; Copyright (C) 1999-2001, 2005, 2007-2016 Free Software Foundation,
|
2013-01-01 09:11:05 +00:00
|
|
|
|
;; Inc.
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
2009-10-01 02:47:37 +00:00
|
|
|
|
;; Author: Eric M. Ludlam <zappo@gnu.org>
|
2013-06-18 16:06:18 -04:00
|
|
|
|
;; Old-Version: 0.2 (using "Version:" made Emacs think this is package
|
|
|
|
|
;; eieio-0.2).
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; Keywords: OO, lisp
|
2010-08-29 12:17:13 -04:00
|
|
|
|
;; Package: eieio
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
|
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
;; (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
|
|
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
;;
|
|
|
|
|
;; This contains support customization of eieio objects. Enabling
|
2009-10-01 02:47:37 +00:00
|
|
|
|
;; your object to be customizable requires use of the slot attribute
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; `:custom'.
|
|
|
|
|
|
|
|
|
|
(require 'eieio)
|
|
|
|
|
(require 'widget)
|
|
|
|
|
(require 'wid-edit)
|
|
|
|
|
(require 'custom)
|
|
|
|
|
|
|
|
|
|
;;; Compatibility
|
|
|
|
|
|
|
|
|
|
;; (eval-and-compile
|
|
|
|
|
;; (if (featurep 'xemacs)
|
|
|
|
|
;; (defalias 'eieio-overlay-lists (lambda () (list (extent-list))))
|
|
|
|
|
;; (defalias 'eieio-overlay-lists 'overlay-lists)))
|
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
(defclass eieio-widget-test-class nil
|
|
|
|
|
((a-string :initarg :a-string
|
|
|
|
|
:initform "The moose is loose"
|
|
|
|
|
:custom string
|
|
|
|
|
:label "Amorphous String"
|
|
|
|
|
:group (default foo)
|
|
|
|
|
:documentation "A string for testing custom.
|
|
|
|
|
This is the next line of documentation.")
|
|
|
|
|
(listostuff :initarg :listostuff
|
|
|
|
|
:initform ("1" "2" "3")
|
|
|
|
|
:type list
|
|
|
|
|
:custom (repeat (string :tag "Stuff"))
|
|
|
|
|
:label "List of Strings"
|
|
|
|
|
:group foo
|
|
|
|
|
:documentation "A list of stuff.")
|
|
|
|
|
(uninitialized :initarg :uninitialized
|
|
|
|
|
:type string
|
|
|
|
|
:custom string
|
|
|
|
|
:documentation "This slot is not initialized.
|
|
|
|
|
Used to make sure that custom doesn't barf when it encounters one
|
|
|
|
|
of these.")
|
|
|
|
|
(a-number :initarg :a-number
|
|
|
|
|
:initform 2
|
|
|
|
|
:custom integer
|
|
|
|
|
:documentation "A number of thingies."))
|
|
|
|
|
"A class for testing the widget on.")
|
|
|
|
|
|
2014-12-22 22:05:46 -05:00
|
|
|
|
(defcustom eieio-widget-test (eieio-widget-test-class)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Test variable for editing an object."
|
|
|
|
|
:type 'object
|
|
|
|
|
:group 'eieio)
|
|
|
|
|
|
|
|
|
|
(defface eieio-custom-slot-tag-face '((((class color)
|
|
|
|
|
(background dark))
|
|
|
|
|
(:foreground "light blue"))
|
|
|
|
|
(((class color)
|
|
|
|
|
(background light))
|
|
|
|
|
(:foreground "blue"))
|
|
|
|
|
(t (:italic t)))
|
|
|
|
|
"Face used for unpushable variable tags."
|
|
|
|
|
:group 'custom-faces)
|
|
|
|
|
|
|
|
|
|
(defvar eieio-wo nil
|
|
|
|
|
"Buffer local variable in object customize buffers for the current widget.")
|
|
|
|
|
(defvar eieio-co nil
|
|
|
|
|
"Buffer local variable in object customize buffers for the current obj.")
|
|
|
|
|
(defvar eieio-cog nil
|
|
|
|
|
"Buffer local variable in object customize buffers for the current group.")
|
|
|
|
|
|
2009-10-05 15:32:08 +00:00
|
|
|
|
(defvar eieio-custom-ignore-eieio-co nil
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"When true, all customizable slots of the current object are updated.
|
|
|
|
|
Updates occur regardless of the current customization group.")
|
|
|
|
|
|
|
|
|
|
(define-widget 'object-slot 'group
|
|
|
|
|
"Abstractly modify a single slot in an object."
|
|
|
|
|
:tag "Slot"
|
|
|
|
|
:format "%t %v%h\n"
|
|
|
|
|
:convert-widget 'widget-types-convert-widget
|
|
|
|
|
:value-create 'eieio-slot-value-create
|
|
|
|
|
:value-get 'eieio-slot-value-get
|
|
|
|
|
:value-delete 'widget-children-value-delete
|
|
|
|
|
:validate 'widget-children-validate
|
|
|
|
|
:match 'eieio-object-match ;; same
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
(defun eieio-slot-value-create (widget)
|
|
|
|
|
"Create the value of WIDGET."
|
|
|
|
|
(let ((chil nil))
|
|
|
|
|
(setq chil (cons
|
|
|
|
|
(widget-create-child-and-convert
|
|
|
|
|
widget (widget-get widget :childtype)
|
|
|
|
|
:tag ""
|
|
|
|
|
:value (widget-get widget :value))
|
|
|
|
|
chil))
|
|
|
|
|
(widget-put widget :children chil)))
|
|
|
|
|
|
|
|
|
|
(defun eieio-slot-value-get (widget)
|
|
|
|
|
"Get the value of WIDGET."
|
|
|
|
|
(widget-value (car (widget-get widget :children))))
|
|
|
|
|
|
|
|
|
|
(defun eieio-custom-toggle-hide (widget)
|
|
|
|
|
"Toggle visibility of WIDGET."
|
|
|
|
|
(let ((vc (car (widget-get widget :children))))
|
|
|
|
|
(cond ((eq (widget-get vc :eieio-custom-state) 'hidden)
|
|
|
|
|
(widget-put vc :eieio-custom-state 'visible)
|
|
|
|
|
(widget-put vc :value-face (widget-get vc :orig-face)))
|
|
|
|
|
(t
|
|
|
|
|
(widget-put vc :eieio-custom-state 'hidden)
|
|
|
|
|
(widget-put vc :orig-face (widget-get vc :value-face))
|
|
|
|
|
(widget-put vc :value-face 'invisible)
|
|
|
|
|
))
|
|
|
|
|
(widget-value-set vc (widget-value vc))))
|
|
|
|
|
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
(defun eieio-custom-toggle-parent (widget &rest _)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Toggle visibility of parent of WIDGET.
|
|
|
|
|
Optional argument IGNORE is an extraneous parameter."
|
|
|
|
|
(eieio-custom-toggle-hide (widget-get widget :parent)))
|
|
|
|
|
|
|
|
|
|
(define-widget 'object-edit 'group
|
|
|
|
|
"Abstractly modify a CLOS object."
|
|
|
|
|
:tag "Object"
|
|
|
|
|
:format "%v"
|
|
|
|
|
:convert-widget 'widget-types-convert-widget
|
|
|
|
|
:value-create 'eieio-object-value-create
|
|
|
|
|
:value-get 'eieio-object-value-get
|
|
|
|
|
:value-delete 'widget-children-value-delete
|
|
|
|
|
:validate 'widget-children-validate
|
|
|
|
|
:match 'eieio-object-match
|
|
|
|
|
:clone-object-children nil
|
|
|
|
|
)
|
|
|
|
|
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
(defun eieio-object-match (_widget _value)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Match info for WIDGET against VALUE."
|
|
|
|
|
;; Write me
|
|
|
|
|
t)
|
|
|
|
|
|
|
|
|
|
(defun eieio-filter-slot-type (widget slottype)
|
|
|
|
|
"Filter WIDGETs SLOTTYPE."
|
|
|
|
|
(if (widget-get widget :clone-object-children)
|
|
|
|
|
slottype
|
|
|
|
|
(cond ((eq slottype 'object)
|
|
|
|
|
'object-edit)
|
|
|
|
|
((and (listp slottype)
|
|
|
|
|
(eq (car slottype) 'object))
|
|
|
|
|
(cons 'object-edit (cdr slottype)))
|
|
|
|
|
((equal slottype '(repeat object))
|
|
|
|
|
'(repeat object-edit))
|
|
|
|
|
((and (listp slottype)
|
|
|
|
|
(equal (car slottype) 'repeat)
|
|
|
|
|
(listp (car (cdr slottype)))
|
|
|
|
|
(equal (car (car (cdr slottype))) 'object))
|
|
|
|
|
(list 'repeat
|
|
|
|
|
(cons 'object-edit
|
|
|
|
|
(cdr (car (cdr slottype))))))
|
|
|
|
|
(t slottype))))
|
|
|
|
|
|
|
|
|
|
(defun eieio-object-value-create (widget)
|
|
|
|
|
"Create the value of WIDGET."
|
|
|
|
|
(if (not (widget-get widget :value))
|
|
|
|
|
(widget-put widget
|
|
|
|
|
:value (cond ((widget-get widget :objecttype)
|
2015-01-17 09:50:07 -05:00
|
|
|
|
(funcall (eieio--class-constructor
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(widget-get widget :objecttype))
|
|
|
|
|
"Custom-new"))
|
|
|
|
|
((widget-get widget :objectcreatefcn)
|
|
|
|
|
(funcall (widget-get widget :objectcreatefcn)))
|
|
|
|
|
(t (error "No create method specified")))))
|
|
|
|
|
(let* ((chil nil)
|
|
|
|
|
(obj (widget-get widget :value))
|
|
|
|
|
(master-group (widget-get widget :eieio-group))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(cv (eieio--object-class obj))
|
|
|
|
|
(slots (eieio--class-slots cv)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; First line describes the object, but may not editable.
|
|
|
|
|
(if (widget-get widget :eieio-show-name)
|
|
|
|
|
(setq chil (cons (widget-create-child-and-convert
|
|
|
|
|
widget 'string :tag "Object "
|
|
|
|
|
:sample-face 'bold
|
Cleanup some of EIEIO's namespace.
* lisp/emacs-lisp/eieio.el (eieio--define-field-accessors): New macro.
Use it to define all the class-* and object-* field accessors (renamed
to eieio--class-* and eieio--object-*). Update all uses.
(eieio--class-num-slots, eieio--object-num-slots): Rename from
class-num-slots and object-num-slots.
(eieio--check-type): New macro.
(eieio-defclass, eieio-oref, eieio-oref-default, same-class-p)
(object-of-class-p, child-of-class-p, object-slots, class-slot-initarg)
(eieio-oset, eieio-oset-default, object-assoc, object-assoc-list)
(object-assoc-list-safe): Use it.
(eieio-defclass): Tighten regexp.
(eieio--defmethod): Use `memq'. Signal an error for unknown method kind.
Remove unreachable code.
(object-class-fast): Declare obsolete.
(eieio-class-name, eieio-object-name, eieio-object-set-name-string)
(eieio-object-class, eieio-object-class-name, eieio-class-parents)
(eieio-class-children, eieio-class-precedence-list, eieio-class-parent):
Rename from class-name, object-name, object-set-name-string,
object-class, object-class-name, class-parents, class-children,
class-precedence-list, class-parent; with obsolete alias.
(class-of, class-direct-superclasses, class-direct-subclasses):
Declare obsolete.
(eieio-defmethod): Use `memq'; remove unreachable code.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-read):
* lisp/emacs-lisp/eieio-opt.el (eieio-class-button, eieio-describe-generic)
(eieio-browse-tree, eieio-browse): Use eieio--check-type.
2013-02-18 21:57:04 -05:00
|
|
|
|
(eieio-object-name-string obj))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
chil)))
|
|
|
|
|
;; Display information about the group being shown
|
|
|
|
|
(when master-group
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(let ((groups (eieio--class-option (eieio--object-class obj)
|
2015-01-04 23:11:37 -05:00
|
|
|
|
:custom-groups)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(widget-insert "Groups:")
|
|
|
|
|
(while groups
|
|
|
|
|
(widget-insert " ")
|
|
|
|
|
(if (eq (car groups) master-group)
|
|
|
|
|
(widget-insert "*" (capitalize (symbol-name master-group)) "*")
|
|
|
|
|
(widget-create 'push-button
|
|
|
|
|
:thing (cons obj (car groups))
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
:notify (lambda (widget &rest _)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(eieio-customize-object
|
|
|
|
|
(car (widget-get widget :thing))
|
|
|
|
|
(cdr (widget-get widget :thing))))
|
|
|
|
|
(capitalize (symbol-name (car groups)))))
|
|
|
|
|
(setq groups (cdr groups)))
|
|
|
|
|
(widget-insert "\n\n")))
|
|
|
|
|
;; Loop over all the slots, creating child widgets.
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(dotimes (i (length slots))
|
|
|
|
|
(let* ((slot (aref slots i))
|
2015-05-05 14:43:48 -04:00
|
|
|
|
(sname (eieio-slot-descriptor-name slot))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(props (cl--slot-descriptor-props slot)))
|
|
|
|
|
;; Output this slot if it has a customize flag associated with it.
|
|
|
|
|
(when (and (alist-get :custom props)
|
|
|
|
|
(or (not master-group)
|
|
|
|
|
(member master-group (alist-get :group props)))
|
|
|
|
|
(slot-boundp obj (cl--slot-descriptor-name slot)))
|
|
|
|
|
;; In this case, this slot has a custom type. Create its
|
|
|
|
|
;; children widgets.
|
|
|
|
|
(let ((type (eieio-filter-slot-type widget (alist-get :custom props)))
|
|
|
|
|
(stuff nil))
|
|
|
|
|
;; This next bit is an evil hack to get some EDE functions
|
|
|
|
|
;; working the way I like.
|
|
|
|
|
(if (and (listp type)
|
|
|
|
|
(setq stuff (member :slotofchoices type)))
|
|
|
|
|
(let ((choices (eieio-oref obj (car (cdr stuff))))
|
|
|
|
|
(newtype nil))
|
|
|
|
|
(while (not (eq (car type) :slotofchoices))
|
|
|
|
|
(setq newtype (cons (car type) newtype)
|
|
|
|
|
type (cdr type)))
|
|
|
|
|
(while choices
|
|
|
|
|
(setq newtype (cons (list 'const (car choices))
|
|
|
|
|
newtype)
|
|
|
|
|
choices (cdr choices)))
|
|
|
|
|
(setq type (nreverse newtype))))
|
|
|
|
|
(setq chil (cons (widget-create-child-and-convert
|
|
|
|
|
widget 'object-slot
|
|
|
|
|
:childtype type
|
|
|
|
|
:sample-face 'eieio-custom-slot-tag-face
|
|
|
|
|
:tag
|
|
|
|
|
(concat
|
|
|
|
|
(make-string
|
|
|
|
|
(or (widget-get widget :indent) 0)
|
|
|
|
|
?\s)
|
|
|
|
|
(or (alist-get :label props)
|
|
|
|
|
(let ((s (symbol-name
|
|
|
|
|
(or
|
|
|
|
|
(eieio--class-slot-initarg
|
|
|
|
|
(eieio--object-class obj)
|
2015-05-05 14:43:48 -04:00
|
|
|
|
sname)
|
|
|
|
|
sname))))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(capitalize
|
|
|
|
|
(if (string-match "^:" s)
|
|
|
|
|
(substring s (match-end 0))
|
|
|
|
|
s)))))
|
2015-05-05 14:43:48 -04:00
|
|
|
|
:value (slot-value obj sname)
|
2015-03-18 23:02:26 -04:00
|
|
|
|
:doc (or (alist-get :documentation props)
|
|
|
|
|
"Slot not Documented.")
|
|
|
|
|
:eieio-custom-visibility 'visible
|
|
|
|
|
)
|
|
|
|
|
chil))
|
|
|
|
|
))))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(widget-put widget :children (nreverse chil))
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
(defun eieio-object-value-get (widget)
|
|
|
|
|
"Get the value of WIDGET."
|
|
|
|
|
(let* ((obj (widget-get widget :value))
|
|
|
|
|
(master-group eieio-cog)
|
|
|
|
|
(wids (widget-get widget :children))
|
|
|
|
|
(name (if (widget-get widget :eieio-show-name)
|
|
|
|
|
(car (widget-apply (car wids) :value-inline))
|
|
|
|
|
nil))
|
|
|
|
|
(chil (if (widget-get widget :eieio-show-name)
|
|
|
|
|
(nthcdr 1 wids) wids))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(cv (eieio--object-class obj))
|
|
|
|
|
(i 0)
|
|
|
|
|
(slots (eieio--class-slots cv)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; If there are any prefix widgets, clear them.
|
|
|
|
|
;; -- None yet
|
|
|
|
|
;; Create a batch of initargs for each slot.
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(while (and (< i (length slots)) chil)
|
|
|
|
|
(let* ((slot (aref slots i))
|
|
|
|
|
(props (cl--slot-descriptor-props slot))
|
|
|
|
|
(cust (alist-get :custom props)))
|
2015-05-05 14:47:58 -04:00
|
|
|
|
;;
|
2015-05-05 12:25:18 -07:00
|
|
|
|
;; Shouldn't I be incremented unconditionally? Or
|
2015-05-05 14:47:58 -04:00
|
|
|
|
;; better shouldn't we simply mapc on the slots vector
|
2015-05-05 12:25:18 -07:00
|
|
|
|
;; avoiding use of this integer variable? PLN Sat May
|
2015-05-05 14:47:58 -04:00
|
|
|
|
;; 2 07:35:45 2015
|
|
|
|
|
;;
|
|
|
|
|
(setq i (+ i 1))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(if (and cust
|
|
|
|
|
(or eieio-custom-ignore-eieio-co
|
|
|
|
|
(not master-group)
|
|
|
|
|
(member master-group (alist-get :group props)))
|
|
|
|
|
(slot-boundp obj (cl--slot-descriptor-name slot)))
|
|
|
|
|
(progn
|
|
|
|
|
;; Only customized slots have widgets
|
|
|
|
|
(let ((eieio-custom-ignore-eieio-co t))
|
|
|
|
|
(eieio-oset obj (cl--slot-descriptor-name slot)
|
|
|
|
|
(car (widget-apply (car chil) :value-inline))))
|
|
|
|
|
(setq chil (cdr chil))))))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; Set any name updates on it.
|
2014-12-22 22:05:46 -05:00
|
|
|
|
(if name (eieio-object-set-name-string obj name))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; This is the same object we had before.
|
|
|
|
|
obj))
|
|
|
|
|
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-done-customizing ((_obj eieio-default-superclass))
|
2009-10-05 15:32:08 +00:00
|
|
|
|
"When applying change to a widget, call this method.
|
|
|
|
|
This method is called by the default widget-edit commands.
|
|
|
|
|
User made commands should also call this method when applying changes.
|
2009-09-28 00:49:54 +00:00
|
|
|
|
Argument OBJ is the object that has been customized."
|
|
|
|
|
nil)
|
|
|
|
|
|
2011-02-18 00:00:08 -08:00
|
|
|
|
;;;###autoload
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(defun customize-object (obj &optional group)
|
|
|
|
|
"Customize OBJ in a custom buffer.
|
|
|
|
|
Optional argument GROUP is the sub-group of slots to display."
|
|
|
|
|
(eieio-customize-object obj group))
|
|
|
|
|
|
2012-10-02 02:10:29 +08:00
|
|
|
|
(defvar eieio-custom-mode-map
|
|
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
|
(set-keymap-parent map widget-keymap)
|
|
|
|
|
map)
|
|
|
|
|
"Keymap for EIEIO Custom mode")
|
|
|
|
|
|
|
|
|
|
(define-derived-mode eieio-custom-mode fundamental-mode "EIEIO Custom"
|
|
|
|
|
"Major mode for customizing EIEIO objects.
|
|
|
|
|
\\{eieio-custom-mode-map}")
|
|
|
|
|
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-customize-object ((obj eieio-default-superclass)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
&optional group)
|
|
|
|
|
"Customize OBJ in a specialized custom buffer.
|
|
|
|
|
To override call the `eieio-custom-widget-insert' to just insert the
|
|
|
|
|
object widget.
|
|
|
|
|
Optional argument GROUP specifies a subgroup of slots to edit as a symbol.
|
|
|
|
|
These groups are specified with the `:group' slot flag."
|
|
|
|
|
;; Insert check for multiple edits here.
|
|
|
|
|
(let* ((g (or group 'default)))
|
|
|
|
|
(switch-to-buffer (get-buffer-create
|
|
|
|
|
(concat "*CUSTOMIZE "
|
Cleanup some of EIEIO's namespace.
* lisp/emacs-lisp/eieio.el (eieio--define-field-accessors): New macro.
Use it to define all the class-* and object-* field accessors (renamed
to eieio--class-* and eieio--object-*). Update all uses.
(eieio--class-num-slots, eieio--object-num-slots): Rename from
class-num-slots and object-num-slots.
(eieio--check-type): New macro.
(eieio-defclass, eieio-oref, eieio-oref-default, same-class-p)
(object-of-class-p, child-of-class-p, object-slots, class-slot-initarg)
(eieio-oset, eieio-oset-default, object-assoc, object-assoc-list)
(object-assoc-list-safe): Use it.
(eieio-defclass): Tighten regexp.
(eieio--defmethod): Use `memq'. Signal an error for unknown method kind.
Remove unreachable code.
(object-class-fast): Declare obsolete.
(eieio-class-name, eieio-object-name, eieio-object-set-name-string)
(eieio-object-class, eieio-object-class-name, eieio-class-parents)
(eieio-class-children, eieio-class-precedence-list, eieio-class-parent):
Rename from class-name, object-name, object-set-name-string,
object-class, object-class-name, class-parents, class-children,
class-precedence-list, class-parent; with obsolete alias.
(class-of, class-direct-superclasses, class-direct-subclasses):
Declare obsolete.
(eieio-defmethod): Use `memq'; remove unreachable code.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-read):
* lisp/emacs-lisp/eieio-opt.el (eieio-class-button, eieio-describe-generic)
(eieio-browse-tree, eieio-browse): Use eieio--check-type.
2013-02-18 21:57:04 -05:00
|
|
|
|
(eieio-object-name obj) " "
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(symbol-name g) "*")))
|
2012-07-13 15:06:09 +08:00
|
|
|
|
(setq buffer-read-only nil)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(kill-all-local-variables)
|
2012-10-02 02:10:29 +08:00
|
|
|
|
(eieio-custom-mode)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(erase-buffer)
|
|
|
|
|
(let ((all (overlay-lists)))
|
|
|
|
|
;; Delete all the overlays.
|
|
|
|
|
(mapc 'delete-overlay (car all))
|
|
|
|
|
(mapc 'delete-overlay (cdr all)))
|
|
|
|
|
;; Add an apply reset option at the top of the buffer.
|
|
|
|
|
(eieio-custom-object-apply-reset obj)
|
|
|
|
|
(widget-insert "\n\n")
|
Cleanup some of EIEIO's namespace.
* lisp/emacs-lisp/eieio.el (eieio--define-field-accessors): New macro.
Use it to define all the class-* and object-* field accessors (renamed
to eieio--class-* and eieio--object-*). Update all uses.
(eieio--class-num-slots, eieio--object-num-slots): Rename from
class-num-slots and object-num-slots.
(eieio--check-type): New macro.
(eieio-defclass, eieio-oref, eieio-oref-default, same-class-p)
(object-of-class-p, child-of-class-p, object-slots, class-slot-initarg)
(eieio-oset, eieio-oset-default, object-assoc, object-assoc-list)
(object-assoc-list-safe): Use it.
(eieio-defclass): Tighten regexp.
(eieio--defmethod): Use `memq'. Signal an error for unknown method kind.
Remove unreachable code.
(object-class-fast): Declare obsolete.
(eieio-class-name, eieio-object-name, eieio-object-set-name-string)
(eieio-object-class, eieio-object-class-name, eieio-class-parents)
(eieio-class-children, eieio-class-precedence-list, eieio-class-parent):
Rename from class-name, object-name, object-set-name-string,
object-class, object-class-name, class-parents, class-children,
class-precedence-list, class-parent; with obsolete alias.
(class-of, class-direct-superclasses, class-direct-subclasses):
Declare obsolete.
(eieio-defmethod): Use `memq'; remove unreachable code.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-read):
* lisp/emacs-lisp/eieio-opt.el (eieio-class-button, eieio-describe-generic)
(eieio-browse-tree, eieio-browse): Use eieio--check-type.
2013-02-18 21:57:04 -05:00
|
|
|
|
(widget-insert "Edit object " (eieio-object-name obj) "\n\n")
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; Create the widget editing the object.
|
|
|
|
|
(make-local-variable 'eieio-wo)
|
|
|
|
|
(setq eieio-wo (eieio-custom-widget-insert obj :eieio-group g))
|
|
|
|
|
;;Now generate the apply buttons
|
|
|
|
|
(widget-insert "\n")
|
|
|
|
|
(eieio-custom-object-apply-reset obj)
|
|
|
|
|
;; Now initialize the buffer
|
|
|
|
|
(widget-setup)
|
|
|
|
|
;;(widget-minor-mode)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(widget-forward 3)
|
|
|
|
|
(make-local-variable 'eieio-co)
|
|
|
|
|
(setq eieio-co obj)
|
|
|
|
|
(make-local-variable 'eieio-cog)
|
Update from CEDET trunk.
* grammars/c.by (template-type): Add :template-specifier and
:typevar to capture extra details about the template.
(opt-post-fcn-modifiers): Splice in the found symbol into the
return value correctly.
(QUESTION): New punctuation.
(expression): Add ternary conditional support.
* grammars/scheme.by (MODULE): New token.
(scheme): Handle expanding the MODULE tag.
(scheme-list): Remove closeparen required match.
(scheme-in-list): Remove extraneous matches for DEFINE. Add
support for MODULE Simplify matching for code & make work.
(name-args, name-arg-list, name-arg-expand): Make it work.
* semantic.el (semantic-mode): Add/remove 3
completion-at-point-functions.
(semantic-completion-at-point-function): Removed.
(semantic-analyze-completion-at-point-function)
(semantic-analyze-notc-completion-at-point-function)
(semantic-analyze-nolongprefix-completion-at-point-function): New
completion at point functions.
* semantic/doc.el (semantic-doc-snarf-comment-for-tag): Fix case
when comment-end is empty string.
* semantic/debug.el
(semantic-debug-parser-debugger-source): New buffer local
variable.
(semantic-debug-interface): Add 'nil' initform to overlays.
(semantic-debug-mode): Remove read-only tags from buffers on exit.
(semantic-debug): Add autoload cookie. Force the language
specific debugger to load.
* semantic/db.el (generic::semanticdb-full-filename): New generic
method to allow this method to be used on buffer names via an
associated database.
* semantic/symref.el
(semantic-symref-cleanup-recent-buffers-fcn): When cleaning up
buffers, don't clean up buffers that are being used (i.e., in a
window) when the hook fires.
(semantic-symref-recently-opened-buffers): New tracking variable.
(semantic-symref-cleanup-recent-buffers-fcn): New hook fcn.
(semantic-symref-result-get-tags): Move logic into
`semantic-symref-hit-to-tag-via-buffer', and cleanup buffers via
the symref cleanup function in post-command-hook.
(semantic-symref-hit-to-tag-via-buffer): Logic that used to be
from above.
(semantic-symref-hit-to-tag-via-db): New.
* semantic/analyze.el:
(semantic-analyze-find-tag-sequence-default): If first entry in
sequence is the only one, apply tagclass filter.
(semantic-analyze-princ-sequence): Show slot even if empty.
(semantic-analyze-find-tag-sequence)
(semantic-analyze-find-tag-sequence-default): Add flags argument.
Add support for forcing the final entry of the sequence to be of
class variable.
(semantic-analyze-find-tag): Fix bug where input class filter was
ignored if there was a typecache match.
(semantic-analyze-current-context-default): For assignments, the
assignee now must be of class variable.
* semantic/analyze/complete.el
(semantic-analyze-possible-completions-default): Add
'no-longprefix' flag. When used, the prefix and prefixtypes are
shortened to just the last symbol.
* semantic/bovine/c.el (semantic-c-do-lex-if): Catch errors from
'hideif', and push to the parser warning stack.
(semantic-lex-cpp-define): When a comment is at the end of a
macro, do not subtract an extra 1 from the found position. Fixes
bug with: #define foo (a)/**/ adding an extra ')' to the stream.
* semantic/bovine/scm.el (semantic-lex-scheme-symbol): Allow
symbols to be one char long.
* semantic/bovine/grammar.el
(bovine-grammar-calculate-source-on-path): New.
(bovine-grammar-setupcode-builder): Use it.
* ede.el (ede/detect): New require.
(ede-version): Bump version
(ede-initialize-state-current-buffer): Use new
`ede-detect-directory-for-project' to detect projects first
instead of depending on currente dir only.
(ede-delete-project-from-global-list): New.
(ede-flush-deleted-projects): Use above.
(ede-check-project-query-fcn): New variable
(ede-check-project-directory): Use above when querying the user.
Added to support unit testing of this security measure.
(ede-initialize-state-current-buffer): Use
`ede-directory-project-cons' instead of the -detect- fcn to take
advantage of the cache. Pass found project into
`ede-load-project-file'.
(ede-load-project-file): Add new input DETECTIN.
(ede-rescan-toplevel): Get the proj root a better way.
(ede-load-project-file): Return the loaded object. When asking
for existing project, ask for an exact match.
(ede-initialize-state-current-buffer): Simplify some conditional
logic.
(ede-load-project-file): Simplify conditional logic.
(ede-global-list-sanity-check): New Testing fcn.
(ede-parent-project): Replace old code with call to faster
`ede-find-subproject-for-directory'.
(ede-load-project-file): Use
`ede-directory-get-toplevel-open-project' instead of above
deleted. Rename "pfc" to "autoloader". Use
`ede-directory-project-cons' to detect a project. Delete no
project found case where we search up the tree.
* ede/auto.el (ede-project-autoload): Fix doc typo. Add
`:root-only' slot.
(ede-auto-load-project): Doc update: warn to not use.
(ede-dir-to-projectfile): Deleted.
(ede-project-autoload-dirmatch): Add subdir-only slot. Make
configdatastash unbound by default.
(ede-do-dirmatch): If subdir-only is true, then don't allow exact
matches. Account for configdatastash as unbound. Assume value of
nil means no tool installed. Make sure loaded path matches from
beginning. Stash the regexp, not the raw string.
(ede-project-class-files): Note that makefile and automake are not
root only.
(ede-auto-detect-in-dir): New (for use with `ede/detect.el').
(ede-project-dirmatch-p): Deleted.
(ede-project-root-directory): Remove body, return nil.
(ede-project-autoload): :proj-root-dirmatch can be null & doc fix.
(ede-auto-detect-in-dir): If there is no :proj-file, check for a
dirmatch.
* ede/generic.el (ede/config): Replace require of ede.
(ede-generic-new-autoloader): Generic projects are now safe by
default. Note this is NOT a root only project.
(project-rescan, ede-project-root, ede-generic-target-java)
(ede-java-classpath, ede-find-subproject-for-directory): New.
(ede-enable-generic-projects): Add new autoloaders for git, bzr,
hg, sv, CVS.
(ede-generic-vc-project)
(ede-generic-vc-project::ede-generic-setup-configuration): New.
(ede-generic-config): Remove slots: c-include-path,
c-preprocessor-table, c-preprocessor-files, classpath,
build-command, debug-command, run command. Inherit from
ede-extra-config-build, ede-extra-config-program. Make
run-command :value match :custom so only strings are accepted.
Add some more :group slot specifiers.
(ede-generic-project): Add mixins `ede-project-with-config-c' and
`ede-project-with-config-java'. Inherit from
`ede-project-with-config-build',
`ede-project-with-config-program'. Subclass
`ede-project-with-config'. Remove duplication from new baseclass.
(ede-generic-target): Inherit from `ede-target-with-config-build',
`ede-target-with-config-program'. Subclass `ede-target-with-config'.
(ede-generic-target-c-cpp): Add mixin `ede-target-with-config-c'.
(ede-generic-target-java): Add mixin `ede-target-with-config-java'.
(ede-preprocessor-map, ede-system-include-path)
(edejava-classpath): Deleted, moved to config.el.
(project-compile-project, project-compile-target)
(project-debug-target, project-run-target): Deleted.
(ede-generic-get-configuration, ede-generic-setup-configuration)
(ede-commit-project, project-rescan)
(ede-generic-project::ede-customize)
(ede-generic-target::ede-customize)
(ede-generic-config::eieio-done-customizing)
(ede-generic-config::ede-commit): Deleted. Subsumed by new
baseclass.
(ede-preprocessor-map, ede-system-include-path)
(project-debug-target, project-run-target): Call new
`ede-config-get-configuration' instead of old version.
(ede-generic-load): Do not add to global list here.
* ede/files.el (ede-find-project-root)
(ede-files-find-existing)
(ede-directory-get-toplevel-open-project-new): Deleted.
(ede-project-root-directory): Use `ede-project-root' first.
(ede-project-directory-remove-hash)
(ede--directory-project-from-hash)
(ede--directory-project-add-description-to-hash): Rename to make
internal symbols (via --). Expand input dir first.
(ede-directory-project-p): Doc fix (note obsoleted.)
(ede-toplevel-project-or-nil): Alias to `ede-toplevel-project'.
(ede-toplevel-project): Doc Fix. Delete commented out old code.
Simplify returning result from ede-detect-directory-for-project.
(ede-directory-get-open-project): Support when
inodes are disabled. If disabled to str compare on root project.
(ede-directory-get-toplevel-open-project): Enabled nested
projects. When doing directory name matching, save the 'short'
version of an answer (non-exact match) and eventually select the
shortest answer at the end. Expand the filename of tested
projects. Better support for when inodes are disabled. Add
'exact' option so that it will return a project that is an exact
match.
(ede-find-subproject-for-directory): Small optimization to run
`file-truename' less often.
(ede-directory-project-p): Move content, then use
`ede-directory-project-cons'. Use
`ede-detect-directory-for-project', replacing old detection loop.
(ede-directory-project-cons): New, from above.
(ede-toplevel-project): Toss old scanning code. Use
`ede-detect-directory-for-project' instead.
(ede-directory-get-toplevel-open-project-new): New.
* ede/linux.el (ede-linux-project-root): Deleted.
(ede-project-autoload): Remove dirmatch entry - it is no longer
needed.
* lisp/cedet/ede/proj.el (project-rescan): Replace direct
manipulation of `ede-projects' with equivalent and better
functions.
(ede-proj-load): Replace call to test if dir has project to
explicity ask filesystem if Project.ede is there.
* ede/config.el:
* ede/detect.el: New files.
* ede/project-am.el (project-run-target): Add "./" to program to
run for systems where '.' isn't in PATH.
(project-am-load): Remove old code regarding `ede-constructing'.
Just read in the makefiles.
* ede/linux.el (ede-linux-load): Do not add to global list here.
Don't check for existing anymore.
(project-rescan): New.
(ede-linux-project-list, ede-linux-file-existing): Deleted.
(ede-linux-project-root): Delete body. Need symbol for autoloads
for now.
(ede-linux-project): No longer instance tracker.
(ede-project-autoload): Don't provide :proj-root
* ede/emacs.el (ede-emacs-load): Do not add project to global list
here. Don't look for existing first.
(ede-project-autoload): Remove dirmatch entry - it is no longer
needed. Don't provide proj-root anymore.
(ede-emacs-project-list, ede-emacs-file-existing): Delete.
(ede-emacs-project-root): Remove body (need symbol for loaddefs
still).
(ede-emacs-project): Do not instance track anymore.
* ede/cpp-root.el (initialize-instance): Remove commented code.
Add note about why we are adding the project to the master list.
Make sure if we are replacing a prev version, remove from global
list.
(ede-cpp-root-file-existing)
(ede-cpp-root-project-file-for-dir)
(ede-cpp-root-count, ede-cpp-root-project-root, ede-cpp-root-load)
(ede-project-autoload cpp-root): Deleted.
(ede-project-root-directory): Return :directory instead of
calculating from :file.
(project-rescan): New.
* ede/base.el (ede-toplevel): Only use buffer cached value if
subproj not passed in.
* srecode/java.el (srecode-semantic-handle-:java): Fix case when
an EDE project didn't support java paths.
* lisp/cedet/ede/proj-elisp.el
(ede-proj-target-elisp::ede-proj-tweak-autoconf): Kill buffer
after saving modified elisp-comp script, as to avoid "file has
changed on disk; really edit the buffer" questions when script
gets rewritten.
* emacs-lisp/eieio-custom.el (eieio-customize-object): Set
eieio-cog (current group) to g, which is an improved form of input
group.
* srecode/doc-cpp.srt (mode): Set to c mode so this works with
both C and C++.
2014-11-10 01:04:30 +01:00
|
|
|
|
(setq eieio-cog g)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-custom-object-apply-reset ((_obj eieio-default-superclass))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Insert an Apply and Reset button into the object editor.
|
2009-10-05 15:32:08 +00:00
|
|
|
|
Argument OBJ is the object being customized."
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(widget-create 'push-button
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
:notify (lambda (&rest _)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(widget-apply eieio-wo :value-get)
|
|
|
|
|
(eieio-done-customizing eieio-co)
|
|
|
|
|
(bury-buffer))
|
|
|
|
|
"Accept")
|
|
|
|
|
(widget-insert " ")
|
|
|
|
|
(widget-create 'push-button
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
:notify (lambda (&rest _)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;; I think the act of getting it sets
|
2009-10-05 15:32:08 +00:00
|
|
|
|
;; its value through the get function.
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(message "Applying Changes...")
|
|
|
|
|
(widget-apply eieio-wo :value-get)
|
|
|
|
|
(eieio-done-customizing eieio-co)
|
2009-10-05 15:32:08 +00:00
|
|
|
|
(message "Applying Changes...Done"))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Apply")
|
|
|
|
|
(widget-insert " ")
|
|
|
|
|
(widget-create 'push-button
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
:notify (lambda (&rest _)
|
2009-10-05 15:32:08 +00:00
|
|
|
|
(message "Resetting")
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(eieio-customize-object eieio-co eieio-cog))
|
|
|
|
|
"Reset")
|
|
|
|
|
(widget-insert " ")
|
|
|
|
|
(widget-create 'push-button
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
:notify (lambda (&rest _)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(bury-buffer))
|
|
|
|
|
"Cancel"))
|
|
|
|
|
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-custom-widget-insert ((obj eieio-default-superclass)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
&rest flags)
|
|
|
|
|
"Insert the widget used for editing object OBJ in the current buffer.
|
|
|
|
|
Arguments FLAGS are widget compatible flags.
|
|
|
|
|
Must return the created widget."
|
|
|
|
|
(apply 'widget-create 'object-edit :value obj flags))
|
|
|
|
|
|
|
|
|
|
(define-widget 'object 'object-edit
|
|
|
|
|
"Instance of a CLOS class."
|
|
|
|
|
:format "%{%t%}:\n%v"
|
|
|
|
|
:value-to-internal 'eieio-object-value-to-abstract
|
|
|
|
|
:value-to-external 'eieio-object-abstract-to-value
|
|
|
|
|
:clone-object-children t
|
|
|
|
|
)
|
|
|
|
|
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
(defun eieio-object-value-to-abstract (_widget value)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"For WIDGET, convert VALUE to an abstract /safe/ representation."
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
(if (eieio-object-p value) value))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
* lisp/emacs-lisp/eieio*.el: Use hashtables rather than obarrays
* lisp/emacs-lisp/eieio-core.el (class): Rename field symbol-obarray to
symbol-hashtable. It contains a hashtable instead of an obarray.
(generic-p): Use symbol property `eieio-method-hashtable' instead of
`eieio-method-obarray'.
(generic-primary-only-p, generic-primary-only-one-p):
Slight optimization.
(eieio-defclass-autoload-map): Use a hashtable instead of an obarray.
(eieio-defclass-autoload, eieio-defclass): Adjust/simplify accordingly.
(eieio-class-un-autoload): Use autoload-do-load.
(eieio-defclass): Use dolist, cl-pushnew, cl-callf.
Use new cl-deftype-satisfies. Adjust to use of hashtables.
Don't hardcode the value of eieio--object-num-slots.
(eieio-defgeneric-form-primary-only-one): Remove `doc-string' arg.
Use a closure rather than a backquoted lambda.
(eieio--defmethod): Adjust call accordingly. Set doc-string via the
function-documentation property.
(eieio-slot-originating-class-p, eieio-slot-name-index)
(eieiomt--optimizing-hashtable, eieiomt-install, eieiomt-add)
(eieio-generic-form): Adjust to use of hashtables.
(eieiomt--sym-optimize): Rename from eieiomt-sym-optimize; take
additional class argument.
(eieio-generic-call-methodname): Remove, unused.
* lisp/emacs-lisp/eieio-custom.el: Use lexical-binding.
(eieio-object-value-to-abstract): Simplify.
* lisp/emacs-lisp/eieio-datadebug.el: Use lexical-binding.
* lisp/emacs-lisp/eieio-opt.el (eieio-build-class-list): Use cl-mapcan.
(eieio-build-class-alist): Use dolist.
(eieio-all-generic-functions): Adjust to use of hashtables.
* lisp/emacs-lisp/eieio.el (child-of-class-p): Fix case where `class' is
`eieio-default-superclass'.
* test/automated/eieio-test-methodinvoke.el (eieio-test-method-store):
Remove use of eieio-generic-call-methodname.
(eieio-test-method-order-list-3, eieio-test-method-order-list-6)
(eieio-test-method-order-list-7, eieio-test-method-order-list-8):
Adjust the expected result accordingly.
* lisp/emacs-lisp/eieio-base.el (eieio-persistent-slot-type-is-class-p):
Prefer \' to $.
2014-12-22 15:13:02 -05:00
|
|
|
|
(defun eieio-object-abstract-to-value (_widget value)
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"For WIDGET, convert VALUE from an abstract /safe/ representation."
|
|
|
|
|
value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; customization group functions
|
|
|
|
|
;;
|
|
|
|
|
;; These functions provide the ability to create dynamic menus to
|
|
|
|
|
;; customize specific sections of an object. They do not hook directly
|
|
|
|
|
;; into a filter, but can be used to create easymenu vectors.
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-customize-object-group ((obj eieio-default-superclass))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Create a list of vectors for customizing sections of OBJ."
|
|
|
|
|
(mapcar (lambda (group)
|
|
|
|
|
(vector (concat "Group " (symbol-name group))
|
|
|
|
|
(list 'customize-object obj (list 'quote group))
|
|
|
|
|
t))
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(eieio--class-option (eieio--object-class obj) :custom-groups)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
|
|
|
|
|
(defvar eieio-read-custom-group-history nil
|
|
|
|
|
"History for the custom group reader.")
|
|
|
|
|
|
2015-01-21 14:39:06 -05:00
|
|
|
|
(cl-defmethod eieio-read-customization-group ((obj eieio-default-superclass))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
"Do a completing read on the name of a customization group in OBJ.
|
|
|
|
|
Return the symbol for the group, or nil"
|
2015-03-18 23:02:26 -04:00
|
|
|
|
(let ((g (eieio--class-option (eieio--object-class obj)
|
2015-01-04 23:11:37 -05:00
|
|
|
|
:custom-groups)))
|
2009-09-28 00:49:54 +00:00
|
|
|
|
(if (= (length g) 1)
|
|
|
|
|
(car g)
|
|
|
|
|
;; Make the association list
|
|
|
|
|
(setq g (mapcar (lambda (g) (cons (symbol-name g) g)) g))
|
|
|
|
|
(cdr (assoc
|
|
|
|
|
(completing-read (concat (oref obj name) " Custom Group: ")
|
|
|
|
|
g nil t nil 'eieio-read-custom-group-history)
|
|
|
|
|
g)))))
|
|
|
|
|
|
|
|
|
|
(provide 'eieio-custom)
|
|
|
|
|
|
2014-01-09 21:31:21 +01:00
|
|
|
|
;; Local variables:
|
|
|
|
|
;; generated-autoload-file: "eieio.el"
|
|
|
|
|
;; End:
|
|
|
|
|
|
2009-09-28 00:49:54 +00:00
|
|
|
|
;;; eieio-custom.el ends here
|