Skip to content

Commit bebdee6

Browse files
Merge pull request #198 from ryfow/delay-middleware-loading
delay loading of middleware to speed up startup
2 parents 715f431 + f629f0e commit bebdee6

File tree

2 files changed

+64
-25
lines changed

2 files changed

+64
-25
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
* [#198](https://github.com/clojure-emacs/refactor-nrepl/issues/187) Delay middleware loading to speed up initialization.
56
## 2.3.1
67

78
### Bugs fixed

src/refactor_nrepl/middleware.clj

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,16 @@
44
[clojure.tools.nrepl.middleware :refer [set-descriptor!]]
55
[clojure.tools.nrepl.misc :refer [response-for]]
66
[clojure.tools.nrepl.transport :as transport]
7-
[refactor-nrepl.analyzer :refer [warm-ast-cache]]
8-
[refactor-nrepl.artifacts
9-
:refer
10-
[artifact-list artifact-versions hotload-dependency]]
117
[refactor-nrepl.config :as config]
128
[refactor-nrepl.core :as core]
13-
[refactor-nrepl.extract-definition :refer [extract-definition]]
14-
[refactor-nrepl.find.find-locals :refer [find-used-locals]]
15-
[refactor-nrepl.find.find-symbol :refer [find-symbol]]
16-
[refactor-nrepl.find.find-used-publics :refer [find-used-publics]]
17-
[refactor-nrepl.find.find-macros :refer [warm-macro-occurrences-cache]]
18-
[refactor-nrepl.ns.clean-ns :refer [clean-ns]]
199
[refactor-nrepl.ns.libspecs :refer [namespace-aliases]]
20-
[refactor-nrepl.ns.pprint :refer [pprint-ns]]
21-
[refactor-nrepl.ns.resolve-missing :refer [resolve-missing]]
22-
[refactor-nrepl.rename-file-or-dir :refer [rename-file-or-dir]]
2310
[refactor-nrepl.stubs-for-interface :refer [stubs-for-interface]]
2411
[clojure.walk :as walk]))
2512

