@@ -189,16 +189,20 @@ the current connection. Return the id of the sent message.
189189If 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.
194195Hold till final \" done\" message has arrived and join all response messages
195196of the same \" op\" that came along and return the accumulated response.
196197If ABORT-ON-INPUT is non-nil, the function will return nil
197198at 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)))
0 commit comments