Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[util] Add util/respond-to #920

Merged
merged 1 commit into from
Mar 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 9 additions & 14 deletions src/cider/nrepl/middleware/debug.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,20 @@
{:author "Artur Malabarba"}
(:require
[cider.nrepl.middleware.inspect :refer [swap-inspector!]]
[cider.nrepl.middleware.util :as util]
[cider.nrepl.middleware.util :as util :refer [respond-to]]
[cider.nrepl.middleware.util.cljs :as cljs]
[cider.nrepl.middleware.util.instrument :as ins]
[cider.nrepl.middleware.util.nrepl :refer [notify-client]]
[nrepl.middleware.interruptible-eval :refer [*msg*]]
[nrepl.middleware.print :as print]
[nrepl.misc :refer [response-for]]
[nrepl.transport :as transport]
[orchard.info :as info]
[orchard.inspect :as inspect]
[orchard.meta :as m]
[orchard.print]
[orchard.stacktrace :as stacktrace])
(:import
[clojure.lang Compiler$LocalBinding]
[java.util UUID]))
(clojure.lang Compiler$LocalBinding)
(java.util UUID)))

;;;; # The Debugger
;;;
Expand Down Expand Up @@ -135,7 +133,7 @@
[]
(if (map? *msg*)
(do
(transport/send (:transport *msg*) (response-for *msg* :value 'QUIT))
(respond-to *msg* :value 'QUIT)
(.stop ^Thread (:thread (meta (:session *msg*)))))
;; We can't really abort if there's no *msg*, so we do our best
;; impression of that. This is only used in some panic situations,
Expand Down Expand Up @@ -200,8 +198,7 @@ this map (identified by a key), and will `dissoc` it afterwards."}
(when (not @debugger-message)
(throw (Exception. "Debugger not initialized!")))
(try
(transport/send (:transport @debugger-message)
(apply response-for @debugger-message r))
(apply respond-to @debugger-message r)
(catch java.net.SocketException _
(reset! debugger-message nil))))

Expand Down Expand Up @@ -710,12 +707,10 @@ this map (identified by a key), and will `dissoc` it afterwards."}
(defn- instrumented-defs-reply
"Reply to `msg` with an alist of instrumented defs on the \"list\" entry."
[msg]
(->> (all-ns)
(map #(cons (ns-name %) (ins/list-instrumented-defs %)))
(filter second)
(util/transform-value)
(response-for msg :status :done :list)
(transport/send (:transport msg))))
(let [defs (->> (all-ns)
(map #(cons (ns-name %) (ins/list-instrumented-defs %)))
(filter second))]
(respond-to msg :status :done, :list (util/transform-value defs))))

(defn handle-debug
[handler {:keys [op input session] :as msg}]
Expand Down
11 changes: 4 additions & 7 deletions src/cider/nrepl/middleware/info.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@
(:require
[compliment.context]
[compliment.sources.class-members]
[cider.nrepl.middleware.util :as util]
[cider.nrepl.middleware.util :as util :refer [respond-to]]
[cider.nrepl.middleware.util.cljs :as cljs]
[cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
[clojure.string :as str]
[nrepl.transport :as transport]
[nrepl.misc :refer [response-for]]
[orchard.eldoc :as eldoc]
[orchard.info :as info]
[orchard.java.source-files :as src-files]
Expand Down Expand Up @@ -89,14 +87,13 @@
download an artifact that doesn't exist or can't be found."
(ConcurrentHashMap.))

(defn- download-sources-jar-for-class
[klass {:keys [transport] :as msg}]
(defn- download-sources-jar-for-class [klass msg]
(when-let [coords (src-files/infer-maven-coordinates-for-class klass)]
(when (nil? (.putIfAbsent attempted-to-download-coords coords true))
;; Tell the client we are going to download an artifict so it can notify
;; the user. It may take a few seconds.
(transport/send transport (response-for msg {:status :download-sources-jar
:coords coords}))
(respond-to msg {:status :download-sources-jar
:coords coords})
(src-files/download-sources-jar-for-coordinates coords))))

(defn info
Expand Down
16 changes: 7 additions & 9 deletions src/cider/nrepl/middleware/log.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@
{:author "r0man"
:added "0.32.0"}
(:require [cider.nrepl.middleware.inspect :as middleware.inspect]
[cider.nrepl.middleware.util :refer [respond-to]]
[cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
[logjam.event :as event]
[logjam.framework :as framework]
[nrepl.middleware.print :as print]
[nrepl.misc :refer [response-for]]
[nrepl.transport :as transport])
[nrepl.middleware.print :as print])
(:import (java.io StringWriter)
(java.util UUID)))

Expand Down Expand Up @@ -139,16 +138,15 @@

(defn add-consumer-reply
"Add a consumer to an appender of a log framework."
[{:keys [consumer filters transport] :as msg}]
[{:keys [consumer filters] :as msg}]
(let [appender (appender msg)
consumer {:id (or consumer (str (UUID/randomUUID)))
:filters (or filters {})
:callback (fn [consumer event]
(->> (response-for msg
:cider/log-consumer (str (:id consumer))
:cider/log-event (select-event event)
:status :cider/log-event)
(transport/send transport)))}]
(respond-to msg
:cider/log-consumer (str (:id consumer))
:cider/log-event (select-event event)
:status :cider/log-event))}]
{:cider/log-add-consumer
(-> (swap-framework! msg framework/add-consumer appender consumer)
(framework/consumer appender consumer)
Expand Down
7 changes: 3 additions & 4 deletions src/cider/nrepl/middleware/macroexpand.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
"Macroexpansion middleware."
{:author "Bozhidar Batsov"}
(:require
[cider.nrepl.middleware.util :refer [respond-to]]
[cider.nrepl.middleware.util.cljs :as cljs]
[cider.nrepl.middleware.util.error-handling
:refer [base-error-response eval-interceptor-transport with-safe-transport]]
[orchard.cljs.analysis :as cljs-ana]
[nrepl.misc :refer [response-for]]
[nrepl.transport :as transport]
[clojure.pprint :as pp]
[clojure.tools.reader :as reader]
Expand Down Expand Up @@ -124,12 +124,11 @@
(transport/send (:transport msg)
(base-error-response msg ex :done :macroexpand-error)))

(defn macroexpansion-reply-clj [{:keys [transport] :as msg}
{:keys [value] :as resp}]
(defn macroexpansion-reply-clj [msg {:keys [value] :as resp}]
(try (let [msg (update msg :ns #(or (misc/as-sym %) 'user))
expansion (walk/prewalk (post-expansion-walker-clj msg) value)
response-map (macroexpansion-response-map msg expansion)]
(transport/send transport (response-for msg response-map)))
(respond-to msg response-map))
(catch Exception ex
(send-middleware-error msg ex))))

Expand Down
110 changes: 46 additions & 64 deletions src/cider/nrepl/middleware/profile.clj
Original file line number Diff line number Diff line change
Expand Up @@ -15,100 +15,84 @@
maintained anymore."
{:author "Edwin Watkeys"}
(:require
[nrepl.misc :refer [response-for]]
[nrepl.transport :as t]
[cider.nrepl.middleware.util :refer [respond-to]]
[profile.core :as p]))

(defn send-exception
[_e msg transport]
(t/send transport (response-for msg :status :done :value "exception")))
(defn- send-exception
[_e msg]
(respond-to msg :status :done :value "exception"))

(defn toggle-profile
[{:keys [ns sym transport] :as msg}]
(try
(if-let [v (ns-resolve (symbol ns) (symbol sym))]
(let [profiled? (p/toggle-profile-var* v)]
(t/send transport
(response-for
msg
:status :done
:value (if profiled? "profiled" "unprofiled"))))
(t/send transport
(response-for
msg
:status #{:toggle-profile-not-such-var :done}
:value "unbound")))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:value (if profiled? "profiled" "unprofiled")))
(respond-to msg
:status #{:toggle-profile-not-such-var :done}
:value "unbound"))
(catch Exception e (send-exception e msg))))

(defn profile-var-summary
[{:keys [ns sym transport] :as msg}]
(try
(if-let [v (ns-resolve (symbol ns) (symbol sym))]
(if-let [table (with-out-str (binding [*err* *out*]
(p/print-entry-summary v)))]
(t/send transport
(response-for msg
:status :done
:err table))
(t/send transport
(response-for msg
:status :done
:err (format "No profile data for %s." v))))
(t/send transport
(response-for msg
:status :done
:value (format "Var %s/%s is not bound." ns sym))))
(catch Exception e (prn :e e) (send-exception e msg transport))))
(respond-to msg
:status :done
:err table)
(respond-to msg
:status :done
:err (format "No profile data for %s." v)))
(respond-to msg
:status :done
:value (format "Var %s/%s is not bound." ns sym)))
(catch Exception e (prn :e e) (send-exception e msg))))

(defn profile-summary
[{:keys [transport] :as msg}]
(try
(t/send transport
(response-for msg
:status :done
:err (with-out-str
(binding [*err* *out*] (p/print-summary)))))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:err (with-out-str
(binding [*err* *out*] (p/print-summary))))
(catch Exception e (send-exception e msg))))

