clojure-emacs / clojure-emacs/clojure-mode

namespace caching breaks updating namespace name

Aperta
#480 5 commenti 1 reazione 0 assegnatari Vedi su GitHub
bug enhancement
Lingua principale
Emacs Lisp
Stelle
1k
Fork
249
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

```lisp
(defun clojure-update-ns ()
"Update the namespace of the current buffer.
Useful if a file has been renamed."
(interactive)
(let ((nsname (funcall clojure-expected-ns-function)))
(when nsname
(save-excursion
(save-match-data
(if (clojure-find-ns)
(progn
(replace-match nsname nil nil nil 4)
(message "ns form updated to `%s'" nsname)
(setq clojure-cached-ns nsname))
(error "Namespace not found")))))))
```

This is the helpful function to update the namespace and reset the cache for namespaces. Unfortunately it relies on the replace match generated in `clojure-find-ns`. The problem is that this match does not happen if namespace caching is enbled.

```lisp
(defun clojure-find-ns ()
"Return the namespace of the current Clojure buffer.
Return the namespace closest to point and above it. If there are
no namespaces above point, return the first one in the buffer.

The results will be cac(match-string-no-properties 4)hed if `clojure-cache-ns' is set to t."
(if (and clojure-cache-ns clojure-cached-ns)
clojure-cached-ns
(let ((ns (save-excursion
(save-restriction
(widen)

;; Move to top-level to avoid searching from inside ns
(ignore-errors (while t (up-list nil t t)))

;; The closest ns form above point.
(when (or (re-search-backward clojure-namespace-name-regex nil t)
;; Or any form at all.
(and (goto-char (point-min))
(re-search-forward clojure-namespace-name-regex nil t)))
(match-string-no-properties 4))))))
(setq clojure-cached-ns ns)
ns)))
```
Note the top level bails if the cache is already set and therefore does not call `(match-string-no-properties 4)` yielding an error.

This leaves an unfortunate catch-22: if you use the cache, you need to update it with update-ns. If you update the ns with the cache on, it doesn't create the match to update the cache.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia leggendo clojure-update-ns e clojure-find-ns, in particolare il ramo cached e i dati di corrispondenza usati da replace-match. Riproduci il problema con clojure-cache-ns abilitato durante l’aggiornamento di un namespace. Il lavoro è completato quando l’aggiornamento del namespace riesce e il namespace nella cache viene aggiornato in modo coerente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
emacs-lisp
Ambito
tooling
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.