|
| 1 | +(ns cider.nrepl.middleware.reload |
| 2 | + (:require |
| 3 | + [clj-reload.core :as reload] |
| 4 | + [clojure.main :refer [repl-caught]] |
| 5 | + [clojure.string :as str] |
| 6 | + [haystack.analyzer :as analyzer] |
| 7 | + [nrepl.middleware.interruptible-eval :refer [*msg*]] |
| 8 | + [nrepl.middleware.print :as print] |
| 9 | + [nrepl.misc :refer [response-for]] |
| 10 | + [nrepl.transport :as transport] |
| 11 | + [orchard.misc :as misc])) |
| 12 | + |
| 13 | +(defn- user-reload |
| 14 | + "clj-reload.core/reload from the user project. |
| 15 | + Must be configured via clj-reload.core/init before being called." |
| 16 | + [] |
| 17 | + (some-> (symbol "clj-reload.core" "reload") ;; Don't use mrandorsenized version |
| 18 | + resolve)) |
| 19 | + |
| 20 | +(defn respond |
| 21 | + [{:keys [transport] :as msg} response] |
| 22 | + (transport/send transport (response-for msg response))) |
| 23 | + |
| 24 | +(defn- refresh-reply |
| 25 | + [{:keys [::print/print-fn transport session id] :as msg}] |
| 26 | + (let [{:keys [exec]} (meta session)] |
| 27 | + (exec id |
| 28 | + (fn [] |
| 29 | + (try |
| 30 | + (let [reload (or (user-reload) reload/reload)] |
| 31 | + (reload (cond-> {:log-fn (fn [& args] |
| 32 | + (respond msg {:progress (str/join " " args)}))} |
| 33 | + (:all msg) (assoc :only :all))) |
| 34 | + (respond msg {:status :ok})) |
| 35 | + (catch Throwable error |
| 36 | + (respond msg {:status :error |
| 37 | + ;; TODO assoc :file, :line info if available |
| 38 | + :error (analyzer/analyze error print-fn)}) |
| 39 | + (binding [*msg* msg |
| 40 | + *err* (print/replying-PrintWriter :err msg {})] |
| 41 | + (repl-caught error))))) |
| 42 | + |
| 43 | + (fn [] (respond msg {:status :done}))))) |
| 44 | + |
| 45 | +(defn handle-reload [handler msg] |
| 46 | + (case (:op msg) |
| 47 | + "cider.clj-reload/reload" (refresh-reply msg) |
| 48 | + "cider.clj-reload/reload-all" (refresh-reply (assoc msg :all true)) |
| 49 | + (handler msg))) |
| 50 | + |
0 commit comments