diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-05 02:14:01 +0100 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-05 02:14:01 +0100 |
commit | af8296f04700d0b0c2ba16cc4fd91ecae0256477 (patch) | |
tree | 54e0a5bfbb50c5d10ca51683cffaf56768cce358 /geiser | |
parent | eeda11c6b9191989e49fa194408c2688c99696ee (diff) | |
download | geiser-guile-af8296f04700d0b0c2ba16cc4fd91ecae0256477.tar.gz geiser-guile-af8296f04700d0b0c2ba16cc4fd91ecae0256477.tar.bz2 |
generic-methods implemented in scheme (no emacs side yet).
Diffstat (limited to 'geiser')
-rw-r--r-- | geiser/doc.scm | 7 | ||||
-rw-r--r-- | geiser/xref.scm | 30 |
2 files changed, 35 insertions, 2 deletions
diff --git a/geiser/doc.scm b/geiser/doc.scm index 01b9ce3..f655fd6 100644 --- a/geiser/doc.scm +++ b/geiser/doc.scm @@ -26,7 +26,8 @@ (define-module (geiser doc) #:export (autodoc - symbol-documentation) + symbol-documentation + object-signature) #:use-module (geiser utils) #:use-module (geiser modules) #:use-module (system vm program) @@ -51,6 +52,10 @@ (else (describe-application form))))) (else #f))) +(define (object-signature name obj) + (let ((args (obj-args obj))) + (and args (signature name args)))) + (define (describe-application form) (let* ((fun (car form)) (args (obj-args (symbol->object fun)))) diff --git a/geiser/xref.scm b/geiser/xref.scm index 2cd4d80..232d692 100644 --- a/geiser/xref.scm +++ b/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 |