I have written a couple of dozen lines of code to improve the way the
inspector works in abcl for certain java objects. At this point, I
can't work without these improvements, but I haven't been able to
quite figure out how to produce a proper patch to slime for inclusion.
Normally, what i do is execute the following forms after swank is
already loaded. This seems to work fine. However when I put all the
following forms into swank-abcl.lisp, this approach fails because the
swank package is not loaded yet.
Any ideas about how I can get organize the following code so that it
works cleanly with slime?
Thanks,
-russ
Here is the code:
;; this is the troublesome form. where should it go?
(defmethod swank:emacs-inspect ((java-object java-object))
(swank-backend::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)))))