From 8982bb6bb2afce626cd60533cb582ae88259a402 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Tue, 28 Dec 2010 16:25:52 +0100 Subject: Leaner autodoc cache We cannot consistently maintain a local cache, because of re-evaluations of external symbols will go unnoticed. The new strategy (remembering only the latest signatures) mostly works, although it introduces a bit of extra flickering every now and then. A global cache is perhaps worth considering. --- elisp/geiser-autodoc.el | 44 ++++++++++++++++---------------------------- elisp/geiser-compile.el | 2 +- 2 files changed, 17 insertions(+), 29 deletions(-) (limited to 'elisp') diff --git a/elisp/geiser-autodoc.el b/elisp/geiser-autodoc.el index 429d369..8ab89a6 100644 --- a/elisp/geiser-autodoc.el +++ b/elisp/geiser-autodoc.el @@ -54,39 +54,27 @@ when `geiser-autodoc-display-module-p' is on." (make-variable-buffer-local (defvar geiser-autodoc--cached-signatures nil)) -(defun geiser-autodoc--clean-cache (&optional whole) - (if whole - (setq geiser-autodoc--cached-signatures nil) - (let ((s (car (last (geiser-syntax--locals-around-point nil nil)))) - (cache)) - (when s - (dolist (item geiser-autodoc--cached-signatures) - (unless (string-equal s (car item)) (push item cache))) - (setq geiser-autodoc--cached-signatures (nreverse cache)))))) - -(defun geiser-autodoc--save-signatures (ret) - (let ((res (geiser-eval--retort-result ret))) +(defsubst geiser-autodoc--clean-cache () + (setq geiser-autodoc--cached-signatures nil)) + +(defun geiser-autodoc--show-signatures (ret) + (let ((res (geiser-eval--retort-result ret)) + (signs)) (when res (dolist (item res) - (push (cons (format "%s" (car item)) (cdr item)) - geiser-autodoc--cached-signatures)) - (let ((str (geiser-autodoc--autodoc (geiser-syntax--scan-sexps) - geiser-autodoc--cached-signatures))) - (when str (eldoc-message str)))))) + (push (cons (format "%s" (car item)) (cdr item)) signs)) + (let ((str (geiser-autodoc--autodoc (geiser-syntax--scan-sexps) signs))) + (when str (eldoc-message str))) + (setq geiser-autodoc--cached-signatures signs)))) (defun geiser-autodoc--get-signatures (funs) (when funs - (let ((missing) (cached)) - (if (not geiser-autodoc--cached-signatures) - (setq missing funs) - (dolist (f funs) - (let ((cf (assoc f geiser-autodoc--cached-signatures))) - (if cf (push cf cached) (push f missing))))) - (when missing - (let ((m (format "'(%s)" (mapconcat 'identity missing " ")))) - (geiser-eval--send `(:eval (:ge autodoc (:scm ,m))) - 'geiser-autodoc--save-signatures))) - cached))) + (let ((m (format "'(%s)" (mapconcat 'identity funs " ")))) + (geiser-eval--send `(:eval (:ge autodoc (:scm ,m))) + 'geiser-autodoc--show-signatures))) + (and (or (assoc (car funs) geiser-autodoc--cached-signatures) + (assoc (cadr funs) geiser-autodoc--cached-signatures)) + geiser-autodoc--cached-signatures)) (defun geiser-autodoc--sanitize-args (args) (cond ((null args) nil) diff --git a/elisp/geiser-compile.el b/elisp/geiser-compile.el index f59f9e5..bc9aace 100644 --- a/elisp/geiser-compile.el +++ b/elisp/geiser-compile.el @@ -39,7 +39,7 @@ (path (cdr b/p)) (msg (format "%s %s ..." msg path))) (message msg) - (geiser-autodoc--clean-cache t) + (geiser-autodoc--clean-cache) (geiser-compile--display-result msg (geiser-eval--send/wait `(,(if compile-p :comp-file :load-file) ,path))))) -- cgit v1.2.3