* lisp/emacs-lisp/cl-macs.el (cl--transform-lambda): Defend against
[bpt/emacs.git] / lisp / emacs-lisp / eieio-datadebug.el
CommitLineData
e608e7be
CY
1;;; eieio-datadebug.el --- EIEIO extensions to the data debugger.
2
acaf905b 3;; Copyright (C) 2007-2012 Free Software Foundation, Inc.
e608e7be 4
9ffe3f52 5;; Author: Eric M. Ludlam <zappo@gnu.org>
e608e7be 6;; Keywords: OO, lisp
bd78fa1d 7;; Package: eieio
e608e7be
CY
8
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software: you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
23
24;;; Commentary:
25;;
26;; Extensions to data-debug for EIEIO objects.
27;;
28
29(require 'eieio)
30(require 'data-debug)
31
32;;; Code:
33
34(defun data-debug-insert-object-slots (object prefix)
35 "Insert all the slots of OBJECT.
36PREFIX specifies what to insert at the start of each line."
37 (let ((attrprefix (concat (make-string (length prefix) ? ) "] ")))
38 (data-debug/eieio-insert-slots object attrprefix)))
39
40(defun data-debug-insert-object-slots-from-point (point)
41 "Insert the object slots found at the object button at POINT."
42 (let ((object (get-text-property point 'ddebug))
43 (indent (get-text-property point 'ddebug-indent))
44 start)
45 (end-of-line)
46 (setq start (point))
47 (forward-char 1)
48 (data-debug-insert-object-slots object
49 (concat (make-string indent ? )
50 "~ "))
51 (goto-char start)))
52
53(defun data-debug-insert-object-button (object prefix prebuttontext)
54 "Insert a button representing OBJECT.
9ffe3f52 55PREFIX is the text that precedes the button.
e608e7be
CY
56PREBUTTONTEXT is some text between PREFIX and the object button."
57 (let ((start (point))
58 (end nil)
59 (str (object-print object))
60 (tip (format "Object %s\nClass: %S\nParent(s): %S\n%d slots"
61 (object-name-string object)
62 (object-class object)
63 (class-parents (object-class object))
64 (length (object-slots object))
65 ))
66 )
67 (insert prefix prebuttontext str)
68 (setq end (point))
69 (put-text-property (- end (length str)) end 'face 'font-lock-keyword-face)
70 (put-text-property start end 'ddebug object)
71 (put-text-property start end 'ddebug-indent(length prefix))
72 (put-text-property start end 'ddebug-prefix prefix)
73 (put-text-property start end 'help-echo tip)
74 (put-text-property start end 'ddebug-function
75 'data-debug-insert-object-slots-from-point)
76 (insert "\n")))
77
78;;; METHODS
79;;
80;; Each object should have an opportunity to show stuff about itself.
81
82(defmethod data-debug/eieio-insert-slots ((obj eieio-default-superclass)
83 prefix)
84 "Insert the slots of OBJ into the current DDEBUG buffer."
85 (data-debug-insert-thing (object-name-string obj)
86 prefix
87 "Name: ")
88 (let* ((cl (object-class obj))
89 (cv (class-v cl)))
90 (data-debug-insert-thing (class-constructor cl)
91 prefix
92 "Class: ")
93 ;; Loop over all the public slots
94 (let ((publa (aref cv class-public-a))
e608e7be
CY
95 )
96 (while publa
97 (if (slot-boundp obj (car publa))
62a81506
CY
98 (let* ((i (class-slot-initarg cl (car publa)))
99 (v (eieio-oref obj (car publa))))
e608e7be
CY
100 (data-debug-insert-thing
101 v prefix (concat
102 (if i (symbol-name i)
103 (symbol-name (car publa)))
104 " ")))
105 ;; Unbound case
106 (let ((i (class-slot-initarg cl (car publa))))
107 (data-debug-insert-custom
108 "#unbound" prefix
109 (concat (if i (symbol-name i)
110 (symbol-name (car publa)))
111 " ")
112 'font-lock-keyword-face))
113 )
62a81506 114 (setq publa (cdr publa))))))
e608e7be
CY
115
116;;; Augment the Data debug thing display list.
117(data-debug-add-specialized-thing (lambda (thing) (object-p thing))
118 #'data-debug-insert-object-button)
119
120;;; DEBUG METHODS
121;;
122;; A generic function to run DDEBUG on an object and popup a new buffer.
123;;
124(defmethod data-debug-show ((obj eieio-default-superclass))
a8f316ca 125 "Run ddebug against any EIEIO object OBJ."
e608e7be
CY
126 (data-debug-new-buffer (format "*%s DDEBUG*" (object-name obj)))
127 (data-debug-insert-object-slots obj "]"))
128
129;;; DEBUG FUNCTIONS
130;;
131(defun eieio-debug-methodinvoke (method class)
132 "Show the method invocation order for METHOD with CLASS object."
133 (interactive "aMethod: \nXClass Expression: ")
134 (let* ((eieio-pre-method-execution-hooks
135 (lambda (l) (throw 'moose l) ))
136 (data
137 (catch 'moose (eieio-generic-call
138 method (list class))))
139 (buf (data-debug-new-buffer "*Method Invocation*"))
140 (data2 (mapcar (lambda (sym)
141 (symbol-function (car sym)))
142 data)))
143 (data-debug-insert-thing data2 ">" "")))
144
145(provide 'eieio-datadebug)
146
147;;; eieio-datadebug.el ends here