Skip to content

Commit fe512b9

Browse files
alexander-yakushevbbatsov
authored andcommitted
Fix inspector silently doing nothing if eval errored
1 parent 69f1dd5 commit fe512b9

File tree

3 files changed

+42
-41
lines changed

3 files changed

+42
-41
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
* [#550](https://github.com/clojure-emacs/cider-nrepl/pull/550): Always return test documentation messages as strings.
1414
* [#563](https://github.com/clojure-emacs/cider-nrepl/pull/563): Add :root-ex key to error summary that contains the classname of the root cause.
1515

16+
### Bugs fixed
17+
18+
* [#573](https://github.com/clojure-emacs/cider-nrepl/pull/573): Fix inspector silently doing nothing if eval errored
19+
1620
## 0.18.0 (2018-08-06)
1721

1822
### New features

src/cider/nrepl/middleware/inspect.clj

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
(ns cider.nrepl.middleware.inspect
22
(:require
33
[cider.nrepl.middleware.util.cljs :as cljs]
4-
[cider.nrepl.middleware.util.error-handling :refer [base-error-response]]
4+
[cider.nrepl.middleware.util.error-handling :refer [base-error-response
5+
with-safe-transport]]
56
[orchard.inspect :as inspect]))
67

78
;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x.
@@ -41,14 +42,24 @@
4142
(response-for msg :value (:rendered inspector))))))
4243

4344
(defn inspector-transport
44-
[{:keys [^Transport transport] :as msg}]
45+
[{:keys [^Transport transport, session] :as msg}]
4546
(reify Transport
4647
(recv [this] (.recv transport))
4748
(recv [this timeout] (.recv transport timeout))
4849
(send [this response]
49-
(if (contains? response :value)
50-
(inspect-reply msg response)
51-
(.send transport response))
50+
(cond (contains? response :value)
51+
(inspect-reply msg response)
52+
53+
;; If the eval errored, propagate the exception as error in the
54+
;; inspector middleware, so that the client CIDER code properly
55+
;; renders it instead of silently ignoring it.
56+
(contains? (:status response) :eval-error)
57+
(let [e (or (@session #'*e)
58+
(Exception. (or (:ex response) "")))
59+
resp (base-error-response msg e :inspect-eval-error :done)]
60+
(.send transport resp))
61+
62+
:else (.send transport response))
5263
this)))
5364

5465
(defn eval-msg
@@ -61,48 +72,39 @@
6172
[handler msg]
6273
(handler (eval-msg msg)))
6374

64-
(defn- success [{:keys [transport] :as msg} inspector]
65-
(transport/send transport (response-for msg :value (:rendered inspector) :status :done)))
66-
67-
(defn- failure [{:keys [transport] :as msg} err err-kw]
68-
(transport/send transport (base-error-response msg err err-kw :done)))
75+
(defn- inspector-response [msg inspector]
76+
(response-for msg :value (:rendered inspector) :status :done))
6977

7078
(defn pop-reply [msg]
71-
(try (success msg (swap-inspector! msg inspect/up))
72-
(catch Exception e (failure msg e :inspect-pop-error))))
79+
(inspector-response msg (swap-inspector! msg inspect/up)))
7380

7481
(defn push-reply [msg]
75-
(try (success msg (swap-inspector! msg inspect/down (:idx msg)))
76-
(catch Exception e (failure msg e :inspect-push-error))))
82+
(inspector-response msg (swap-inspector! msg inspect/down (:idx msg))))
7783

7884
(defn refresh-reply [msg]
79-
(try (success msg (swap-inspector! msg #(or % (inspect/fresh))))
80-
(catch Exception e (failure msg e :inspect-refresh-error))))
85+
(inspector-response msg (swap-inspector! msg #(or % (inspect/fresh)))))
8186

8287
(defn get-path-reply [{:keys [session] :as msg}]
83-
(try (success msg (:path (get session #'*inspector*)))
84-
(catch Exception e (failure msg e :inspect-get-path-error))))
88+
(:path (get session #'*inspector*)))
8589

8690
(defn next-page-reply [msg]
87-
(try (success msg (swap-inspector! msg inspect/next-page))
88-
(catch Exception e (failure msg e :inspect-next-page-error))))
91+
(inspector-response msg (swap-inspector! msg inspect/next-page)))
8992

9093
(defn prev-page-reply [msg]
91-
(try (success msg (swap-inspector! msg inspect/prev-page))
92-
(catch Exception e (failure msg e :inspect-prev-page-error))))
94+
(inspector-response msg (swap-inspector! msg inspect/prev-page)))
9395

9496
(defn set-page-size-reply [msg]
95-
(try (success msg (swap-inspector! msg inspect/set-page-size (:page-size msg)))
96-
(catch Exception e (failure msg e :inspect-set-page-size-error))))
97+
(inspector-response msg (swap-inspector! msg inspect/set-page-size (:page-size msg))))
9798

9899
(defn handle-inspect [handler msg]
99-
(case (:op msg)
100-
"eval" (eval-reply handler msg)
101-
"inspect-pop" (pop-reply msg)
102-
"inspect-push" (push-reply msg)
103-
"inspect-refresh" (refresh-reply msg)
104-
"inspect-get-path" (get-path-reply msg)
105-
"inspect-next-page" (next-page-reply msg)
106-
"inspect-prev-page" (prev-page-reply msg)
107-
"inspect-set-page-size" (set-page-size-reply msg)
108-
(handler msg)))
100+
(if (= (:op msg) "eval")
101+
(eval-reply handler msg)
102+
103+
(with-safe-transport handler msg
104+
"inspect-pop" pop-reply
105+
"inspect-push" push-reply
106+
"inspect-refresh" refresh-reply
107+
"inspect-get-path" get-path-reply
108+
"inspect-next-page" next-page-reply
109+
"inspect-prev-page" prev-page-reply
110+
"inspect-set-page-size" set-page-size-reply)))

test/clj/cider/nrepl/middleware/inspect_test.clj

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,8 @@
7676
:code "(first 1)"})]
7777

7878
(testing "exprs that throw exceptions return an `ex` slot"
79-
(is (= "class java.lang.IllegalArgumentException"
80-
(:ex exception-response))))
81-
82-
;;TODO: The :err slot is missing when running this through the Cider test-runner
83-
(testing "exprs that throw exceptions return an `err` slot"
84-
(is (.startsWith (:err exception-response)
85-
"IllegalArgumentException")))))
79+
(is (= "class java.lang.Exception"
80+
(:ex exception-response))))))
8681

8782
(testing "inspect-pop error handling"
8883
(with-redefs [i/swap-inspector! (fn [& _] (throw (Exception. "pop exception")))]

0 commit comments

Comments
 (0)