|
8 | 8 | [cider.nrepl.middleware.pprint :as pprint]
|
9 | 9 | [cider.nrepl.print-method]))
|
10 | 10 |
|
11 |
| -(def DELAYS (atom nil)) |
| 11 | +(def DELAYS |
| 12 | + "Map of `delay`s holding deferred middleware handlers." |
| 13 | + (atom nil)) |
12 | 14 |
|
13 | 15 | (defn- resolve-or-fail [sym]
|
14 | 16 | (or (resolve sym)
|
15 | 17 | (throw (IllegalArgumentException. (format "Cannot resolve %s" sym)))))
|
16 | 18 |
|
17 |
| -(defmacro run-delayed-handler |
18 |
| - "Make a delay of `fn-name` and place it in `DELAYS` atom at compile time. |
19 |
| - Require and invoke the delay at run-time with arguments h and msg." |
20 |
| - [fn-name h msg] |
| 19 | +(defmacro run-deferred-handler |
| 20 | + "Make a delay out of `fn-name` and place it in `DELAYS` atom at compile time. |
| 21 | + Require and invoke the delay at run-time with arguments `handler` and |
| 22 | + `msg`. `fn-name` must be a namespaced symbol (unquoted)." |
| 23 | + [fn-name handler msg] |
21 | 24 | (let [ns (symbol (namespace `~fn-name))
|
22 | 25 | sym (symbol (name `~fn-name))]
|
23 | 26 | (swap! DELAYS assoc sym
|
24 | 27 | (delay
|
25 | 28 | (require `~ns)
|
26 | 29 | (resolve-or-fail `~fn-name)))
|
27 |
| - `(@(get @DELAYS '~sym) ~h ~msg))) |
| 30 | + `(@(get @DELAYS '~sym) ~handler ~msg))) |
28 | 31 |
|
29 | 32 | (defmacro ^{:arglists '([name handler-fn descriptor]
|
30 |
| - [name handler-fn handle descriptor])} |
| 33 | + [name handler-fn trigger-it descriptor])} |
31 | 34 | def-wrapper
|
32 | 35 | "Define delayed middleware (e.g. wrap-xyz).
|
33 | 36 | `handler-fn` is an unquoted name of a function that takes two arguments -
|
34 | 37 | `handler` and `message`. It is called only when certain conditions are met as
|
35 |
| - expressed by the optional `handle` argument. `handle` can be either a function |
36 |
| - or a set of ops (strings). When a function, it must take a `msg` and return |
37 |
| - truthy value when `handler-fn` should run. When `handle` is missing, |
38 |
| - `handle-fn` is called when :op of `msg` is in the set of keys of the :handles |
39 |
| - slot of the `descriptor`. When `handle` is a set it should contain extra ops, |
40 |
| - besides those in :handles, on which `handle-fn` is triggered. `descriptor` is |
41 |
| - passed to nREPLs `set-descriptor!`." |
42 |
| - [name handler-fn & [handle descriptor]] |
43 |
| - (let [[descriptor handle] (if descriptor [descriptor handle] [handle descriptor]) |
44 |
| - handle (eval handle) |
| 38 | + expressed by the optional `trigger-it` argument. `trigger-it` can be either a |
| 39 | + function or a set of ops (strings). When a function, it must take a `msg` and |
| 40 | + return truthy value when `handler-fn` should run. When `trigger-it` is missing, |
| 41 | + `handle-fn` is called when :op of `msg` is one of keys of the :handles slot of |
| 42 | + the `descriptor`. When `trigger-it` is a set it should contain extra ops, |
| 43 | + besides those in :handles slot, on which `handle-fn` is |
| 44 | + triggered. `descriptor` is passed directly to the nREPLs `set-descriptor!`." |
| 45 | + [name handler-fn & [trigger-it descriptor]] |
| 46 | + (let [[descriptor trigger-it] (if descriptor |
| 47 | + [descriptor trigger-it] |
| 48 | + [trigger-it descriptor]) |
| 49 | + trigger-it (eval trigger-it) |
45 | 50 | descriptor (eval descriptor)
|
46 |
| - cond (if (or (nil? handle) (set? handle)) |
47 |
| - (let [ops-set (into (-> descriptor :handles keys set) handle)] |
| 51 | + cond (if (or (nil? trigger-it) (set? trigger-it)) |
| 52 | + (let [ops-set (into (-> descriptor :handles keys set) trigger-it)] |
48 | 53 | `(~ops-set (:op ~'msg)))
|
49 |
| - `(~handle ~'msg)) |
| 54 | + `(~trigger-it ~'msg)) |
50 | 55 | doc (or (:doc descriptor) "")]
|
51 | 56 | (assert descriptor)
|
52 | 57 | `(do
|
53 | 58 | (defn ~name ~doc [~'h]
|
54 | 59 | (fn [~'msg]
|
55 | 60 | (if (and ~cond (not (:inhibit-cider-middleware ~'msg)))
|
56 |
| - (run-delayed-handler ~handler-fn ~'h ~'msg) |
| 61 | + (run-deferred-handler ~handler-fn ~'h ~'msg) |
57 | 62 | (~'h ~'msg))))
|
58 | 63 | (set-descriptor! #'~name ~descriptor))))
|
59 | 64 |
|
|
0 commit comments