Skip to content
This repository was archived by the owner on Oct 21, 2022. It is now read-only.

Commit 12fcaad

Browse files
committed
Fix jump to source, close #3
This fixes jump to source for jar files in clojure and clojurescript. This also fixes jumping to src-paths in clj e.g. lighttable/nrepl/eval.clj.
1 parent d9ea2e5 commit 12fcaad

1 file changed

Lines changed: 41 additions & 4 deletions

File tree

  • lein-light-nrepl/src/lighttable/nrepl

lein-light-nrepl/src/lighttable/nrepl/doc.clj

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
(:require [lighttable.nrepl.core :as core]
33
[lighttable.nrepl.eval :as eval]
44
[lighttable.nrepl.cljs :as cljs]
5+
[clojure.java.io :as io]
6+
[clojure.string :as string]
57
[cljs.env :as env]
68
[cljs.compiler :as comp]
7-
[cljs.analyzer :as ana]))
9+
[cljs.analyzer :as ana])
10+
(:import java.net.URL java.io.File))
811

912
(defn clean-meta [m]
1013
(when m
@@ -42,6 +45,37 @@
4245
(str-contains? (str (:name m)) search)))]
4346
(format-result (clean-meta m)))))
4447

48+
(def jar-temp-files
49+
"Maps jar-url paths to temp files"
50+
(atom {}))
51+
52+
(defn jar-url->file
53+
"Given a jar-url, retrieve its cached tempfile or copy its contents to a
54+
tempfile and return it."
55+
[^URL jar-url]
56+
(or
57+
(get @jar-temp-files (.getPath jar-url))
58+
(let [[_ relative-name ext] (re-find #"!/(.*)(\.[^.]+)$" (.getPath jar-url))
59+
new-file (.getPath (File/createTempFile relative-name ext))
60+
body (-> jar-url .getContent slurp)]
61+
(swap! jar-temp-files assoc (.getPath jar-url) new-file)
62+
(spit new-file body)
63+
new-file)))
64+
65+
(defn resolve-file
66+
"Resolves a file to its full path. Jar paths are unpacked to a tempfile."
67+
[file]
68+
(when file
69+
(let [url (or (io/resource file)
70+
(URL.
71+
;; cljs files don't have jar:file: or file: prefix off of metadata
72+
(if (.contains file ".jar!/")
73+
(string/replace-first file #"^file:" "jar:file:")
74+
(string/replace-first file #"^/" "file:/"))))]
75+
(if (= "jar" (.getProtocol url))
76+
(jar-url->file url)
77+
(-> url io/file .getPath)))))
78+
4579
(defn dmeta [nsp sym]
4680
(-> (ns-resolve (symbol nsp) sym)
4781
(meta)
@@ -77,8 +111,9 @@
77111
(defmethod core/handle "editor.clj.doc" [{:keys [ns sym loc session path result-type] :as msg}]
78112
(let [ns (eval/normalize-ns ns path)
79113
_ (eval/require|create-ns (symbol ns))
80-
res (get-doc ns sym)
81-
res (when res (assoc res :loc loc :result-type result-type))]
114+
res (some-> (get-doc ns sym)
115+
(assoc :loc loc :result-type result-type)
116+
(update-in [:file] resolve-file))]
82117
(core/respond msg "editor.clj.doc" res))
83118
@session)
84119

@@ -91,7 +126,9 @@
91126
res (if (:macro clj)
92127
clj
93128
(get-cljs-doc ns sym))
94-
res (when res (assoc res :loc loc :result-type result-type))]
129+
res (some-> res
130+
(assoc :loc loc :result-type result-type)
131+
(update-in [:file] resolve-file))]
95132
(core/respond msg "editor.cljs.doc" res))))
96133
@session)
97134

0 commit comments

Comments
 (0)