-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
case_symbols.clj
27 lines (22 loc) · 906 Bytes
/
case_symbols.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(ns case-symbols
{:doc "This example searches for usages of case with symbol constants"}
(:require [clojure.pprint :as pprint]
[clojure.spec.alpha :as s]
[grasp.api :as grasp :refer [grasp]]))
(s/def ::case (s/cat :case #{'case} :test any? :body (s/* any?)))
(defn case-body-with-symbols [case-body]
(let [body-count (count case-body)
body (if (even? body-count)
case-body
;; skip default case
(butlast case-body))]
(when (seq (filter symbol? (take-nth 2 body)))
case-body)))
(defn keep-fn [{:keys [spec expr uri]}]
(let [conformed (s/conform spec expr)]
(when-not (s/invalid? conformed)
(when (case-body-with-symbols (:body conformed))
(assoc (meta expr) :uri uri)))))
(def matches
(grasp (System/getProperty "java.class.path") ::case {:keep-fn keep-fn}))
(pprint/print-table matches)