13+
(defn- require-and-resolve [sym]
14+
(require (symbol (namespace sym)))
15+
(resolve sym))
16+
2617
(defmacro ^:private with-errors-being-passed-on [transport msg & body]
2718
`(try
2819
~@body
@@ -74,65 +65,112 @@
7465
(pr-str response) ; edn as default
7566
)))
7667

68+
(def ^:private resolve-missing
69+
(delay
70+
(require-and-resolve 'refactor-nrepl.ns.resolve-missing/resolve-missing)))
71+
7772
(defn resolve-missing-reply [{:keys [transport] :as msg}]
78-
(reply transport msg :candidates (resolve-missing msg) :status :done))
73+
(reply transport msg :candidates (@resolve-missing msg) :status :done))
74+
75+
(def ^:private find-symbol
76+
(delay
77+
(require-and-resolve 'refactor-nrepl.find.find-symbol/find-symbol)))
7978

8079
(defn- find-symbol-reply [{:keys [transport] :as msg}]
8180
(config/with-config msg
8281
(with-errors-being-passed-on transport msg
83-
(let [occurrences (find-symbol msg)]
82+
(let [occurrences (@find-symbol msg)]
8483
(doseq [occurrence occurrences
8584
:let [response (serialize-response msg occurrence)]]
8685
(transport/send transport
8786
(response-for msg :occurrence response)))
8887
(transport/send transport (response-for msg :count (count occurrences)
8988
:status :done))))))
9089

90+
(def ^:private artifact-list
91+
(delay (require-and-resolve 'refactor-nrepl.artifacts/artifact-list)))
92+
93+
(def ^:private artifact-versions
94+
(delay (require-and-resolve 'refactor-nrepl.artifacts/artifact-versions)))
95+
96+
(def ^:private hotload-dependency
97+
(delay (require-and-resolve 'refactor-nrepl.artifacts/hotload-dependency)))
98+
9199
(defn- artifact-list-reply [{:keys [transport] :as msg}]
92-
(reply transport msg :artifacts (artifact-list msg) :status :done))
100+
(reply transport msg :artifacts (@artifact-list msg) :status :done))
93101

94102
(defn- artifact-versions-reply [{:keys [transport] :as msg}]
95-
(reply transport msg :versions (artifact-versions msg) :status :done))
103+
(reply transport msg :versions (@artifact-versions msg) :status :done))
96104

97105
(defn- hotload-dependency-reply [{:keys [transport] :as msg}]
98-
(reply transport msg :status :done :dependency (hotload-dependency msg)))
106+
(reply transport msg :status :done :dependency (@hotload-dependency msg)))
107+
108+
(def ^:private clean-ns
109+
(delay
110+
(require-and-resolve 'refactor-nrepl.ns.clean-ns/clean-ns)))
111+
112+
(def ^:private pprint-ns
113+
(delay
114+
(require-and-resolve 'refactor-nrepl.ns.pprint/pprint-ns)))
99115

100116
(defn- clean-ns-reply [{:keys [transport path] :as msg}]
101-
(reply transport msg :ns (some-> msg clean-ns pprint-ns) :status :done))
117+
(reply transport msg :ns (some-> msg @clean-ns @pprint-ns) :status :done))
118+
119+
(def ^:private find-used-locals
120+
(delay
121+
(require-and-resolve 'refactor-nrepl.find.find-locals/find-used-locals)))
102122

103123
(defn- find-used-locals-reply [{:keys [transport] :as msg}]
104-
(reply transport msg :used-locals (find-used-locals msg)))
124+
(reply transport msg :used-locals (@find-used-locals msg)))
105125

106126
(defn- version-reply [{:keys [transport] :as msg}]
107127
(reply transport msg :status :done :version (core/version)))
108128

129+
(def ^:private warm-ast-cache
130+
(delay
131+
(require-and-resolve 'refactor.nrepl.analyzer/warm-ast-cache)))
132+
109133
(defn- warm-ast-cache-reply [{:keys [transport] :as msg}]
110134
(reply transport msg :status :done
111-
:ast-statuses (serialize-response msg (warm-ast-cache))))
135+
:ast-statuses (serialize-response msg (@warm-ast-cache))))
136+
137+
(def ^:private warm-macro-occurrences-cache
138+
(delay (require-and-resolve 'refactor-nrepl.find.find-macros/warm-macro-occurrences-cache)))
112139

113140
(defn- warm-macro-occurrences-cache-reply [{:keys [transport] :as msg}]
114-
(warm-macro-occurrences-cache)
141+
(@warm-macro-occurrences-cache)
115142
(reply transport msg :status :done))
116143

117144
(defn- stubs-for-interface-reply [{:keys [transport] :as msg}]
118145
(reply transport msg :status :done
119146
:functions (serialize-response msg (stubs-for-interface msg))))
120147

148+
(def ^:private extract-definition
149+
(delay
150+
(require-and-resolve 'refactor-nrepl.extract-definition/extract-definition)))
151+
121152
(defn- extract-definition-reply [{:keys [transport] :as msg}]
122-
(reply transport msg :status :done :definition (pr-str (extract-definition msg))))
153+
(reply transport msg :status :done :definition (pr-str (@extract-definition msg))))
154+
155+
(def ^:private rename-file-or-dir
156+
(delay
157+
(require-and-resolve 'refactor-nrepl.rename-file-or-dir/rename-file-or-dir)))
123158

124159
(defn- rename-file-or-dir-reply [{:keys [transport old-path new-path] :as msg}]
125-
(reply transport msg :touched (rename-file-or-dir old-path new-path)
160+
(reply transport msg :touched (@rename-file-or-dir old-path new-path)
126161
:status :done))
127162

128163
(defn- namespace-aliases-reply [{:keys [transport] :as msg}]
129164
(reply transport msg
130165
:namespace-aliases (serialize-response msg (namespace-aliases))
131166
:status :done))
132167

168+
(def ^:private find-used-publics
169+
(delay (require-and-resolve 'refactor-nrepl.find.find-used-publics/find-used-publics) ))
170+
133171
(defn- find-used-publics-reply [{:keys [transport] :as msg}]
134172
(reply transport msg
135-
:used-publics (serialize-response msg (find-used-publics msg)) :status :done))
173+
:used-publics (serialize-response msg (@find-used-publics msg)) :status :done))
136174

137175
(def refactor-nrepl-ops
138176
{

0 commit comments

Comments
 (0)