summaryrefslogtreecommitdiff
path: root/scheme/guile/geiser/xref.scm
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2009-03-05 02:14:01 +0100
committerJose Antonio Ortega Ruiz <jao@gnu.org>2009-03-05 02:14:01 +0100
commit692eb942c39fd42ffe61f1408a4998d738c88933 (patch)
treed4ade4d02c5af29586e9e9e35cc22c90f747a50d /scheme/guile/geiser/xref.scm
parentf1e7cfe8f0417ed636aca5d17706ea8e91375241 (diff)
downloadgeiser-guile-692eb942c39fd42ffe61f1408a4998d738c88933.tar.gz
geiser-guile-692eb942c39fd42ffe61f1408a4998d738c88933.tar.bz2
generic-methods implemented in scheme (no emacs side yet).
Diffstat (limited to 'scheme/guile/geiser/xref.scm')
-rw-r--r--scheme/guile/geiser/xref.scm30
1 files changed, 29 insertions, 1 deletions
diff --git a/scheme/guile/geiser/xref.scm b/scheme/guile/geiser/xref.scm
index 2cd4d80..232d692 100644
--- a/scheme/guile/geiser/xref.scm
+++ b/scheme/guile/geiser/xref.scm
@@ -28,10 +28,38 @@
#:export (symbol-location
generic-methods)
#:use-module (geiser utils)
- #:use-module (geiser modules))
+ #:use-module (geiser modules)
+ #:use-module (geiser doc)
+ #:use-module (oop goops)
+ #:use-module (system vm program))
(define (symbol-location sym)
(cond ((symbol-module sym) => module-location)
(else '())))
+(define (generic-methods sym)
+ (let* ((gen (symbol->object sym))
+ (methods (if (is-a? gen <generic>) (generic-function-methods gen) '())))
+ (filter (lambda (x) (not (null? x)))
+ (map (lambda (m) (describe-method sym m)) methods))))
+
+(define (describe-method name m)
+ (let ((proc (method-procedure m)))
+ (if proc
+ `((location . ,(program-location proc))
+ (signature . ,(object-signature name proc)))
+ '())))
+
+(define (program-location p)
+ (cond ((program-source p 0) =>
+ (lambda (s) (make-location (program-path p) (source:line s))))
+ ((program-path p) =>
+ (lambda (s) (make-location (program-path p) #f)))
+ (else '())))
+
+(define (program-path p)
+ (let* ((mod (program-module p))
+ (name (and mod (module-name mod))))
+ (and name (module-filename name))))
+
;;; xref.scm ends here