Skip to content

Commit d77aa19

Browse files
authored
Merge pull request #28 from liquidz/dev
Next release
2 parents 5917061 + 3c2b681 commit d77aa19

File tree

8 files changed

+175
-97
lines changed

8 files changed

+175
-97
lines changed

.clj-kondo/metosin/malli-types-clj/config.edn

+6-22
Original file line numberDiff line numberDiff line change
@@ -356,31 +356,15 @@
356356
:component/clj-kondo :any}}
357357
:string
358358
:string],
359-
:ret {:op :keys,
360-
:opt {:doc :string,
361-
:arglists :nilable/string,
362-
:local? :boolean},
363-
:req {:ns :string,
364-
:name :string,
365-
:file :string,
366-
:arglists-str :string,
367-
:column :int,
368-
:line :int}}}}},
369-
lookup {:arities {3 {:args [{:op :keys,
359+
:ret :any}}},
360+
lookup {:arities {4 {:args [{:op :keys,
370361
:req {:component/nrepl :any,
371362
:component/clj-kondo :any}}
372363
:string
373-
:string],
374-
:ret {:op :keys,
375-
:opt {:doc :string,
376-
:arglists :nilable/string,
377-
:local? :boolean},
378-
:req {:ns :string,
379-
:name :string,
380-
:file :string,
381-
:arglists-str :string,
382-
:column :int,
383-
:line :int}}}}},
364+
:string
365+
{:op :keys,
366+
:req {:order :sequential}}],
367+
:ret :any}}},
384368
get-java-rendering-data {:arities {1 {:args [{:op :keys,
385369
:opt {:doc :string,
386370
:arglists :nilable/string,

dev/analysis.edn

+1-1
Large diffs are not rendered by default.

resources/config.edn

+19-3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
elin.interceptor.evaluate/show-last-stacktrace]}
5555

5656
:test {:includes [elin.interceptor.test/correct-test-vars-automatically
57+
elin.interceptor.test/register-started-at
5758
elin.interceptor.test/parse-test-result
5859
elin.interceptor.test/update-test-result-sign
5960
elin.interceptor.test/append-test-result-to-info-buffer
@@ -104,10 +105,19 @@
104105
#re "</?li>\n?" ""
105106
#re "</?b>" "**"
106107
#re "</?i>" "*"}
108+
:lookup-config {;; NOTE
109+
;; `:local` is not included in the order because it is not necessary to look up the documentation.
110+
:order [:nrepl :clj-kondo]}
107111
:interceptor {:uses [elin.interceptor.handler/show-result-as-popup {:filetype "help" :moved "current-line"}]}}
108-
elin.handler.lookup/show-source {:interceptor {:includes [elin.interceptor.handler/show-result-as-popup]}}
112+
elin.handler.lookup/show-source {:lookup-config {;; NOTE
113+
;; `:local` is prioritized because we'd like to see the local definition first.
114+
:order [:local :nrepl :clj-kondo]}
115+
:interceptor {:includes [elin.interceptor.handler/show-result-as-popup]}}
109116
elin.handler.lookup/show-clojuredocs {:export-edn-url "https://github.com/clojure-emacs/clojuredocs-export-edn/raw/master/exports/export.compact.edn"
110117
:format #resource "template/clojuredocs.mustache"
118+
:lookup-config {;; NOTE
119+
;; `:local` is not included in the order because it is not necessary to look up clojuredocs.
120+
:order [:nrepl :clj-kondo]}
111121
:interceptor {:uses [elin.interceptor.handler/append-result-to-info-buffer {:show-temporarily? true}]}}
112122
elin.handler.lookup/open-javadoc {}
113123
elin.handler.namespace/add-libspec {:favorites #include "favorite_aliases.edn"
@@ -118,9 +128,15 @@
118128
:java-classes #include "java_classes.edn"
119129
:interceptor {:includes [elin.interceptor.handler.namespace/show-result]}}
120130
elin.handler.navigate/cycle-source-and-test {:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
121-
elin.handler.navigate/cycle-function-and-test {:template #ref [:common :template]
131+
elin.handler.navigate/cycle-function-and-test {:lookup-config {;; NOTE
132+
;; `:local` is not included in the order because it is not a var.
133+
:order [:nrepl :clj-kondo]}
134+
:template #ref [:common :template]
122135
:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
123-
elin.handler.navigate/jump-to-definition {:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
136+
elin.handler.navigate/jump-to-definition {:lookup-config {;; NOTE
137+
;; `:local` is prioritized because we'd like to see the local definition first.
138+
:order [:local :nrepl :clj-kondo]}
139+
:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
124140
elin.handler.navigate/references {:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
125141
elin.handler.navigate/local-references {:interceptor {:includes [elin.interceptor.handler/jump-to-file]}}
126142
elin.handler.tap/tapped {:interceptor {:uses [elin.interceptor.handler/append-result-to-info-buffer {:show-temporarily? true

src/elin/function/lookup.clj

+49-25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
[elin.function.nrepl.cider :as e.f.n.cider]
88
[elin.function.sexpr :as e.f.sexpr]
99
[elin.protocol.host :as e.p.host]
10+
[elin.schema :as e.schema]
1011
[elin.schema.handler :as e.s.handler]
1112
[elin.schema.nrepl :as e.s.nrepl]
1213
[malli.core :as m]
@@ -15,7 +16,7 @@
1516
(def ?NreplAndCljKondo
1617
(m.util/select-keys e.s.handler/?Components [:component/nrepl :component/clj-kondo]))
1718

18-
(m/=> local-lookup [:=> [:cat ?NreplAndCljKondo string? string?] e.s.nrepl/?Lookup])
19+
(m/=> local-lookup [:=> [:cat ?NreplAndCljKondo string? string?] (e.schema/error-or e.s.nrepl/?Lookup)])
1920
(defn- local-lookup
2021
[{:as elin :component/keys [host clj-kondo]} ns-str sym-str]
2122
(e/let [{cur-lnum :lnum cur-col :col} (async/<!! (e.p.host/get-cursor-position! host))
@@ -44,21 +45,25 @@
4445
clj-kondo protocol-ns protocol-name (:name info-response))]
4546
(assoc info-response :protocol-implementations impls)))
4647

47-
(m/=> lookup [:=> [:cat ?NreplAndCljKondo string? string?] e.s.nrepl/?Lookup])
48-
(defn lookup
48+
(def ^:private ?LookupOrder
49+
[:sequential
50+
[:enum :nrepl :clj-kondo :local]])
51+
52+
(def ^:private ?LookupConfig
53+
[:map
54+
[:order ?LookupOrder]])
55+
56+
(defn- nrepl-lookup
4957
[{:as elin :component/keys [nrepl clj-kondo]}
5058
ns-str
5159
sym-str]
5260
(try
53-
(let [res (e.f.n.cider/info!! nrepl ns-str sym-str)
54-
error? (e/error? res)
55-
protocol-var-str (when-not error?
56-
(:protocol res))
57-
proto-def (when (and (not error?)
58-
(not protocol-var-str)
59-
(:ns res)
60-
(:name res))
61-
(e.f.clj-kondo/protocol-definition clj-kondo (:ns res) (:name res)))]
61+
(e/let [res (e.f.n.cider/info!! nrepl ns-str sym-str)
62+
protocol-var-str (:protocol res)
63+
proto-def (when (and (not protocol-var-str)
64+
(:ns res)
65+
(:name res))
66+
(e.f.clj-kondo/protocol-definition clj-kondo (:ns res) (:name res)))]
6267
(cond
6368
protocol-var-str
6469
(protocol-lookup elin protocol-var-str res)
@@ -68,31 +73,50 @@
6873
(format "%s/%s" (:protocol-ns proto-def) (:protocol-name proto-def))
6974
res)
7075

71-
(and (not error?)
72-
(or
73-
;; clojure
74-
(contains? res :name)
75-
;; java
76-
(contains? res :class)))
76+
(or
77+
;; clojure
78+
(contains? res :name)
79+
;; java
80+
(contains? res :class))
7781
res
7882

7983
:else
80-
(let [res (e.f.clj-kondo/lookup clj-kondo ns-str sym-str)]
81-
(if-not (e/error? res)
82-
res
83-
(local-lookup elin ns-str sym-str)))))
84-
84+
(e/not-found)))
8585
(catch Exception e
8686
(e/fault {:message (pr-str e)}))))
8787

88+
(m/=> lookup [:=> [:cat ?NreplAndCljKondo string? string? ?LookupConfig] (e.schema/error-or e.s.nrepl/?Lookup)])
89+
(defn lookup
90+
[{:as elin :component/keys [clj-kondo]}
91+
ns-str
92+
sym-str
93+
config]
94+
(loop [[next-order & rest-orders] (:order config)]
95+
(if-not next-order
96+
(e/not-found)
97+
(let [resp (condp = next-order
98+
:nrepl
99+
(nrepl-lookup elin ns-str sym-str)
100+
101+
:clj-kondo
102+
(e.f.clj-kondo/lookup clj-kondo ns-str sym-str)
103+
104+
:local
105+
(local-lookup elin ns-str sym-str)
106+
107+
(e/unsupported {:message (str "Unsupported order: " next-order)}))]
108+
(if-not (e/error? resp)
109+
resp
110+
(recur rest-orders))))))
111+
88112
(defn clojuredocs-lookup
89113
"Returns a result of looking up the help of the function under the cursor in clojuredocs."
90-
[{:as elin :component/keys [host nrepl]} export-edn-url]
114+
[{:as elin :component/keys [host nrepl]} export-edn-url config]
91115
(e/let [{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
92116
{:keys [code]} (e.f.sexpr/get-expr elin lnum col)
93117
[ns-str name-str] (e/error-or
94118
(e/let [ns-str (e.f.sexpr/get-namespace elin)
95-
resp (lookup elin ns-str code)]
119+
resp (lookup elin ns-str code config)]
96120
[(:ns resp) (:name resp)])
97121
(str/split code #"/" 2))]
98122
(or (e/error-or (e.f.n.cider/clojuredocs-lookup!! nrepl ns-str name-str export-edn-url))

src/elin/handler/lookup.clj

+22-11
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,26 @@
3232

3333
(m/=> lookup [:=> [:cat e.s.handler/?Elin] any?])
3434
(defn lookup
35-
"Look up symbol at cursor position."
35+
"Look up symbol at cursor position.
36+
37+
.Configuration
38+
[%autowidth.stretch]
39+
|===
40+
| key | type | description
41+
42+
| format | todo | todo
43+
| replace-string | todo | todo
44+
| lookup-config | todo | todo
45+
|==="
3646
[{:as elin :component/keys [host]}]
37-
(e/let [config (e.u.handler/config elin #'lookup)
47+
(e/let [{:as config :keys [lookup-config]} (e.u.handler/config elin #'lookup)
3848
{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
3949
{:keys [code]} (e.f.sexpr/get-expr elin lnum col)
4050
ns-str (e/error-or (e.f.sexpr/get-namespace elin))
4151
resp (if ns-str
42-
(e.f.lookup/lookup elin ns-str code)
43-
(->> (parse-code-to-ns-and-name code)
44-
(apply e.f.lookup/lookup elin)))
52+
(e.f.lookup/lookup elin ns-str code lookup-config)
53+
(let [[ns-str sym-str] (parse-code-to-ns-and-name code)]
54+
(e.f.lookup/lookup elin ns-str sym-str lookup-config)))
4555
doc-str (generate-doc (:format config)
4656
(e.f.lookup/get-lookup-rendering-data resp))]
4757
(reduce
@@ -54,13 +64,14 @@
5464
(defn show-source
5565
"Show source code of symbol at cursor position."
5666
[{:as elin :component/keys [host]}]
57-
(e/let [{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
67+
(e/let [{:keys [lookup-config]} (e.u.handler/config elin #'show-source)
68+
{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
5869
{:keys [code]} (e.f.sexpr/get-expr elin lnum col)
5970
ns-str (e/error-or (e.f.sexpr/get-namespace elin))
6071
resp (if ns-str
61-
(e.f.lookup/lookup elin ns-str code)
62-
(->> (parse-code-to-ns-and-name code)
63-
(apply e.f.lookup/lookup elin)))
72+
(e.f.lookup/lookup elin ns-str code lookup-config)
73+
(let [[ns-str sym-str] (parse-code-to-ns-and-name code)]
74+
(e.f.lookup/lookup elin ns-str sym-str lookup-config)))
6475
path (:file resp)
6576
content (e.u.file/slurp path)]
6677
(if (:local? resp)
@@ -76,9 +87,9 @@
7687
(defn show-clojuredocs
7788
"Show clojuredocs of symbol at cursor position."
7889
[elin]
79-
(e/let [config (e.u.handler/config elin #'show-clojuredocs)
90+
(e/let [{:as config :keys [lookup-config]} (e.u.handler/config elin #'show-clojuredocs)
8091
export-edn-url (:export-edn-url (e.u.handler/config elin #'show-clojuredocs))
81-
resp (e.f.lookup/clojuredocs-lookup elin export-edn-url)]
92+
resp (e.f.lookup/clojuredocs-lookup elin export-edn-url lookup-config)]
8293
(generate-doc {:clojuredocs (:format config)}
8394
(e.f.lookup/get-clojuredocs-rendering-data resp))))
8495

src/elin/handler/navigate.clj

+6-4
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@
4848
(defn jump-to-definition
4949
"Jump to the definition of the symbol under the cursor."
5050
[{:as elin :component/keys [host]}]
51-
(e/let [{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
51+
(e/let [{:keys [lookup-config]} (e.u.handler/config elin #'jump-to-definition)
52+
{:keys [lnum col]} (async/<!! (e.p.host/get-cursor-position! host))
5253
ns-str (e/error-or (e.f.sexpr/get-namespace elin)
5354
"")
5455
{:keys [code]} (e.f.sexpr/get-expr elin lnum col)
5556
code (normalize-var-code code)
5657
{:keys [ns-str sym-str]} (select-ns-and-sym-str ns-str code)
57-
{:keys [file line column protocol-implementations]} (e.f.lookup/lookup elin ns-str sym-str)]
58+
{:keys [file line column protocol-implementations]} (e.f.lookup/lookup elin ns-str sym-str lookup-config)]
5859
(cond
5960
(seq protocol-implementations)
6061
(do (e.p.host/echo-text host "Multiple implementations found. See location list.")
@@ -93,7 +94,8 @@
9394
(m/=> cycle-function-and-test [:=> [:cat e.s.handler/?Elin] e.s.handler/?JumpToFile])
9495
(defn cycle-function-and-test
9596
[elin]
96-
(e/let [{:keys [template]} (e.u.handler/config elin #'cycle-function-and-test)
97+
(e/let [{:as config :keys [template]} (e.u.handler/config elin #'cycle-function-and-test)
98+
lookup-config (or (get config 'elin.function.lookup/lookup) {})
9799
{:keys [options]} (e.f.evaluate/get-var-name-from-current-top-list elin)
98100
{ns-str :ns var-name :var-name path :file} options
99101
file-sep (e.u.file/guess-file-separator path)
@@ -106,7 +108,7 @@
106108
(str/split #"/" 2)
107109
(second))
108110
cycled-var-name (e.f.nrepl/get-cycled-var-name var-name)
109-
lookup-resp (e/error-or (e.f.lookup/lookup elin cycled-ns-str cycled-var-name))]
111+
lookup-resp (e/error-or (e.f.lookup/lookup elin cycled-ns-str cycled-var-name lookup-config))]
110112
(if lookup-resp
111113
(e.u.handler/jump-to-file-response (:file lookup-resp)
112114
(:line lookup-resp)

src/elin/interceptor/test.clj

+18-4
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@
6666
(catch Exception _
6767
s))))
6868

69+
(def register-started-at
70+
"Register the time when the test started.
71+
`started-at` is stored in the context."
72+
{:kind e.c.interceptor/test
73+
:enter (fn [ctx]
74+
(assoc ctx :started-at (System/currentTimeMillis)))})
75+
6976
(def parse-test-result
7077
{:kind e.c.interceptor/test
7178
:leave (fn [{:as ctx :component/keys [nrepl interceptor] :keys [response]}]
@@ -143,10 +150,17 @@
143150

144151
(def output-test-result-to-cmdline
145152
{:kind e.c.interceptor/test-result
146-
:enter (-> (fn [{:component/keys [host] :keys [succeeded? summary]}]
147-
(if succeeded?
148-
(e.message/info host summary)
149-
(e.message/error host summary)))
153+
:enter (-> (fn [{:component/keys [host] :keys [succeeded? summary started-at]}]
154+
(let [elapsed (when started-at
155+
(-> (System/currentTimeMillis)
156+
(- started-at)
157+
(/ 1000)
158+
(double)
159+
(->> (format " (%.3fs)"))))
160+
summary' (str summary elapsed)]
161+
(if succeeded?
162+
(e.message/info host summary')
163+
(e.message/error host summary'))))
150164
(ix/discard))})
151165

152166
(def focus-current-testing

0 commit comments

Comments
 (0)