emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/geiser-guile af8296f 051/284: generic-methods implemented


From: Philip Kaludercic
Subject: [nongnu] elpa/geiser-guile af8296f 051/284: generic-methods implemented in scheme (no emacs side yet).
Date: Sun, 1 Aug 2021 18:29:14 -0400 (EDT)

branch: elpa/geiser-guile
commit af8296f04700d0b0c2ba16cc4fd91ecae0256477
Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
Commit: Jose Antonio Ortega Ruiz <jao@gnu.org>

    generic-methods implemented in scheme (no emacs side yet).
---
 geiser/doc.scm  |  7 ++++++-
 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]