Skip to content

Commit 3b6590d

Browse files
rksmbbatsov
authored andcommitted
Provide dynamic cljs completions with suitable (#633)
1 parent b6fea2a commit 3b6590d

File tree

5 files changed

+33
-3
lines changed

5 files changed

+33
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* [#605](https://github.com/clojure-emacs/cider-nrepl/pull/605): Added a option for filtering vars to the ns-vars middleware.
88
* Added `xref` middleware providing `fn-deps` and `fn-refs` ops.
99
* [#628](https://github.com/clojure-emacs/cider-nrepl/pull/628): Added `clojuredocs` middleware providing `clojuredocs-lookup` and `clojuredocs-refresh-cache` ops.
10+
* [#633](https://github.com/clojure-emacs/cider-nrepl/pull/633) Added runtime code completion for ClojureScript via [suitable](https://github.com/rksm/clj-suitable).
1011

1112
### Bugs fixed
1213

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ Let's also acknowledge some of the projects leveraged by cider-nrepl:
389389
* [orchard][] - extracted from `cider-nrepl`, so that non-nREPL clients can leverage the generic tooling functionality (like `inspect`, `apropos`, `var-info`, etc
390390
* [compliment][] - for Clojure code completion
391391
* [cljs-tooling][] - for ClojureScript code completion
392+
* [suitable][] - for ClojureScript code completion using runtime inspection
392393
* [tools.trace][] - for tracing
393394
* [tools.namespace][] - for namespace reloading
394395
* [cljfmt][] - for code formatting
@@ -402,6 +403,7 @@ Distributed under the Eclipse Public License, the same as Clojure.
402403
[orchard]: https://github.com/clojure-emacs/orchard
403404
[compliment]: https://github.com/alexander-yakushev/compliment
404405
[cljs-tooling]: https://github.com/clojure-emacs/cljs-tooling
406+
[suitable]: https://github.com/rksm/clj-suitable
405407
[tools.trace]: https://github.com/clojure/tools.trace
406408
[tools.namespace]: https://github.com/clojure/tools.namespace
407409
[cljfmt]: https://github.com/weavejester/cljfmt

project.clj

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
^:inline-dep [fipp "0.6.18"] ; can be removed in unresolved-tree mode
1212
^:inline-dep [compliment "0.3.9"]
1313
^:inline-dep [cljs-tooling "0.3.1"]
14+
^:inline-dep [org.rksm/suitable "0.2.1" :exclusions [org.clojure/clojurescript]]
1415
^:inline-dep [cljfmt "0.6.4" :exclusions [org.clojure/clojurescript]]
1516
^:inline-dep [org.clojure/tools.namespace "0.3.1"]
1617
^:inline-dep [org.clojure/tools.trace "0.7.10"]

src/cider/nrepl/middleware/complete.clj

+9-3
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,22 @@
55
[cljs-tooling.complete :as cljs-complete]
66
[compliment.core :as jvm-complete]
77
[compliment.utils :as jvm-complete-utils]
8-
[orchard.misc :as u]))
8+
[orchard.misc :as u]
9+
[suitable.complete-for-nrepl :as suitable]))
10+
11+
(defn- cljs-complete
12+
[msg cljs-env ns prefix extra-metadata]
13+
(concat (cljs-complete/completions cljs-env prefix {:context-ns ns
14+
:extra-metadata extra-metadata})
15+
(suitable/complete-for-nrepl msg)))
916

1017
(defn complete
1118
[{:keys [ns symbol context extra-metadata] :as msg}]
1219
(let [ns (u/as-sym ns)
1320
prefix (str symbol)
1421
extra-metadata (set (map keyword extra-metadata))]
1522
(if-let [cljs-env (cljs/grab-cljs-env msg)]
16-
(cljs-complete/completions cljs-env prefix {:context-ns ns
17-
:extra-metadata extra-metadata})
23+
(cljs-complete msg cljs-env ns prefix extra-metadata)
1824
(jvm-complete/completions prefix {:ns ns
1925
:context context
2026
:extra-metadata extra-metadata}))))

test/cljs/cider/nrepl/middleware/cljs_complete_test.clj

+20
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,26 @@
4040
(is (= '("[psym & doc+methods]") (:arglists candidate)))
4141
(is (string? (:doc candidate))))))
4242

43+
(deftest cljs-complete-with-suitable-test
44+
(testing "js global completion"
45+
(let [response (session/message {:op "complete"
46+
:ns "cljs.user"
47+
:symbol "js/Ob"})
48+
candidates (:completions response)]
49+
(is (= [{:candidate "js/Object", :ns "js", :type "function"}] candidates))))
50+
51+
(testing "manages context state"
52+
(session/message {:op "complete"
53+
:ns "cljs.user"
54+
:symbol ".xxxx"
55+
:context "(__prefix__ js/Object)"})
56+
(let [response (session/message {:op "complete"
57+
:ns "cljs.user"
58+
:symbol ".key"
59+
:context ":same"})
60+
candidates (:completions response)]
61+
(is (= [{:ns "js/Object", :candidate ".keys" :type "function"}] candidates)))))
62+
4363
(deftest cljs-complete-doc-test
4464
(let [response (session/message {:op "complete-doc" :symbol "tru"})]
4565
(is (= (:status response) #{"done"}))

0 commit comments

Comments
 (0)