From b38d0243910b65d763576bcf662da4d33f64e324 Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Tue, 25 Aug 2009 15:30:51 +0200
Subject: Slightly better autodoc caching (probably needs an overhaul, though).

---
 elisp/geiser-autodoc.el | 33 ++++++++++++++++++---------------
 elisp/geiser-company.el |  8 ++++----
 elisp/geiser-doc.el     |  3 +--
 3 files changed, 23 insertions(+), 21 deletions(-)

(limited to 'elisp')

diff --git a/elisp/geiser-autodoc.el b/elisp/geiser-autodoc.el
index 5aa6691..c2746a0 100644
--- a/elisp/geiser-autodoc.el
+++ b/elisp/geiser-autodoc.el
@@ -68,7 +68,7 @@ when `geiser-autodoc-display-module-p' is on."
 (make-variable-buffer-local
  (defvar geiser-autodoc--cached-signatures nil))
 
-(defun geiser-autodoc--get-signatures (funs)
+(defun geiser-autodoc--get-signatures (funs &optional keep-cached)
   (when funs
     (let ((missing) (cached))
       (if (not geiser-autodoc--cached-signatures)
@@ -77,14 +77,16 @@ when `geiser-autodoc-display-module-p' is on."
           (let ((cf (assq f geiser-autodoc--cached-signatures)))
             (if cf (push cf cached)
               (push f missing)))))
-      (unless cached
+      (unless (or cached keep-cached)
         (setq geiser-autodoc--cached-signatures nil))
-      (if (not missing) geiser-autodoc--cached-signatures
+      (when missing
         (let ((res (geiser-eval--send/result `(:eval ((:ge autodoc)
                                                       (quote ,missing)))
                                              500)))
           (when res
-            (setq geiser-autodoc--cached-signatures (append cached res))))))))
+            (setq geiser-autodoc--cached-signatures
+                  (append res (if keep-cached geiser-autodoc--cached-signatures cached))))))
+      geiser-autodoc--cached-signatures)))
 
 (defun geiser-autodoc--insert-args (args current &optional pos)
   (dolist (a args)
@@ -109,8 +111,9 @@ when `geiser-autodoc-display-module-p' is on."
                proc)))
     (propertize str 'face 'geiser-font-lock-autodoc-procedure-name)))
 
-(defun geiser-autodoc--str (proc desc signature)
-  (let ((args (cdr (assoc 'args signature)))
+(defun geiser-autodoc--str (desc signature)
+  (let ((proc (car desc))
+        (args (cdr (assoc 'args signature)))
         (module (cdr (assoc 'module signature))))
     (if (not args) (geiser-autodoc--proc-name proc module)
       (let ((cpos 1)
@@ -140,15 +143,15 @@ when `geiser-autodoc-display-module-p' is on."
           (insert ")")
           (buffer-string))))))
 
-(defun geiser-autodoc--autodoc (path)
-  (let* ((funs (mapcar 'car path))
-         (signs (geiser-autodoc--get-signatures funs)))
-    (when signs
-      (catch 'signature
-        (dolist (f funs)
-          (let ((signature (cdr (assq f signs))))
-            (when signature
-              (throw 'signature (geiser-autodoc--str f (assq f path) signature)))))))))
+(defun geiser-autodoc--autodoc (path &optional keep-cached)
+  (let ((signs (geiser-autodoc--get-signatures (mapcar 'car path) keep-cached))
+        (p (car path))
+        (s))
+    (while (and path (not s))
+      (unless (setq s (cdr (assq (car p) signs)))
+        (setq p (car path))
+        (setq path (cdr path))))
+    (when s (geiser-autodoc--str p s))))
 
 
 ;;; Autodoc function:
diff --git a/elisp/geiser-company.el b/elisp/geiser-company.el
index 8ae8969..ef4ce38 100644
--- a/elisp/geiser-company.el
+++ b/elisp/geiser-company.el
@@ -38,7 +38,7 @@
   (ignore-errors
     (if module
 	(format "%s [module]" id)
-      (geiser-autodoc--autodoc (list (list (intern id) 0))))))
+      (geiser-autodoc--autodoc (list (list (intern id) 0)) t))))
 
 (defsubst geiser-company--doc-buffer (id module)
   nil)
@@ -61,11 +61,11 @@
 
 (defun geiser-company--setup (enable)
   (setq geiser-company--enabled-flag enable)
+  (when (boundp 'company-lighter)
+    (setq company-lighter "/C"))
   (when (fboundp 'company-mode)
     (company-mode nil)
-    (when enable (company-mode enable)))
-  (when (boundp 'company-lighter)
-    (setq company-lighter "/C")))
+    (when enable (company-mode enable))))
 
 (defun geiser-company--inhibit-autodoc (ignored)
   (setq geiser-autodoc--inhibit-flag t))
diff --git a/elisp/geiser-doc.el b/elisp/geiser-doc.el
index 8e5c816..29f0de2 100644
--- a/elisp/geiser-doc.el
+++ b/elisp/geiser-doc.el
@@ -175,8 +175,7 @@
             (message "No documentation available for '%s'" symbol)
           (geiser-doc--with-buffer
             (erase-buffer)
-            (geiser-doc--insert-title (geiser-autodoc--str (format "%s" symbol)
-                                                           nil
+            (geiser-doc--insert-title (geiser-autodoc--str (list (format "%s" symbol) 0)
                                                            (cdr (assoc 'signature ds))))
             (newline)
             (insert (or (cdr (assoc 'docstring ds)) ""))
-- 
cgit v1.2.3