(defn clear-profile
[{:keys [transport] :as msg}]
(try
(p/clear-profile-data)
(t/send transport
(response-for msg
:status :done
:value "cleared"))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:value "cleared")
(catch Exception e (send-exception e msg))))

(defn toggle-profile-ns
[{:keys [ns transport] :as msg}]
(try (let [profiled? (p/toggle-profile-ns (symbol ns))]
(t/send transport
(response-for
msg
:status :done
:value (if profiled? "profiled" "unprofiled"))))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:value (if profiled? "profiled" "unprofiled")))
(catch Exception e (send-exception e msg))))

(defn is-var-profiled
[{:keys [ns sym transport] :as msg}]
(try (let [var (ns-resolve (symbol ns) (symbol sym))
profiled? (p/profiled? @var)]
(t/send transport
(response-for
msg
:status :done
:value (if profiled? "profiled" "unprofiled"))))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:value (if profiled? "profiled" "unprofiled")))
(catch Exception e (send-exception e msg))))

(defn get-max-samples
[{:keys [transport] :as msg}]
(try (t/send transport
(response-for
msg
:status :done
:value (str (p/max-sample-count))))
(catch Exception e (send-exception e msg transport))))
(try (respond-to msg
:status :done
:value (str (p/max-sample-count)))
(catch Exception e (send-exception e msg))))

