From 6fecb5b2f47a6b204394f8e387c38d9fbdde7b58 Mon Sep 17 00:00:00 2001
From: Thomas Heller
Date: Sun, 18 Mar 2018 11:26:28 +0100
Subject: [PATCH] change nrepl piggieback binding so its immediately available
after set
---
.../shadow/cljs/devtools/server/nrepl.clj | 24 +++++++++++++------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/main/shadow/cljs/devtools/server/nrepl.clj b/src/main/shadow/cljs/devtools/server/nrepl.clj
index d5d59ec8..b90cd2ec 100644
--- a/src/main/shadow/cljs/devtools/server/nrepl.clj
+++ b/src/main/shadow/cljs/devtools/server/nrepl.clj
@@ -117,11 +117,25 @@
(defn cljs-select [next]
(fn [{:keys [session op] :as msg}]
+ (swap! session assoc #'api/*nrepl-active* true)
+
(let [repl-var #'api/*nrepl-cljs*]
(when-not (contains? @session repl-var)
- (swap! session assoc repl-var nil))
-
- (swap! session assoc #'api/*nrepl-active* true)
+ (swap! session assoc repl-var nil)
+
+ ;; always set the piggieback compiler env binding to a IDeref
+ ;; so its immediately derefable when the nrepl-cljs binding is set
+ ;; if we only add the binding on message in it isn't available
+ ;; for some cider-nrepl middleware that already uses it on message-out
+ (swap! session assoc #'cemerick.piggieback/*cljs-compiler-env*
+ ;; FIXME: cider seems to use this in places and bind cljs.env/*compiler* with it
+ ;; if something tries to write to it this will fail?
+ (reify
+ clojure.lang.IDeref
+ (deref [_]
+ (when-let [build-id @repl-var]
+ (when-let [worker (api/get-worker build-id)]
+ (-> worker :state-ref deref :build-state :compiler-env)))))))
(let [build-id
(get @session repl-var)
@@ -137,10 +151,6 @@
(println)
(flush))
- (if worker
- (swap! session assoc #'cemerick.piggieback/*cljs-compiler-env* (-> worker :state-ref deref :build-state :compiler-env))
- (swap! session dissoc #'cemerick.piggieback/*cljs-compiler-env*))
-
(-> msg
(cond->
worker