[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode 35d3830 306/385: cache improvements
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode 35d3830 306/385: cache improvements |
Date: |
Tue, 5 Oct 2021 23:59:53 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit 35d383078e53227d3aa550d628abf6c461459219
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
cache improvements
---
haskell-tng-extra-company.el | 2 +-
haskell-tng-hsinspect.el | 43 ++++++++++++++++++-------------------------
haskell-tng-util.el | 43 +++++++++++++++++++++----------------------
3 files changed, 40 insertions(+), 48 deletions(-)
diff --git a/haskell-tng-extra-company.el b/haskell-tng-extra-company.el
index 54304d1..f9f713f 100644
--- a/haskell-tng-extra-company.el
+++ b/haskell-tng-extra-company.el
@@ -54,7 +54,7 @@
;;(message "TNG asked with %S" arg)
(seq-mapcat
(lambda (names) (all-completions arg (seq-map #'cdr names)))
- (haskell-tng--hsinspect-imports 'no-work nil)))
+ (haskell-tng--hsinspect-imports 'no-work)))
('sorted t)
('duplicates t)
;; TODO 'meta return the FQN
diff --git a/haskell-tng-hsinspect.el b/haskell-tng-hsinspect.el
index c6b638b..c12ad5d 100644
--- a/haskell-tng-hsinspect.el
+++ b/haskell-tng-hsinspect.el
@@ -33,16 +33,13 @@ name of the symbol at point in the minibuffer.
A prefix argument ensures that caches are flushes."
(interactive "P")
- (if-let* ((sym (haskell-tng--hsinspect-symbol-at-point))
- (found (seq-find
- (lambda (names) (member sym (seq-map #'cdr names)))
- (haskell-tng--hsinspect-imports nil alt))))
- ;; TODO multiple hits
- ;; TODO feedback when hsinspect is broken
- (popup-tip (format "%s" (cdar (last found))))
- (if (eq t haskell-tng--hsinspect-imports)
- (error "hsinspect is not available")
- (message "<not imported>"))))
+ (when-let* ((sym (haskell-tng--hsinspect-symbol-at-point))
+ (found (seq-find
+ (lambda (names) (member sym (seq-map #'cdr names)))
+ (haskell-tng--hsinspect-imports nil alt))))
+ ;; TODO multiple hits
+ ;; TODO feedback when hsinspect is broken
+ (popup-tip (format "%s" (cdar (last found))))))
;;;###autoload
(defun haskell-tng-import-symbol-at-point (&optional alt)
@@ -100,12 +97,12 @@ A prefix argument ensures that caches are flushes."
(re-search-backward
(rx symbol-start (+ (| word (syntax symbol) ".")) point)
(line-beginning-position)
- t))
+ 'no-error))
(match-beginning 0))
(save-excursion
(re-search-forward
(rx point (+ (| word (syntax symbol) ".")) symbol-end)
- (line-end-position) t)
+ (line-end-position) 'no-error)
(match-end 0))))
(defun haskell-tng--hsinspect-ghcflags ()
@@ -116,12 +113,10 @@ A prefix argument ensures that caches are flushes."
(insert-file-contents (expand-file-name ".ghc.flags"))
(split-string
(buffer-substring-no-properties (point-min) (point-max))))
- (user-error "could not find `.ghc.flags'.")))
+ (user-error "could not find `.ghc.flags': add GhcFlags.Plugin and
compile.")))
-(defvar-local haskell-tng--hsinspect-imports nil
- "Cache for the last `imports' call for this buffer.
-t means the process failed.")
-(defun haskell-tng--hsinspect-imports (no-work flush-cache)
+(defvar-local haskell-tng--hsinspect-imports nil)
+(defun haskell-tng--hsinspect-imports (&optional no-work flush-cache)
(haskell-tng--hsinspect-cached
#'haskell-tng--hsinspect
`("imports" ,buffer-file-name)
@@ -130,10 +125,9 @@ t means the process failed.")
no-work
flush-cache))
-(defvar-local haskell-tng--hsinspect-index nil
- "Cache for the last `index' call for this buffer.
-t means the process failed.")
-(defun haskell-tng--hsinspect-index (flush-cache)
+;; TODO use a package specific variable buffer to save memory
+(defvar-local haskell-tng--hsinspect-index nil)
+(defun haskell-tng--hsinspect-index (&optional flush-cache)
(when-let (ghcflags-dir
(locate-dominating-file default-directory ".ghc.flags"))
(haskell-tng--hsinspect-cached
@@ -144,7 +138,7 @@ t means the process failed.")
nil
flush-cache)))
-;; FIXME use a cache
+;; FIXME use a project-wide cache
(defvar-local haskell-tng--hsinspect-exe nil)
(defvar haskell-tng--hsinspect-which-hsinspect
"cabal exec -v0 which -- hsinspect")
@@ -157,7 +151,7 @@ t means the process failed.")
(let ((which (string-trim (shell-command-to-string
haskell-tng--hsinspect-which-hsinspect))))
(if (file-exists-p which)
which
- ;; fall back to system installed binary
+ ;; TODO don't do this, prefer an error message
"hsinspect")))))
(defun haskell-tng--hsinspect (&rest params)
@@ -169,7 +163,6 @@ t means the process failed.")
(let ((process-environment (cons "GHC_ENVIRONMENT=-"
process-environment)))
(apply
#'call-process
- ;; TODO async
(haskell-tng--hsinspect-exe)
nil "*hsinspect*" nil
(append params '("--") ghcflags))))
@@ -178,7 +171,7 @@ t means the process failed.")
;; TODO remove this resilience against stdout / stderr noise
(goto-char (point-max))
(backward-sexp)
- (or (ignore-errors (read (current-buffer))) t)))))
+ (ignore-errors (read (current-buffer)))))))
(provide 'haskell-tng-hsinspect)
;;; haskell-tng-hsinspect.el ends here
diff --git a/haskell-tng-util.el b/haskell-tng-util.el
index d7f93a8..25733cc 100644
--- a/haskell-tng-util.el
+++ b/haskell-tng-util.el
@@ -95,23 +95,29 @@ and taking a regexp."
(concat "qualified " module " as " as)))
"\n")))
+;; TODO split into two calls: disk and local
;; TODO needs a unit test
;; TODO a macro that expands out the local variable
(defun haskell-tng--hsinspect-cached
(fn args local disk &optional no-work flush-cache)
"A two-tier cache over a FN that takes ARGS.
-The caller is responsible for flushing the cache.
+The caller is responsible for flushing the cache. For
+consistency, it is recommended that commands using this cache
+flush the cache when the universal argument is provided.
If the LOCAL reference contains a cache of a previous call, it is
returned immediately.
If DISK expands to a file that exists in the cache directory, it
-is read as an s-expression, saved to LOCAL, and returned.
+is read as an s-expression, saved to LOCAL, and returned. Callers
+are advised to version their DISK cache as it is persisted
+between restarts and software upgrades.
Otherwise FN is called with ARGS and saved to both LOCAL and
DISK.
-Errors are not cached, nil return values are cached.
+Errors are not cached, nil return values are cached in LOCAL but
+not in DISK.
NO-WORK skips FN and only queries the caches.
@@ -120,34 +126,27 @@ FLUSH-CACHE forces both LOCAL and DISK to be invalidated."
(set local nil))
(when (not (symbol-value local))
(let ((cache-file-name
- (concat (xdg-cache-home) "/" disk)))
+ (concat (xdg-cache-home) "/haskell-tng/" disk ".gz")))
(when (and flush-cache (file-exists-p cache-file-name))
(delete-file cache-file-name))
(if (file-exists-p cache-file-name)
(set
local
- (progn
- ;; TODO remove this check, it's just for debugging
- (if (or
- (buffer-modified-p)
- (time-less-p
- (file-attribute-modification-time (file-attributes
cache-file-name))
- (file-attribute-modification-time (file-attributes
buffer-file-name))))
- (message "loading %S cache older than the current buffer"
(car args))
- (message "loading %S cache" (car args)))
- (with-temp-buffer
- (insert-file-contents cache-file-name)
- (goto-char (point-min))
- (ignore-errors (read (current-buffer))))))
+ (with-temp-buffer
+ ;; TODO set jka-compr-verbose to nil to disable messages
(currently
+ ;; giving useful debugging hints so left on).
+ (insert-file-contents cache-file-name)
+ (goto-char (point-min))
+ (ignore-errors (read (current-buffer)))))
(unless (or no-work
(eq 'cached-nil (symbol-value local)))
(set local 'cached-nil)
(set local (apply fn args))
- (unless local (set local 'cached-nil))
- (let ((cache (symbol-value local)))
- (with-temp-file cache-file-name
- (make-directory (file-name-directory cache-file-name)
'create-parents)
- (prin1 cache (current-buffer))))))))
+ (if-let (cache (symbol-value local))
+ (with-temp-file cache-file-name
+ (make-directory (file-name-directory cache-file-name)
'create-parents)
+ (prin1 cache (current-buffer)))
+ (set local 'cached-nil))))))
(when (not (eq 'cached-nil (symbol-value local)))
(symbol-value local)))
- [nongnu] elpa/haskell-tng-mode e3c6dc6 336/385: follow re-exports, (continued)
- [nongnu] elpa/haskell-tng-mode e3c6dc6 336/385: follow re-exports, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 9904e72 366/385: jump-to-definition works inside the project, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 1c68e79 381/385: requires emacs 27, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 55d8e69 385/385: upgrade hsinspect, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 97e4a66 379/385: bump hsinspect, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 3870bf1 367/385: time to remove the cabal v2- prefixes, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 47f1f9f 180/385: lex CONSYM correctly, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 9bc086a 187/385: easier install, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 4f40db3 218/385: fast-tags is stack compatible by default, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 59640ce 234/385: cleanups thanks to MELPA review, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 35d3830 306/385: cache improvements,
ELPA Syncer <=
- [nongnu] elpa/haskell-tng-mode c0b1b6b 301/385: change the compile-always-ask default, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 907c8fa 153/385: ImplicitParams indentation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ca00f1f 183/385: thot, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 611711a 208/385: address melpa review, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 89c5c80 223/385: improve smartparens workaround, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode e270647 228/385: more robust calls to hsinspect, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ad5967b 236/385: simpler installation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 599d4f0 283/385: import symbol at point, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 9b334f7 275/385: ghcflags, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode f221f95 173/385: introduce types and constraints to the grammar, ELPA Syncer, 2021/10/06