(defn normalize-max-samples [n]
(cond (and (sequential? n) (empty? n)) nil
Expand All @@ -119,12 +103,10 @@
[{:keys [max-samples transport] :as msg}]
(try (let [max-samples (normalize-max-samples max-samples)]
(p/set-max-sample-count max-samples)
(t/send transport
(response-for
msg
:status :done
:value (str (p/max-sample-count)))))
(catch Exception e (send-exception e msg transport))))
(respond-to msg
:status :done
:value (str (p/max-sample-count))))
(catch Exception e (send-exception e msg))))

(defn handle-profile
[handler msg]
Expand Down
25 changes: 10 additions & 15 deletions src/cider/nrepl/middleware/refresh.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@
;; when developing cider-nrepl itself, or when cider-nrepl is used as a
;; checkout dependency - tools.namespace doesn't reload source in JARs.
(:require
[cider.nrepl.middleware.util :refer [respond-to]]
[cider.nrepl.middleware.util.reload :as reload-utils]
[clojure.main :refer [repl-caught]]
[clojure.tools.namespace.dir :as dir]
[clojure.tools.namespace.find :as find]
[clojure.tools.namespace.reload :as reload]
[clojure.tools.namespace.track :as track]
[nrepl.misc :refer [response-for]]
[nrepl.transport :as transport]))
[clojure.tools.namespace.track :as track]))

(defonce ^:private refresh-tracker (volatile! (track/tracker)))

Expand Down Expand Up @@ -55,21 +54,17 @@

(defn- reloading-reply
[{reloading ::track/load}
{:keys [transport] :as msg}]
(transport/send
transport
(response-for msg {:reloading reloading})))
msg]
(respond-to msg :reloading reloading))

(defn- result-reply
[{error ::reload/error
error-ns ::reload/error-ns}
{:keys [transport] :as msg}]
msg]

(if error
(reload-utils/error-reply {:error error :error-ns error-ns} msg)
(transport/send
transport
(response-for msg {:status :ok}))))
(respond-to msg :status :ok)))

(defn after-reply
[{error ::reload/error}
Expand All @@ -81,7 +76,7 @@
(atom false))

(defn- refresh-reply
[{:keys [dirs transport session id] :as msg}]
[{:keys [dirs session id] :as msg}]
(let [{:keys [exec]} (meta session)]
(exec id
(fn []
Expand Down Expand Up @@ -109,10 +104,10 @@
(finally
(reset! client-requested-clear? false)))))))
(fn []
(transport/send transport (response-for msg {:status :done}))))))
(respond-to msg :status :done)))))

(defn- clear-reply
[{:keys [transport session id] :as msg}]
[{:keys [session id] :as msg}]
(let [{:keys [exec]} (meta session)]
(exec id
(fn []
Expand All @@ -121,7 +116,7 @@
;; because that `locking` could cause unnecessary nREPL timeouts (https://github.com/clojure-emacs/cider/issues/3652 ).
(reset! client-requested-clear? true))
(fn []
(transport/send transport (response-for msg {:status :done}))))))
(respond-to msg :status :done)))))

(defn handle-refresh [handler msg]
(case (:op msg)
Expand Down
Loading