|
| 1 | +(ns taoensso.encore-hooks |
| 2 | + "I don't personally use clj-kondo, so these hooks are |
| 3 | + kindly authored and maintained by contributors. |
| 4 | + PRs very welcome! - Peter Taoussanis" |
| 5 | + (:refer-clojure :exclude [defonce]) |
| 6 | + (:require |
| 7 | + [clj-kondo.hooks-api :as hooks])) |
| 8 | + |
| 9 | +(defn defalias |
| 10 | + [{:keys [node]}] |
| 11 | + (let [[alias src-raw _attrs body] (rest (:children node)) |
| 12 | + src (or src-raw alias) |
| 13 | + sym (if src-raw (hooks/sexpr alias) (symbol (name (hooks/sexpr src))))] |
| 14 | + {:node |
| 15 | + (with-meta |
| 16 | + (hooks/list-node |
| 17 | + [(hooks/token-node 'def) |
| 18 | + (hooks/token-node sym) |
| 19 | + (if body |
| 20 | + (hooks/list-node |
| 21 | + ;; use :body in the def to avoid unused import/private var warnings |
| 22 | + [(hooks/token-node 'or) body src]) |
| 23 | + src)]) |
| 24 | + (meta src))})) |
| 25 | + |
| 26 | +(defn defaliases |
| 27 | + [{:keys [node]}] |
| 28 | + (let [alias-nodes (rest (:children node))] |
| 29 | + {:node |
| 30 | + (hooks/list-node |
| 31 | + (into |
| 32 | + [(hooks/token-node 'do)] |
| 33 | + (map |
| 34 | + (fn alias->defalias [alias-node] |
| 35 | + (cond |
| 36 | + (hooks/token-node? alias-node) |
| 37 | + (hooks/list-node |
| 38 | + [(hooks/token-node 'taoensso.encore/defalias) |
| 39 | + alias-node]) |
| 40 | + |
| 41 | + (hooks/map-node? alias-node) |
| 42 | + (let [{:keys [src alias attrs body]} (hooks/sexpr alias-node) |
| 43 | + ;; workaround as can't seem to (get) using a token-node |
| 44 | + ;; and there's no update-keys (yet) in sci apparently |
| 45 | + [& {:as node-as-map}] (:children alias-node) |
| 46 | + {:keys [attrs body]} (zipmap (map hooks/sexpr (keys node-as-map)) |
| 47 | + (vals node-as-map))] |
| 48 | + (hooks/list-node |
| 49 | + [(hooks/token-node 'taoensso.encore/defalias) |
| 50 | + (or alias src) (hooks/token-node src) attrs body]))))) |
| 51 | + alias-nodes))})) |
| 52 | + |
| 53 | +(defn defn-cached |
| 54 | + [{:keys [node]}] |
| 55 | + (let [[sym _opts binding-vec & body] (rest (:children node))] |
| 56 | + {:node |
| 57 | + (hooks/list-node |
| 58 | + (list |
| 59 | + (hooks/token-node 'def) |
| 60 | + sym |
| 61 | + (hooks/list-node |
| 62 | + (list* |
| 63 | + (hooks/token-node 'fn) |
| 64 | + binding-vec |
| 65 | + body))))})) |
| 66 | + |
| 67 | +(defn defonce |
| 68 | + [{:keys [node]}] |
| 69 | + ;; args = [sym doc-string? attr-map? init-expr] |
| 70 | + (let [[sym & args] (rest (:children node)) |
| 71 | + [doc-string args] (if (and (hooks/string-node? (first args)) (next args)) [(hooks/sexpr (first args)) (next args)] [nil args]) |
| 72 | + [attr-map init-expr] (if (and (hooks/map-node? (first args)) (next args)) [(hooks/sexpr (first args)) (fnext args)] [nil (first args)]) |
| 73 | + |
| 74 | + attr-map (if doc-string (assoc attr-map :doc doc-string) attr-map) |
| 75 | + sym+meta (if attr-map (with-meta sym attr-map) sym) |
| 76 | + rewritten |
| 77 | + (hooks/list-node |
| 78 | + [(hooks/token-node 'clojure.core/defonce) |
| 79 | + sym+meta |
| 80 | + init-expr])] |
| 81 | + |
| 82 | + {:node rewritten})) |
0 commit comments