Skip to content

Commit 7ace669

Browse files
committed
nrepl: retarget :switch, :spawn and :kill if in joined session
1 parent 573b996 commit 7ace669

File tree

2 files changed

+38
-26
lines changed

2 files changed

+38
-26
lines changed

src/nrepl/dirac/nrepl/controls.clj

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,13 @@
217217
"For example if you wanted to manipulate Figwheel compilers you have to use Figwheel's own interface for that:\n"
218218
"=> https://github.com/bhauman/lein-figwheel#repl-figwheel-control-functions."))
219219

220+
(defn ^:dynamic make-retargeting-warning-msg []
221+
(str "You are in a joined Dirac session. This command is being executed as if it was entered in the target session."))
222+
223+
(defn ^:dynamic warn-about-retargeting-if-needed [session]
224+
(if (not= session (state/get-current-session))
225+
(println (make-retargeting-warning-msg))))
226+
220227
; == special REPL commands ==================================================================================================
221228

222229
; we are forgiving when reading the sub-command argument,
@@ -250,10 +257,6 @@
250257

251258
; -- (dirac! :status) -------------------------------------------------------------------------------------------------------
252259

253-
(defn get-target-session [session]
254-
(if-let [target-session-descriptor (sessions/find-target-dirac-session-descriptor session)]
255-
(sessions/get-dirac-session-descriptor-session target-session-descriptor)))
256-
257260
(defn prepare-session-description [session]
258261
(cond
259262
(sessions/dirac-session? session)
@@ -270,7 +273,7 @@
270273

271274
(sessions/joined-session? session)
272275
(let [target-info (sessions/get-target-session-info session)
273-
target-session (get-target-session session)]
276+
target-session (sessions/get-target-session session)]
274277
(str "joined Dirac session (ClojureScript) which targets '" target-info "'\n"
275278
(if (some? target-session)
276279
(str "which is currently forwarding commands to the " (prepare-session-description target-session))
@@ -287,15 +290,12 @@
287290
; -- (dirac! :ls) -----------------------------------------------------------------------------------------------------------
288291

289292
(defmethod dirac! :ls [_ & _]
290-
(let [session (state/get-current-session)
291-
target-session (if (sessions/joined-session? session)
292-
(get-target-session session)
293-
session)
293+
(let [target-session (sessions/get-current-retargeted-session)
294294
tags (sessions/get-dirac-session-tags target-session)
295295
current-tag (sessions/get-current-session-tag target-session)
296296
avail-compilers (compilers/collect-all-available-compiler-descriptors target-session)
297297
selected-compiler-id (compilers/get-selected-compiler-id target-session)
298-
marker (if (= session target-session) "->" "~>")]
298+
marker (if (= target-session (state/get-current-session)) "->" "~>")]
299299
(println (make-list-dirac-sessions-msg tags current-tag marker))
300300
(println)
301301
(println (make-list-compilers-msg avail-compilers selected-compiler-id marker)))
@@ -354,11 +354,11 @@
354354
:else ::invalid-input))
355355

356356
(defmethod dirac! :switch [_ & [user-input]]
357-
(let [selected-compiler (validate-selected-compiler user-input)
358-
session (state/get-current-session)]
357+
(let [selected-compiler (validate-selected-compiler user-input)]
359358
(if (= ::invalid-input selected-compiler)
360359
(error-println (make-invalid-compiler-error-msg user-input))
361-
(do
360+
(let [session (sessions/get-current-retargeted-session)]
361+
(warn-about-retargeting-if-needed session)
362362
(compilers/select-compiler! session selected-compiler)
363363
(let [matched-compiler-descriptor (compilers/find-available-matching-compiler-descriptor session selected-compiler)]
364364
(if (nil? matched-compiler-descriptor)
@@ -369,7 +369,8 @@
369369
; -- (dirac! :spawn) --------------------------------------------------------------------------------------------------------
370370

371371
(defmethod dirac! :spawn [_ & [options]]
372-
(let [session (sessions/get-current-session)]
372+
(let [session (sessions/get-current-retargeted-session)]
373+
(warn-about-retargeting-if-needed session)
373374
(cond
374375
(not (sessions/dirac-session? session)) (error-println (make-cannot-spawn-outside-dirac-session-msg))
375376
:else (utils/spawn-compiler! state/*nrepl-message* options)))
@@ -378,20 +379,21 @@
378379
; -- (dirac! ::kill) --------------------------------------------------------------------------------------------------------
379380

380381
(defmethod dirac! :kill [_ & [user-input]]
381-
(let [selected-compiler (validate-selected-compiler user-input)
382-
session (state/get-current-session)]
382+
(let [selected-compiler (validate-selected-compiler user-input)]
383383
(if (= ::invalid-input selected-compiler)
384384
(error-println (make-invalid-compiler-error-msg user-input))
385-
(let [[killed-compiler-ids invalid-compiler-ids] (utils/kill-matching-compilers! selected-compiler)]
386-
(if (empty? killed-compiler-ids)
387-
(error-println (make-no-killed-compilers-msg user-input))
388-
(do
389-
(println (make-report-killed-compilers-msg user-input killed-compiler-ids))
390-
(if-not (compilers/get-selected-compiler-id session) ; switch to first available compiler the current one got killed
391-
(compilers/select-compiler! session nil)) ; note that this still might not guarantee valid compiler selection, the compiler list might be empty
392-
(state/send-response! (utils/prepare-current-env-info-response))))
393-
(if-not (empty? invalid-compiler-ids)
394-
(error-println (make-report-invalid-compilers-not-killed-msg user-input invalid-compiler-ids))))))
385+
(let [session (sessions/get-current-retargeted-session)]
386+
(warn-about-retargeting-if-needed session)
387+
(let [[killed-compiler-ids invalid-compiler-ids] (utils/kill-matching-compilers! selected-compiler)]
388+
(if (empty? killed-compiler-ids)
389+
(error-println (make-no-killed-compilers-msg user-input))
390+
(do
391+
(println (make-report-killed-compilers-msg user-input killed-compiler-ids))
392+
(if-not (compilers/get-selected-compiler-id session) ; switch to first available compiler the current one got killed
393+
(compilers/select-compiler! session nil)) ; note that this still might not guarantee valid compiler selection, the compiler list might be empty
394+
(state/send-response! (utils/prepare-current-env-info-response))))
395+
(if-not (empty? invalid-compiler-ids)
396+
(error-println (make-report-invalid-compilers-not-killed-msg user-input invalid-compiler-ids)))))))
395397
::no-result)
396398

397399
; -- default handler --------------------------------------------------------------------------------------------------------

src/nrepl/dirac/nrepl/sessions.clj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,13 @@
184184
(join-session! session
185185
(make-number-matcher number)
186186
(make-number-matcher-description number)))
187+
188+
(defn get-target-session [session]
189+
(if-let [target-session-descriptor (find-target-dirac-session-descriptor session)]
190+
(get-dirac-session-descriptor-session target-session-descriptor)))
191+
192+
(defn get-current-retargeted-session []
193+
(let [session (state/get-current-session)
194+
target-session (if (joined-session? session)
195+
(get-target-session session))]
196+
(or target-session session)))

0 commit comments

Comments
 (0)