Skip to content

Commit

Permalink
Recompute namespace info on each shadow-cljs recompilation or evaluation
Browse files Browse the repository at this point in the history
Fixes #3393
  • Loading branch information
vemv committed Aug 9, 2023
1 parent eedbab2 commit c645418
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
- [#3236](https://github.com/clojure-emacs/cider/issues/3236): `cider-repl-set-ns` no longer changes the repl session type from `cljs:shadow` to `clj`.
- [#3383](https://github.com/clojure-emacs/cider/issues/3383): `cider-connect-clj&cljs`: don't render `"ClojureScript REPL type:" for JVM repls.
- [#3331](https://github.com/clojure-emacs/cider/issues/3331): `cider-eval`: never jump to spurious locations, as sometimes conveyed by nREPL.
- [#3393](https://github.com/clojure-emacs/cider/issues/3393): recompute namespace info on each shadow-cljs recompilation or evaluation.

### Changes

Expand Down
58 changes: 57 additions & 1 deletion cider-repl.el
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,56 @@ t, as the content-type response is (currently) an alternative to the
value response. However for handlers which themselves issue subsequent
nREPL ops, it may be convenient to prevent inserting a prompt.")

(defun cider--maybe-get-state-for-shadow-cljs (buffer &optional err)
"Refresh the changed namespaces metadata given BUFFER and ERR (stderr string).
This is particularly necessary for shadow-cljs because:
* it has a particular nREPL implementation; and
* one may have saved files (which triggers recompilation,
and therefore the need for recomputing changed namespaces)
without sending a nREPL message (this can particularly happen
if the file was edited outside Emacs)."
(with-current-buffer buffer
(when (and (eq cider-repl-type 'cljs)
(eq cider-cljs-repl-type 'shadow)
(not cider-repl-cljs-upgrade-pending)
(if err
(string-match-p "Build completed\\." err)
t))
(when-let ((conn (cider-current-repl 'cljs)))
(when (nrepl-op-supported-p "cider/get-state" conn)
(nrepl-send-request '("op" "cider/get-state") nil conn))))))

(defun cider--shadow-cljs-stderr-hook (buffer err)
"Refresh the changed namespaces metadata given BUFFER and ERR."
(cider--maybe-get-state-for-shadow-cljs buffer err))

(defun cider--shadow-cljs-done-hook (buffer)
"Refresh the changed namespaces metadata given BUFFER."
(cider--maybe-get-state-for-shadow-cljs buffer))

(defcustom cider-repl-stdout-hooks nil
"Hooks to be invoked each time new stdout is received on a repl buffer.
Good for, for instance, monitoring specific strings that may be logged,
and responding to them."
:type '(repeat function)
:package-version '(cider . "1.8.0"))

(defcustom cider-repl-stderr-hooks (list #'cider--shadow-cljs-stderr-hook)
"Hooks to be invoked each time new stderr is received on a repl buffer.
Good for, for instance, monitoring specific strings that may be logged,
and responding to them."
:type '(repeat function)
:package-version '(cider . "1.8.0"))

(defcustom cider-repl-done-hooks (list #'cider--shadow-cljs-done-hook)
"Hooks to be invoked each time a given REPL interaction is complete."
:type '(repeat function)
:package-version '(cider . "1.8.0"))

(defun cider-repl-handler (buffer)
"Make an nREPL evaluation handler for the REPL BUFFER."
(let ((show-prompt t))
Expand All @@ -994,14 +1044,20 @@ nREPL ops, it may be convenient to prevent inserting a prompt.")
(lambda (buffer value)
(cider-repl-emit-result buffer value t))
(lambda (buffer out)
(dolist (f cider-repl-stdout-hooks)
(funcall f buffer out))
(cider-repl-emit-stdout buffer out))
(lambda (buffer err)
(dolist (f cider-repl-stderr-hooks)
(funcall f buffer err))
(cider-repl-emit-stderr buffer err))
(lambda (buffer)
(when show-prompt
(cider-repl-emit-prompt buffer))
(when cider-repl-buffer-size-limit
(cider-repl-maybe-trim-buffer buffer)))
(cider-repl-maybe-trim-buffer buffer))
(dolist (f cider-repl-done-hooks)
(funcall f buffer)))
nrepl-err-handler
(lambda (buffer value content-type)
(if-let* ((content-attrs (cadr content-type))
Expand Down

0 comments on commit c645418

Please sign in to comment.