|
6 | 6 | [cider.nrepl.middleware.util.cljs :as cljs]
|
7 | 7 | [cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
|
8 | 8 | [clojure.string :as str]
|
| 9 | + [nrepl.transport :as transport] |
| 10 | + [nrepl.misc :refer [response-for]] |
9 | 11 | [orchard.eldoc :as eldoc]
|
10 | 12 | [orchard.info :as info]
|
| 13 | + [orchard.java.source-files :as src-files] |
11 | 14 | [orchard.meta :as meta]
|
12 |
| - [orchard.misc :as misc])) |
| 15 | + [orchard.misc :as misc]) |
| 16 | + (:import |
| 17 | + (java.util.concurrent ConcurrentHashMap))) |
13 | 18 |
|
14 | 19 | (declare format-response)
|
15 | 20 |
|
|
52 | 57 | (when-let [forms (:forms info)]
|
53 | 58 | {:forms-str (forms-join forms)})
|
54 | 59 | (when-let [file (:file info)]
|
55 |
| - (info/file-info file)) |
| 60 | + (info/file-info (str file))) |
56 | 61 | (when-let [path (:javadoc info)]
|
57 | 62 | (info/javadoc-info path)))
|
58 | 63 | dissoc-nil-keys
|
|
78 | 83 | (def var-meta-allowlist-set
|
79 | 84 | (set meta/var-meta-allowlist))
|
80 | 85 |
|
| 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 | + |
81 | 102 | (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] |
83 | 104 | legacy-sym :symbol
|
84 | 105 | :as msg}]
|
85 | 106 | (let [sym (or (not-empty legacy-sym)
|
|
117 | 138 | {:var-meta-allowlist (into meta/var-meta-allowlist
|
118 | 139 | (remove var-meta-allowlist-set)
|
119 | 140 | 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)))) |
124 | 150 |
|
125 | 151 | (defn info-reply
|
126 | 152 | [msg]
|
|
0 commit comments