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