From c65157b6a6bf4191e02f8eff83205fabfe7ecd33 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Sun, 5 Apr 2015 16:28:28 +0100 Subject: [PATCH] Don't send debugger message if the break won't prompt --- src/cider/nrepl/middleware/debug.clj | 34 ++++++++++++++-------- test/cider/nrepl/middleware/debug_test.clj | 9 ++++++ 2 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 test/cider/nrepl/middleware/debug_test.clj diff --git a/src/cider/nrepl/middleware/debug.clj b/src/cider/nrepl/middleware/debug.clj index 3ec6bc05c..57b332774 100644 --- a/src/cider/nrepl/middleware/debug.clj +++ b/src/cider/nrepl/middleware/debug.clj @@ -3,6 +3,8 @@ [clojure.tools.nrepl.middleware :refer [set-descriptor!]] [clojure.tools.nrepl.misc :refer [response-for]] [cider.nrepl.middleware.util.instrument :refer [instrument]] + [debugger.time :as t] + [debugger.config :as c] [debugger.core :refer [break]])) ;;;; ## Interaction with the client @@ -28,18 +30,26 @@ "Send value and coordinates to the client through the debug channel. Sends a response to the message stored in debugger-message." [value extras] - ;; Notify cider that a (break) is incoming, along with the value of - ;; the instrumented sexp and instructions on how to find it in the - ;; code. - (transport/send - (:transport @debugger-message) - (response-for @debugger-message - (assoc extras - :debug-value (pr-str value) - :breakfunction nil))) - ;; Send the actual break. - (binding [*out* (new java.io.StringWriter)] - (break value))) + ;; If the user has recently replied (quit) to a `break` statement, + ;; then debugger will not ask for input. Therefore, have to avoid + ;; sending the following message in these cases. + (if (->> (t/now) (t/interval @c/*last-quit-at*) t/in-seconds (< c/*skip-repl-if-last-quit-ago*)) + ;; TODO: If clj-debugger makes the `read` call in `read-fn` + ;; configurable (perhaps with a dynamic variable) we would have to + ;; divide our breakpoint into two messages. + (do (transport/send + (:transport @debugger-message) + (response-for @debugger-message + (assoc extras + :debug-value (pr-str value) + :breakfunction nil))) + ;; Send the actual break. + (binding [*out* (new java.io.StringWriter)] + (break value))) + ;; Notify cider that a (break) is incoming, along with the value + ;; of the instrumented sexp and instructions on how to find it in + ;; the code. + value)) (defn instrument-and-eval "Instrument form and evaluate the result. diff --git a/test/cider/nrepl/middleware/debug_test.clj b/test/cider/nrepl/middleware/debug_test.clj new file mode 100644 index 000000000..365981b60 --- /dev/null +++ b/test/cider/nrepl/middleware/debug_test.clj @@ -0,0 +1,9 @@ +(ns cider.nrepl.middleware.debug-test + (:require [clojure.test :refer :all] + [cider.nrepl.middleware.debug :as d])) + +(deftest breakpoint + (binding [clojure.tools.nrepl.middleware.interruptible-eval/*msg* + {:sync true}] + (is (= (d/breakpoint 10 {}) 10)))) +