Skip to content

Commit 8825e26

Browse files
committed
Draft refactor-nrepl.ns.suggest-libspecs
Part of #384 Can be tried out with: ``` (thread-first "cljr-suggest-libspecs" (cljr--create-msg "lib-prefix" "s" "language-context" "cljc" "preferred-aliases" (prin1-to-string cljr-magic-require-namespaces)) (cljr--call-middleware-sync "suggestions") parseedn-read-str) ```
1 parent 1ba34be commit 8825e26

File tree

3 files changed

+81
-15
lines changed

3 files changed

+81
-15
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
## Unreleased
44

5-
* [#385](https://github.com/clojure-emacs/refactor-nrepl/pull/385): Fix cljr-refactor.el's `cljr-slash` when namespace fragments start with a number.
5+
* [#385](https://github.com/clojure-emacs/refactor-nrepl/pull/385): only `suggest-aliases` that are valid symbols.
6+
* Fixes an edge case for cljr-refactor.el's `cljr-slash`.
67

78
## 3.5.4
89

src/refactor_nrepl/middleware.clj

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,16 @@
191191
:namespace-aliases (serialize-response msg aliases)
192192
:status :done)))
193193

194+
(def suggest-libspecs
195+
(delay
196+
(require-and-resolve 'refactor-nrepl.ns.suggest-libspecs/suggest-libspecs-response)))
197+
198+
(defn- suggest-libspecs-reply [{:keys [transport] :as msg}]
199+
(reply transport
200+
msg
201+
:suggestions (serialize-response msg (@suggest-libspecs msg))
202+
:status :done))
203+
194204
(def ^:private find-used-publics
195205
(delay (require-and-resolve 'refactor-nrepl.find.find-used-publics/find-used-publics)))
196206

@@ -199,20 +209,21 @@
199209
:used-publics (serialize-response msg (@find-used-publics msg)) :status :done))
200210

201211
(def refactor-nrepl-ops
202-
{"artifact-list" artifact-list-reply
203-
"artifact-versions" artifact-versions-reply
204-
"clean-ns" clean-ns-reply
205-
"extract-definition" extract-definition-reply
206-
"find-symbol" find-symbol-reply
207-
"find-used-locals" find-used-locals-reply
208-
"hotload-dependency" hotload-dependency-reply
209-
"namespace-aliases" namespace-aliases-reply
210-
"rename-file-or-dir" rename-file-or-dir-reply
211-
"resolve-missing" resolve-missing-reply
212-
"stubs-for-interface" stubs-for-interface-reply
213-
"find-used-publics" find-used-publics-reply
214-
"version" version-reply
215-
"warm-ast-cache" warm-ast-cache-reply
212+
{"artifact-list" artifact-list-reply
213+
"artifact-versions" artifact-versions-reply
214+
"clean-ns" clean-ns-reply
215+
"cljr-suggest-libspecs" suggest-libspecs-reply
216+
"extract-definition" extract-definition-reply
217+
"find-symbol" find-symbol-reply
218+
"find-used-locals" find-used-locals-reply
219+
"hotload-dependency" hotload-dependency-reply
220+
"namespace-aliases" namespace-aliases-reply
221+
"rename-file-or-dir" rename-file-or-dir-reply
222+
"resolve-missing" resolve-missing-reply
223+
"stubs-for-interface" stubs-for-interface-reply
224+
"find-used-publics" find-used-publics-reply
225+
"version" version-reply
226+
"warm-ast-cache" warm-ast-cache-reply
216227
"warm-macro-occurrences-cache" warm-macro-occurrences-cache-reply})
217228

218229
(defn wrap-refactor
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
(ns refactor-nrepl.ns.suggest-libspecs
2+
"Beta middleware, meant only for internal development. Subject to change."
3+
(:require
4+
[refactor-nrepl.core :as core]
5+
[refactor-nrepl.ns.libspecs :as libspecs]))
6+
7+
(defn suggest-libspecs-response
8+
"Very basic POC for https://github.com/clojure-emacs/refactor-nrepl/issues/384.
9+
10+
Only focuses on its API and giving some basic (but useful) results.
11+
12+
The results are returned in no particular order."
13+
[{:keys [lib-prefix ;; "set", representing that the user typed `set/`
14+
^String language-context ;; "clj" "cljs" or "cljc" representing the filename extension (or a user choice for edge cases e.g. it's a buffer/repl without a filename)
15+
preferred-aliases ;; the entire value of cljr-magic-require-namespaces. See also https://github.com/clojure-emacs/clj-refactor.el/issues/530 for an intended future feature.
16+
suggest ;; the value of cljr-suggest-namespace-aliases
17+
ignore-errors]
18+
:or {ignore-errors true
19+
suggest true}}]
20+
{:pre [lib-prefix
21+
language-context
22+
preferred-aliases
23+
(boolean? suggest)
24+
(boolean? ignore-errors)]}
25+
(let [alias (symbol lib-prefix)
26+
aliases (libspecs/namespace-aliases ignore-errors
27+
(core/source-dirs-on-classpath)
28+
suggest)
29+
ks (cond-> #{}
30+
(.equals language-context "clj") (conj :clj)
31+
(.equals language-context "cljs") (conj :cljs)
32+
(.equals language-context "cljc") (conj :clj :cljs)
33+
true vec)
34+
maps (map (fn [k]
35+
(get aliases k))
36+
ks)
37+
merged (apply merge-with (fn [x y]
38+
(vec (distinct (into x y))))
39+
maps)
40+
candidates (get merged alias)]
41+
(->> candidates
42+
(mapv (fn [candidate]
43+
(format "[%s :as %s]"
44+
candidate
45+
alias))))))
46+
47+
(comment
48+
(suggest-libspecs-response {:lib-prefix "add-on"
49+
:language-context "clj"
50+
:preferred-aliases []})
51+
52+
(suggest-libspecs-response {:lib-prefix "s"
53+
:language-context "cljc"
54+
:preferred-aliases []}))

0 commit comments

Comments
 (0)