Skip to content

Instantly share code, notes, and snippets.

@gfredericks
Created June 15, 2013 19:38
Show Gist options
  • Save gfredericks/5789305 to your computer and use it in GitHub Desktop.
Save gfredericks/5789305 to your computer and use it in GitHub Desktop.
A Clojure function which, given a filename, returns a map from vars to sets of referenced vars.
(defn usages
[filename]
(let [forms (-> filename
slurp
(->> (format "(%s)"))
read-string)
analyses (map clojure.tools.analyzer/analyze-form forms)
defs (filter (comp #{:def} :op) analyses)]
(into {}
(for [def defs
:let [refs (->> def
(tree-seq coll? #(if (map? %) (vals %) %))
(filter (comp #{:var} :op))
(map :var)
(set))]]
[(:var def) refs]))))
(usages "this/file.clj")
;; =>
;;
;; {#'this.ns/usages
;; #{#'clojure.core/cons #'clojure.core/into #'clojure.core/chunk #'clojure.core/vals
;; #'clojure.core/chunk-rest #'clojure.core/read-string #'clojure.core/coll?
;; #'clojure.core/chunk-cons #'clojure.core/slurp #'clojure.core/comp
;; #'clojure.core/map #'clojure.core/chunk-buffer #'clojure.core/chunk-first
;; #'clojure.core/map? #'clojure.core/seq #'clojure.core/format #'clojure.core/rest
;; #'clojure.core/chunked-seq? #'clojure.core/first #'clojure.core/filter
;; #'clojure.core/chunk-append #'clojure.core/tree-seq
;; #'clojure.tools.analyzer/analyze-form}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment