-
-
Notifications
You must be signed in to change notification settings - Fork 149
/
test_tree.clj
54 lines (50 loc) · 2.38 KB
/
test_tree.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
44
45
46
47
48
49
50
51
52
53
54
(ns clojure-lsp.feature.test-tree
(:require
[clojure-lsp.queries :as q]
[clojure-lsp.shared :as shared]))
(set! *warn-on-reflection* true)
(defn ^:private ->testings-children [testings]
(let [root-testings (remove (fn [testing]
(some #(and (shared/inside? testing %)
(not= % testing)) testings))
testings)]
(mapv (fn [root-testing]
(let [inside-testings (filter (fn [testing]
(and (shared/inside? testing root-testing)
(not= testing root-testing)))
testings)]
(shared/assoc-some
{:name (str
(or (-> root-testing :context :clojure.test :testing-str) ;; not always a string
""))
:range (shared/->scope-range root-testing)
:name-range (shared/->range root-testing)
:kind :testing}
:children (when (seq inside-testings) (->testings-children inside-testings)))))
root-testings)))
(defn ^:private deftest->tree [deftest testings]
(let [local-testings (filter #(shared/inside? % deftest) testings)]
{:name (str (:name deftest))
:range (shared/->scope-range deftest)
:name-range (shared/->range deftest)
:kind :deftest
:children (->testings-children local-testings)}))
(defn tree [uri db]
(let [ns-element (q/find-namespace-definition-by-uri db uri)
local-buckets (get-in db [:analysis uri])
deftests (into []
(filter #(contains? '#{clojure.test/deftest cljs.test/deftest}
(:defined-by %)))
(:var-definitions local-buckets))
testings (into []
(filter #(and (= 'testing (:name %))
(contains? '#{clojure.test cljs.test} (:to %))))
(:var-usages local-buckets))
tests-tree (mapv #(deftest->tree % testings) deftests)]
(when (seq tests-tree)
{:uri uri
:tree {:name (str (:name ns-element))
:range (shared/->scope-range ns-element)
:name-range (shared/->range ns-element)
:kind :namespace
:children tests-tree}})))