|
5 | 5 | ;; when developing cider-nrepl itself, or when cider-nrepl is used as a |
6 | 6 | ;; checkout dependency - tools.namespace doesn't reload source in JARs. |
7 | 7 | (:require |
| 8 | + [cider.nrepl.middleware.util.reload :as reload-utils] |
8 | 9 | [clojure.main :refer [repl-caught]] |
9 | 10 | [clojure.tools.namespace.dir :as dir] |
10 | 11 | [clojure.tools.namespace.find :as find] |
11 | 12 | [clojure.tools.namespace.reload :as reload] |
12 | 13 | [clojure.tools.namespace.track :as track] |
13 | | - [haystack.analyzer :as stacktrace.analyzer] |
14 | | - [nrepl.middleware.interruptible-eval :refer [*msg*]] |
15 | | - [nrepl.middleware.print :as print] |
16 | 14 | [nrepl.misc :refer [response-for]] |
17 | | - [nrepl.transport :as transport] |
18 | | - [orchard.misc :as misc])) |
| 15 | + [nrepl.transport :as transport])) |
19 | 16 |
|
20 | 17 | (defonce ^:private refresh-tracker (volatile! (track/tracker))) |
21 | 18 |
|
|
56 | 53 | (update-in [::track/load] #(remove load-disabled? %)) |
57 | 54 | (update-in [::track/unload] #(remove unload-disabled? %)))) |
58 | 55 |
|
59 | | -(defn- zero-arity-callable? [func] |
60 | | - (and (fn? (if (var? func) @func func)) |
61 | | - (->> (:arglists (meta func)) |
62 | | - (some #(or (= [] %) (= '& (first %))))))) |
63 | | - |
64 | | -(defn- resolve-and-invoke |
65 | | - "Takes a string and tries to coerce a function from it. If that |
66 | | - function is a function of possible zero arity (ie, truly a thunk or |
67 | | - has optional parameters and can be called with zero args, it is |
68 | | - called. Returns whether the function was resolved." |
69 | | - [sym {:keys [_session] :as msg}] |
70 | | - (let [the-var (some-> sym misc/as-sym resolve)] |
71 | | - |
72 | | - (when (and (var? the-var) |
73 | | - (not (zero-arity-callable? the-var))) |
74 | | - (throw (IllegalArgumentException. |
75 | | - (format "%s is not a function of no arguments" sym)))) |
76 | | - |
77 | | - (binding [*msg* msg |
78 | | - *out* (print/replying-PrintWriter :out msg {}) |
79 | | - *err* (print/replying-PrintWriter :err msg {})] |
80 | | - (when (var? the-var) |
81 | | - (@the-var)) |
82 | | - (var? the-var)))) |
83 | | - |
84 | 56 | (defn- reloading-reply |
85 | 57 | [{reloading ::track/load} |
86 | 58 | {:keys [transport] :as msg}] |
87 | 59 | (transport/send |
88 | 60 | transport |
89 | 61 | (response-for msg {:reloading reloading}))) |
90 | 62 |
|
91 | | -(defn- error-reply |
92 | | - [{:keys [error error-ns]} |
93 | | - {:keys [::print/print-fn transport] :as msg}] |
94 | | - |
95 | | - (transport/send |
96 | | - transport |
97 | | - (response-for msg (cond-> {:status :error} |
98 | | - error (assoc :error (stacktrace.analyzer/analyze error print-fn)) |
99 | | - error-ns (assoc :error-ns error-ns)))) |
100 | | - |
101 | | - (binding [*msg* msg |
102 | | - *err* (print/replying-PrintWriter :err msg {})] |
103 | | - (repl-caught error))) |
104 | | - |
105 | 63 | (defn- result-reply |
106 | 64 | [{error ::reload/error |
107 | 65 | error-ns ::reload/error-ns} |
108 | 66 | {:keys [transport] :as msg}] |
109 | 67 |
|
110 | 68 | (if error |
111 | | - (error-reply {:error error :error-ns error-ns} msg) |
| 69 | + (reload-utils/error-reply {:error error :error-ns error-ns} msg) |
112 | 70 | (transport/send |
113 | 71 | transport |
114 | 72 | (response-for msg {:status :ok})))) |
115 | 73 |
|
116 | | -(defn- before-reply |
117 | | - [{:keys [before transport] :as msg}] |
118 | | - (when before |
119 | | - (transport/send |
120 | | - transport |
121 | | - (response-for msg {:status :invoking-before |
122 | | - :before before})) |
123 | | - |
124 | | - (let [resolved? (resolve-and-invoke before msg)] |
125 | | - (transport/send |
126 | | - transport |
127 | | - (response-for msg |
128 | | - {:status (if resolved? |
129 | | - :invoked-before |
130 | | - :invoked-not-resolved) |
131 | | - :before before}))))) |
132 | | - |
133 | | -(defn- after-reply |
| 74 | +(defn after-reply |
134 | 75 | [{error ::reload/error} |
135 | | - {:keys [after transport] :as msg}] |
136 | | - |
137 | | - (when (and (not error) after) |
138 | | - (try |
139 | | - (transport/send |
140 | | - transport |
141 | | - (response-for msg {:status :invoking-after |
142 | | - :after after})) |
143 | | - |
144 | | - (let [resolved? (resolve-and-invoke after msg)] |
145 | | - (transport/send |
146 | | - transport |
147 | | - (response-for msg {:status (if resolved? |
148 | | - :invoked-after |
149 | | - :invoked-not-resolved) |
150 | | - :after after}))) |
151 | | - |
152 | | - (catch Exception e |
153 | | - (error-reply {:error e} msg))))) |
| 76 | + msg] |
| 77 | + (reload-utils/after-reply error msg)) |
154 | 78 |
|
155 | 79 | (defn- refresh-reply |
156 | 80 | [{:keys [dirs transport session id] :as msg}] |
|
161 | 85 | (vswap! refresh-tracker |
162 | 86 | (fn [tracker] |
163 | 87 | (try |
164 | | - (before-reply msg) |
| 88 | + (reload-utils/before-reply msg) |
165 | 89 |
|
166 | 90 | (-> tracker |
167 | 91 | (dir/scan-dirs (or (seq dirs) (user-refresh-dirs)) |
|
173 | 97 | (doto (after-reply msg))) |
174 | 98 |
|
175 | 99 | (catch Throwable e |
176 | | - (error-reply {:error e} msg) |
| 100 | + (reload-utils/error-reply {:error e} msg) |
177 | 101 | tracker)))))) |
178 | 102 | (fn [] |
179 | 103 | (transport/send transport (response-for msg {:status :done})))))) |
|
0 commit comments