From: Russ M. <rus...@ya...> - 2008-08-16 00:48:52
|
I got frustrated that I couldn't arbitrarily inspect java classes, methods, and objects, and came up with the following. Please give it a try and let me know what you think. Note that I tried to implement this with EQL specializers and DEFMETHOD, but apparently this is presently beyond the capability of ABCL's CLOS implementation. -russ (defmethod swank:emacs-inspect ((java-object java-object)) (emacs-inspect-java java-object)) (defun swank-backend::emacs-inspect-java-class (jclass) (flet ((jclass->name (jclass) (let* ((s (jclass-name jclass)) (prefix "java.lang.") (lang-pos (search prefix s))) (if lang-pos (subseq s (+ lang-pos (length prefix))) s)))) (append `("Java Class: " ,(princ-to-string jclass) (:newline)) `("Methods" (:newline)) (loop for method across (jclass-methods jclass) for i = 0 then (1+ i) append (let ((args (mapcar #'jclass->name (coerce (jmethod-params method) 'list)))) `(,(format nil "[~2D] ~A ~A(~{~A~^,~}): ~40T" i (jclass->name (jmethod-return-type method)) (jmethod-name method) args) (:value ,method) (:newline))))))) (defun swank-backend::emacs-inspect-java-object (jobject) (let* ((jclass (jobject-class jobject)) (fields (coerce (jclass-fields jclass) 'list))) (append `("Java Object" ":" ,(princ-to-string jobject) (:newline)) `("Java Class" ":" ,(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 (jfield-name field)) (:value ,(jcall (jmethod (jclass "java.lang.reflect.Field") "get" (jclass "java.lang.Object")) field jobject)) (:newline)))))) (defun swank-backend::emacs-inspect-java-method (jmethod) (let ((return-type (jcall (jmethod (jclass "java.lang.reflect.Method") "getReturnType") jmethod)) (args (coerce (jmethod-params jmethod) 'list))) (setf args (mapcar (lambda (arg) (jclass-name arg)) args)) (append `("Java Method: " ,(jmethod-name jmethod) (:newline)) `("Return Type: " ,(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) (jinstance-of-p java-object (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))))) (defmethod swank:emacs-inspect ((java-object java-object)) (swank-backend::emacs-inspect-java java-object)) |
From: Mark E. <ev...@pa...> - 2008-08-17 08:09:21
|
On Aug 16, 2008, at 02:48 , Russ McManus wrote: > > I got frustrated that I couldn't arbitrarily inspect java classes, > methods, and objects, and came up with the following. > > Please give it a try and let me know what you think. Looks cool (the opacity of Java objects from the abcl inspector always bugged me as well), but I can't seem to get it to run. I am trying to get this to run by patching a SLIME from CVS outside of the abcl tree. Are you just patching the SLIME files inside the tree? Well, back to improving my understanding of the SLIME packaging… Mark -- "A screaming comes across the sky. It has happened before, but there is nothing to compare to it now." |
From: Mark E. <ev...@pa...> - 2008-10-04 11:29:10
Attachments:
slime-abcl-inspector.diff
|
Russ McManus wrote: > I got frustrated that I couldn't arbitrarily inspect java classes, > methods, and objects, and came up with the following. > > Please give it a try and let me know what you think. This is really fantastic, making ABCL+SLIME *much* easier to use, especially when one is stumbling around interactively discovering Java APIs. I find your code so useful, that I converted your patch to work against CVS HEAD as of 2008-09-28 so that I don't have to remember to load it each time I restart ABCL. Other than explicitly scoping the needed symbols in JAVA with package qualifiers, I haven't touched you code very much other than starting to experiment with truncating some of the longer inspection presentation lines that one gets with extremely long Java package names. Russ: I would like to get your code with credit for you as the originator into the SLIME CVS repository once I am satisfied with the presentation layout. Is that ok? > Note that I tried to implement this with EQL specializers and > DEFMETHOD, but apparently this is presently beyond the capability of > ABCL's CLOS implementation. Noted as a point to look at once we start getting seriously into debugging CLOS. Mark <ev...@pa...> -- "A screaming comes across the sky. It has happened before, but there is nothing to compare to it now." |