Skip to content

Commit 7db186f

Browse files
[info] Add support for sources JAR downloading on `info' events
1 parent 356c2bd commit 7db186f

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

cider-client.el

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,16 +189,20 @@ the current connection. Return the id of the sent message.
189189
If TOOLING is truthy then the tooling session is used."
190190
(nrepl-send-request request callback (or connection (cider-current-repl 'any 'ensure)) tooling))
191191

192-
(defun cider-nrepl-send-sync-request (request &optional connection abort-on-input)
192+
(defun cider-nrepl-send-sync-request (request &optional connection
193+
abort-on-input callback)
193194
"Send REQUEST to the nREPL server synchronously using CONNECTION.
194195
Hold till final \"done\" message has arrived and join all response messages
195196
of the same \"op\" that came along and return the accumulated response.
196197
If ABORT-ON-INPUT is non-nil, the function will return nil
197198
at the first sign of user input, so as not to hang the
198-
interface."
199+
interface.
200+
if CALLBACK is non-nil, it will additionally be called on all received messages."
199201
(nrepl-send-sync-request request
200202
(or connection (cider-current-repl 'any 'ensure))
201-
abort-on-input))
203+
abort-on-input
204+
nil
205+
callback))
202206

203207
(defun cider-nrepl-send-unhandled-request (request &optional connection)
204208
"Send REQUEST to the nREPL CONNECTION and ignore any responses.
@@ -342,6 +346,17 @@ The default value in nREPL is 1024."
342346
:group 'cider
343347
:package-version '(cider . "0.25.0"))
344348

349+
(defcustom cider-download-sources-jars nil
350+
"Whether to automatically download source artifacts for 3rd-party Java classes.
351+
352+
When enabled, CIDER will attempt to download source JARs from Maven for
353+
Java classes if the source file is not found locally. This downloading only
354+
happens once per artifact, and only when the user jumps to the definition
355+
or requests `cider-doc' on a Java class or a member of the class."
356+
:type 'boolean
357+
:group 'cider
358+
:package-version '(cider . "1.17.0"))
359+
345360
(defun cider--print-fn ()
346361
"Return the value to send in the nrepl.middleware.print/print slot."
347362
(pcase cider-print-fn
@@ -681,13 +696,25 @@ CONTEXT represents a completion context for compliment."
681696

682697
(defun cider-sync-request:info (symbol &optional class member context)
683698
"Send \"info\" op with parameters SYMBOL or CLASS and MEMBER, honor CONTEXT."
684-
(let ((var-info (thread-first `("op" "info"
685-
"ns" ,(cider-current-ns)
686-
,@(when symbol `("sym" ,symbol))
687-
,@(when class `("class" ,class))
688-
,@(when member `("member" ,member))
689-
,@(when context `("context" ,context)))
690-
(cider-nrepl-send-sync-request (cider-current-repl)))))
699+
(let* ((req
700+
`("op" "info"
701+
"ns" ,(cider-current-ns)
702+
,@(when symbol `("sym" ,symbol))
703+
,@(when class `("class" ,class))
704+
,@(when member `("member" ,member))
705+
,@(when context `("context" ,context))
706+
,@(when cider-download-sources-jars `("download-sources-jar" "1"))))
707+
(callback
708+
(lambda (resp)
709+
(let ((status (nrepl-dict-get resp "status"))
710+
(coords (nrepl-dict-get resp "coords")))
711+
(when (member "download-sources-jar" status)
712+
(message "Local source not found, downloading Java sources for artifact %s/%s %s..."
713+
(nrepl-dict-get coords "group")
714+
(nrepl-dict-get coords "artifact")
715+
(nrepl-dict-get coords "version"))))))
716+
(var-info
717+
(cider-nrepl-send-sync-request req (cider-current-repl) nil callback)))
691718
(if (member "no-info" (nrepl-dict-get var-info "status"))
692719
nil
693720
var-info)))

nrepl-client.el

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -939,21 +939,25 @@ the standard session."
939939
(declare-function cider-repl-emit-interactive-stderr "cider-repl")
940940
(declare-function cider--render-stacktrace-causes "cider-eval")
941941

942-
(defun nrepl-send-sync-request (request connection &optional abort-on-input tooling)
942+
(defun nrepl-send-sync-request (request connection &optional abort-on-input
943+
tooling callback)
943944
"Send REQUEST to the nREPL server synchronously using CONNECTION.
944945
Hold till final \"done\" message has arrived and join all response messages
945946
of the same \"op\" that came along.
946947
If ABORT-ON-INPUT is non-nil, the function will return nil at the first
947948
sign of user input, so as not to hang the interface.
948-
If TOOLING, use the tooling session rather than the standard session."
949+
If TOOLING, use the tooling session rather than the standard session.
950+
If CALLBACK is non-nil, it will additionally be called on all received messages."
949951
(let* ((time0 (current-time))
950952
(response (cons 'dict nil))
951953
(nrepl-ongoing-sync-request t)
954+
(cb (lambda (resp)
955+
;; If caller has provided `callback', call it on the response.
956+
(when callback
957+
(funcall callback resp))
958+
(nrepl--merge response resp)))
952959
status)
953-
(nrepl-send-request request
954-
(lambda (resp) (nrepl--merge response resp))
955-
connection
956-
tooling)
960+
(nrepl-send-request request cb connection tooling)
957961
(while (and (not (member "done" status))
958962
(not (and abort-on-input
959963
(input-pending-p))))
@@ -962,7 +966,7 @@ If TOOLING, use the tooling session rather than the standard session."
962966
;; anywhere, and we'll just timeout. So we forward it to the user.
963967
(if (member "need-input" status)
964968
(progn (cider-need-input (current-buffer))
965-
;; If the used took a few seconds to respond, we might
969+
;; If the user took a few seconds to respond, we might
966970
;; unnecessarily timeout, so let's reset the timer.
967971
(setq time0 (current-time)))
968972
;; break out in case we don't receive a response for a while

0 commit comments

Comments
 (0)