Skip to content

Commit 46136be

Browse files
[info] Add support for automatically downloading sources JARs
1 parent 58fc8ae commit 46136be

File tree

5 files changed

+44
-15
lines changed

5 files changed

+44
-15
lines changed

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
:url "http://www.eclipse.org/legal/epl-v10.html"}
2222
:scm {:name "git" :url "https://github.com/clojure-emacs/cider-nrepl"}
2323
:dependencies [[nrepl/nrepl "1.3.1" :exclusions [org.clojure/clojure]]
24-
[cider/orchard "0.29.1" :exclusions [org.clojure/clojure]]
24+
[cider/orchard "0.30.0" :exclusions [org.clojure/clojure]]
2525
^:inline-dep [mx.cider/haystack "0.3.3" :exclusions [cider/orchard]]
2626
^:inline-dep [thunknyc/profile "0.5.2"]
2727
^:inline-dep [mvxcvi/puget "1.3.4" :exclusions [org.clojure/clojure]]

src/cider/nrepl/middleware/info.clj

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66
[cider.nrepl.middleware.util.cljs :as cljs]
77
[cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
88
[clojure.string :as str]
9+
[nrepl.transport :as transport]
10+
[nrepl.misc :refer [response-for]]
911
[orchard.eldoc :as eldoc]
1012
[orchard.info :as info]
13+
[orchard.java.source-files :as src-files]
1114
[orchard.meta :as meta]
12-
[orchard.misc :as misc]))
15+
[orchard.misc :as misc])
16+
(:import
17+
(java.util.concurrent ConcurrentHashMap)))
1318

1419
(declare format-response)
1520

@@ -52,7 +57,7 @@
5257
(when-let [forms (:forms info)]
5358
{:forms-str (forms-join forms)})
5459
(when-let [file (:file info)]
55-
(info/file-info file))
60+
(info/file-info (str file)))
5661
(when-let [path (:javadoc info)]
5762
(info/javadoc-info path)))
5863
dissoc-nil-keys
@@ -78,8 +83,24 @@
7883
(def var-meta-allowlist-set
7984
(set meta/var-meta-allowlist))
8085

86+
(def ^:private ^ConcurrentHashMap attempted-to-download-coords
87+
"Map that keeps all Maven artifact coordinates that we already attempted to
88+
download once (doesn't matter the result). We don't want to repeatedly try to
89+
download an artifact that doesn't exist or can't be found."
90+
(ConcurrentHashMap.))
91+
92+
(defn- download-sources-jar-for-class
93+
[klass {:keys [transport] :as msg}]
94+
(when-let [coords (src-files/infer-maven-coordinates-for-class klass)]
95+
(when (nil? (.putIfAbsent attempted-to-download-coords coords true))
96+
;; Tell the client we are going to download an artifict so it can notify
97+
;; the user. It may take a few seconds.
98+
(transport/send transport (response-for msg {:status :download-sources-jar
99+
:coords coords}))
100+
(src-files/download-sources-jar-for-coordinates coords))))
101+
81102
(defn info
82-
[{:keys [ns sym class member context var-meta-allowlist]
103+
[{:keys [ns sym class member context var-meta-allowlist download-sources-jar]
83104
legacy-sym :symbol
84105
:as msg}]
85106
(let [sym (or (not-empty legacy-sym)
@@ -117,10 +138,15 @@
117138
{:var-meta-allowlist (into meta/var-meta-allowlist
118139
(remove var-meta-allowlist-set)
119140
var-meta-allowlist)}))]
120-
(cond
121-
java? (info/info-java class (or member sym))
122-
(and ns sym) (info/info* info-params)
123-
:else nil)))
141+
;; If the client requested sources jar to be downloaded in case it is
142+
;; missing, try to download it once using `orchard.java.src-files`.
143+
(binding [src-files/*download-sources-jar-fn*
144+
(when download-sources-jar
145+
#(download-sources-jar-for-class % msg))]
146+
(cond
147+
java? (info/info-java class (or member sym))
148+
(and ns sym) (info/info* info-params)
149+
:else nil))))
124150

125151
(defn info-reply
126152
[msg]

src/cider/nrepl/middleware/track_state.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,11 @@
162162
(def clojure-core-map
163163
(when clojure-core
164164
{:aliases {}
165-
:interns (->> (ns-map clojure-core)
166-
(filter #(var? (second %)))
167-
(misc/update-vals #(um/relevant-meta (enriched-meta %))))}))
165+
:interns (into {}
166+
(keep (fn [[k v]]
167+
(when (var? v)
168+
[k (um/relevant-meta (enriched-meta v))])))
169+
(ns-map clojure-core))}))
168170

169171
(defn calculate-changed-ns-map
170172
"Return a map of namespaces that changed between new-map and old-map.

src/cider/nrepl/middleware/util/meta.clj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
(defn relevant-meta
1414
"Filter the entries in map m by `relevant-meta-keys` and non-nil values."
1515
[m]
16-
(->> (select-keys m relevant-meta-keys)
17-
(filter second)
18-
(misc/update-vals pr-str)))
16+
(into {}
17+
(keep #(when-let [v (get m %)] [% (pr-str v)]))
18+
relevant-meta-keys))

src/cider/nrepl/middleware/xref.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
{:name (meta/var-name v)
2020
:doc (meta/var-doc 1 v)
2121
:file (:file var-meta)
22-
:file-url (some-> var-meta :file filename-as-url)
22+
:file-url (or (:file-url var-meta)
23+
(some-> var-meta :file filename-as-url))
2324
:line (:line var-meta)
2425
:column (:column var-meta)}))
2526

0 commit comments

Comments
 (0)