[slime-devel] abcl special inspector support for java classes, methods, and other good stuff
Russell McManus
russell_mcmanus at yahoo.com
Sun Mar 1 19:37:02 UTC 2009
I hope the format is useable.
Thanks,
-russ
Index: swank-abcl.lisp
===================================================================
RCS file: /project/slime/cvsroot/slime/swank-abcl.lisp,v
retrieving revision 1.63
diff -u -u -8 -p -r1.63 swank-abcl.lisp
--- swank-abcl.lisp 10 Jan 2009 12:25:16 -0000 1.63
+++ swank-abcl.lisp 1 Mar 2009 19:35:33 -0000
@@ -552,8 +552,89 @@ part of *sysdep-pathnames* in swank.load
;; WORKAROUND: call/initialize accessors at load time
(let ((c (make-condition 'compiler-condition
:original-condition nil
:severity ':note :message "" :location nil))
(slots `(severity message short-message references location)))
(dolist (slot slots)
(funcall slot c)))
+
+;; special inspector support for java objects, methods, and classes
+
+(defun swank-backend::emacs-inspect-java-class (jclass)
+ (flet ((jclass->name (jclass)
+ (let* ((s (java:jclass-name jclass))
+ (prefix "java.lang.")
+ (lang-pos (search prefix s)))
+ (if lang-pos
+ (subseq s (+ lang-pos (length prefix)))
+ s))))
+ (append
+ `(,(princ-to-string jclass) " is the Java class named "
+ ,(java:jclass-name jclass)
+ (:newline))
+ `("Constructors: " (:newline))
+ (loop for c across (java:jclass-constructors jclass)
+ for i = 0 then (1+ i)
+ append (let ((args (map 'list #'jclass->name (java:jconstructor-params c))))
+ `(,(format nil "[~2D] ~{~A~^,~}: ~40T"
+ i
+ args)
+ (:value ,c)
+ (:newline))))
+ `("Methods" (:newline))
+ (loop for method across (java:jclass-methods jclass)
+ for i = 0 then (1+ i)
+ append (let ((args (mapcar #'jclass->name (coerce (java:jmethod-params method) 'list))))
+ `(,(format nil "[~2D] ~A ~A(~{~A~^,~}): ~40T"
+ i
+ (jclass->name (java:jmethod-return-type method))
+ (java:jmethod-name method)
+ args)
+ (:value ,method)
+ (:newline)))))))
+
+(defun swank-backend::emacs-inspect-java-object (jobject)
+ (let* ((jclass (java:jobject-class jobject))
+ (fields (coerce (java:jclass-fields jclass) 'list)))
+ (append
+ `(,(princ-to-string jobject) (:newline)
+ " is an instance of Java class " ,(java:jclass-name jclass)
+ " (" (:value ,jclass) ")" (:newline))
+ `("Fields" (:newline))
+ (loop for field in fields
+ for i = 0 then (1+ i)
+ append `(,(format nil "[~2D] ~20A : " i (java:jfield-name field))
+ (:value ,(java:jcall (java:jmethod (java:jclass "java.lang.reflect.Field")
+ "get"
+ (java:jclass "java.lang.Object"))
+ field
+ jobject))
+ (:newline))))))
+
+(defun swank-backend::emacs-inspect-java-method (jmethod)
+ (let ((return-type (java:jcall
+ (java:jmethod (java:jclass "java.lang.reflect.Method") "getReturnType")
+ jmethod))
+ (args (coerce (java:jmethod-params jmethod) 'list)))
+ (setf args
+ (mapcar #'java:jclass-name args))
+ (append
+ `("Java Method: " ,(java:jmethod-name jmethod) (:newline))
+ `("Return Type: " ,(java:jclass-name return-type) ": " (:value ,return-type) (:newline))
+ (if args
+ (append `("Arguments" (:newline))
+ (loop for arg in args
+ for i = 0 then (1+ i)
+ append `(,(format nil "[~2D] ~20A : " i arg) (:value ,arg) (:newline))))
+ `("Arguments: none" (:newline))))))
+
+(defun swank-backend::emacs-inspect-java (java-object)
+ (flet ((is-a (class-name)
+ (java:jinstance-of-p java-object (java:jclass class-name))))
+ (cond ((is-a "java.lang.Class")
+ (swank-backend::emacs-inspect-java-class java-object))
+ ((is-a "java.lang.reflect.Method")
+ (swank-backend::emacs-inspect-java-method java-object))
+ (t
+ (swank-backend::emacs-inspect-java-object java-object)))))
+
Index: contrib/swank-fancy-inspector.lisp
===================================================================
RCS file: /project/slime/cvsroot/slime/contrib/swank-fancy-inspector.lisp,v
retrieving revision 1.16
diff -u -u -8 -p -r1.16 swank-fancy-inspector.lisp
--- contrib/swank-fancy-inspector.lisp 10 Jan 2009 10:09:47 -0000 1.16
+++ contrib/swank-fancy-inspector.lisp 1 Mar 2009 19:35:34 -0000
@@ -687,16 +687,20 @@ SPECIAL-OPERATOR groups."
(position (file-position stream)))
(lambda ()
(ed-in-emacs `(,pathname :charpos ,position))))
:refreshp nil)
(:newline))
content)
content))))
+#+abcl
+(defmethod emacs-inspect ((java-object java:java-object))
+ (swank-backend::emacs-inspect-java java-object))
+
(defun common-seperated-spec (list &optional (callback (lambda (v)
`(:value ,v))))
(butlast
(loop
for i in list
collect (funcall callback i)
collect ", ")))
More information about the slime-devel
mailing list