|
263 | 263 | the nREPL session."
|
264 | 264 | (atom {}))
|
265 | 265 |
|
266 |
| -(defmacro with-interruptible-eval |
267 |
| - "Run body mimicking interruptible-eval." |
268 |
| - [msg & body] |
269 |
| - `(let [session# (:session ~msg)] |
270 |
| - ;; Before tools.nrepl-0.2.10, `queue-eval` was private. |
271 |
| - (@#'ie/queue-eval session# (:executor ~msg) |
272 |
| - (fn [] |
273 |
| - (alter-meta! session# assoc |
274 |
| - :thread (Thread/currentThread) |
275 |
| - :eval-msg ~msg) |
276 |
| - (binding [ie/*msg* ~msg] |
277 |
| - (with-bindings @session# |
278 |
| - ~@body) |
279 |
| - (alter-meta! session# dissoc :thread :eval-msg)))))) |
280 |
| - |
281 | 266 | (defn handle-test-var-query-op
|
282 |
| - [{:keys [var-query transport] :as msg}] |
283 |
| - (with-interruptible-eval |
284 |
| - msg |
285 |
| - (try |
286 |
| - (let [stringify-msg (fn [report] |
287 |
| - (walk/postwalk (fn [x] (if (and (map? x) |
288 |
| - (contains? x :message)) |
289 |
| - (update x :message str) |
290 |
| - x)) |
291 |
| - report)) |
292 |
| - report (-> var-query |
293 |
| - (assoc-in [:ns-query :has-tests?] true) |
294 |
| - (assoc :test? true) |
295 |
| - (util.coerce/var-query) |
296 |
| - test-var-query |
297 |
| - stringify-msg)] |
298 |
| - (reset! results (:results report)) |
299 |
| - (t/send transport (response-for msg (u/transform-value report)))) |
300 |
| - (catch clojure.lang.ExceptionInfo e |
301 |
| - (let [d (ex-data e)] |
302 |
| - (if (::util.coerce/id d) |
303 |
| - (case (::util.coerce/id d) |
304 |
| - :namespace-not-found (t/send transport (response-for msg :status :namespace-not-found))) |
305 |
| - (throw e))))) |
306 |
| - (t/send transport (response-for msg :status :done)))) |
| 267 | + [{:keys [var-query transport session id] :as msg}] |
| 268 | + (let [{:keys [exec]} (meta session)] |
| 269 | + (exec id |
| 270 | + (fn [] |
| 271 | + (with-bindings (assoc @session #'ie/*msg* msg) |
| 272 | + (try |
| 273 | + (let [stringify-msg (fn [report] |
| 274 | + (walk/postwalk (fn [x] (if (and (map? x) |
| 275 | + (contains? x :message)) |
| 276 | + (update x :message str) |
| 277 | + x)) |
| 278 | + report)) |
| 279 | + report (-> var-query |
| 280 | + (assoc-in [:ns-query :has-tests?] true) |
| 281 | + (assoc :test? true) |
| 282 | + (util.coerce/var-query) |
| 283 | + test-var-query |
| 284 | + stringify-msg)] |
| 285 | + (reset! results (:results report)) |
| 286 | + (t/send transport (response-for msg (u/transform-value report)))) |
| 287 | + (catch clojure.lang.ExceptionInfo e |
| 288 | + (let [d (ex-data e)] |
| 289 | + (if (::util.coerce/id d) |
| 290 | + (case (::util.coerce/id d) |
| 291 | + :namespace-not-found (t/send transport (response-for msg :status :namespace-not-found))) |
| 292 | + (throw e))))))) |
| 293 | + (fn [] |
| 294 | + (t/send transport (response-for msg {:status :done})))))) |
307 | 295 |
|
308 | 296 | (defn handle-test-op
|
309 | 297 | [{:keys [ns tests include exclude] :as msg}]
|
|
322 | 310 | :exclude-meta-key exclude}})))
|
323 | 311 |
|
324 | 312 | (defn handle-retest-op
|
325 |
| - [{:keys [session transport] :as msg}] |
326 |
| - (with-interruptible-eval msg |
327 |
| - (let [nss (reduce (fn [ret [ns tests]] |
328 |
| - (let [problems (filter (comp #{:fail :error} :type) |
329 |
| - (mapcat val tests)) |
330 |
| - vars (distinct (map :var problems))] |
331 |
| - (if (seq vars) (assoc ret ns vars) ret))) |
332 |
| - {} @results) |
333 |
| - report (test-nss nss)] |
334 |
| - (reset! results (:results report)) |
335 |
| - (t/send transport (response-for msg (u/transform-value report)))) |
336 |
| - (t/send transport (response-for msg :status :done)))) |
| 313 | + [{:keys [transport session id] :as msg}] |
| 314 | + (let [{:keys [exec]} (meta session)] |
| 315 | + (exec id |
| 316 | + (fn [] |
| 317 | + (with-bindings (assoc @session #'ie/*msg* msg) |
| 318 | + (let [nss (reduce (fn [ret [ns tests]] |
| 319 | + (let [problems (filter (comp #{:fail :error} :type) |
| 320 | + (mapcat val tests)) |
| 321 | + vars (distinct (map :var problems))] |
| 322 | + (if (seq vars) (assoc ret ns vars) ret))) |
| 323 | + {} @results) |
| 324 | + report (test-nss nss)] |
| 325 | + (reset! results (:results report)) |
| 326 | + (t/send transport (response-for msg (u/transform-value report)))))) |
| 327 | + (fn [] |
| 328 | + (t/send transport (response-for msg :status :done)))))) |
337 | 329 |
|
338 | 330 | (defn handle-stacktrace-op
|
339 |
| - [{:keys [ns var index session transport pprint-fn print-options] :as msg}] |
340 |
| - (with-interruptible-eval msg |
341 |
| - (let [[ns var] (map u/as-sym [ns var])] |
342 |
| - (if-let [e (get-in @results [ns var index :error])] |
343 |
| - (doseq [cause (st/analyze-causes e pprint-fn print-options)] |
344 |
| - (t/send transport (response-for msg cause))) |
345 |
| - (t/send transport (response-for msg :status :no-error))) |
346 |
| - (t/send transport (response-for msg :status :done))))) |
347 |
| - |
348 |
| -;; Before tools.nrepl-0.2.10, `default-executor` was private and |
349 |
| -;; before 0.2.9 it didn't even exist. |
350 |
| -(def default-executor (delay (if-let [def (resolve 'ie/default-executor)] |
351 |
| - @@def |
352 |
| - (@#'ie/configure-executor)))) |
| 331 | + [{:keys [ns var index transport session id pprint-fn print-options] :as msg}] |
| 332 | + (let [{:keys [exec]} (meta session)] |
| 333 | + (exec id |
| 334 | + (fn [] |
| 335 | + (with-bindings (assoc @session #'ie/*msg* msg) |
| 336 | + (let [[ns var] (map u/as-sym [ns var])] |
| 337 | + (if-let [e (get-in @results [ns var index :error])] |
| 338 | + (doseq [cause (st/analyze-causes e pprint-fn print-options)] |
| 339 | + (t/send transport (response-for msg cause))) |
| 340 | + (t/send transport (response-for msg :status :no-error)))))) |
| 341 | + (fn [] |
| 342 | + (t/send transport (response-for msg :status :done)))))) |
353 | 343 |
|
354 | 344 | (defn handle-test [handler msg & configuration]
|
355 |
| - (let [executor (:executor configuration @default-executor)] |
356 |
| - (case (:op msg) |
357 |
| - "test-var-query" (handle-test-var-query-op (assoc msg :executor executor)) |
358 |
| - "test" (handle-test-op (assoc msg :executor executor)) |
359 |
| - "test-all" (handle-test-all-op (assoc msg :executor executor)) |
360 |
| - "test-stacktrace" (handle-stacktrace-op (assoc msg :executor executor)) |
361 |
| - "retest" (handle-retest-op (assoc msg :executor executor)) |
362 |
| - (handler msg)))) |
| 345 | + (case (:op msg) |
| 346 | + "test-var-query" (handle-test-var-query-op msg) |
| 347 | + "test" (handle-test-op msg) |
| 348 | + "test-all" (handle-test-all-op msg) |
| 349 | + "test-stacktrace" (handle-stacktrace-op msg) |
| 350 | + "retest" (handle-retest-op msg) |
| 351 | + (handler msg))) |
0 commit comments