-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
namespace.clj
43 lines (35 loc) · 1.51 KB
/
namespace.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(ns clj-holmes.logic.namespace
(:require [clojure.tools.namespace.parse :refer [name-from-ns-decl ns-decl?]])
(:import (clojure.lang PersistentList PersistentVector)))
; private
(defn ^:private require-form? [form]
(and (seq? form)
(-> form first (= :require))))
(defn ^:private index-of ^long [^PersistentVector forms
^PersistentList ns-declaration]
(.indexOf forms ns-declaration))
(defn ^:private index-of-ns-declaration [forms ns-declaration]
(inc (index-of forms ns-declaration)))
(defn ^:private is-expected-require? [requires]
(filter #(and (coll? %)
(= (second %) :as)) requires))
; public
(defn find-ns-declaration [forms]
(when-let [ns-declaration (first (filter ns-decl? forms))]
(with-meta ns-declaration {:index (index-of-ns-declaration forms ns-declaration)})))
(defn name-from-ns-declaration [form]
(if (ns-decl? form)
(or (name-from-ns-decl form) 'user)
'user))
(defn requires [ns-declaration]
(when (ns-decl? ns-declaration)
(let [filter-map (comp (filter require-form?) (map rest) (filter is-expected-require?))]
(transduce filter-map concat ns-declaration))))
(defn extract-parent-name-from-form-definition-function
"Extracts the symbol name from a function definition like def, defn, defmacro and others"
[form ns-name]
(let [form-name (when (and (list? form)
(-> form second symbol?))
(-> form second name))]
(when form-name
(keyword (name ns-name) form-name))))