File tree Expand file tree Collapse file tree 2 files changed +21
-9
lines changed Expand file tree Collapse file tree 2 files changed +21
-9
lines changed Original file line number Diff line number Diff line change 57
57
{:added " 0.5" }
58
58
[v]
59
59
(when-let [^clojure.lang.AFn v (to-fn v)]
60
- (let [f-class-name (-> v .getClass .getName)]
61
- ; ; this uses the implementation detail that the clojure compiler always
62
- ; ; prefixes names of lambdas with the name of its surrounding function class
63
- (into #{} (comp (filter (fn [[k _v]] (clojure.string/includes? k f-class-name)))
64
- (map (fn [[_k value]] (.get ^java.lang.ref.Reference value)))
65
- (mapcat fn-deps-class))
66
- class-cache))))
60
+ (let [f-class-name (-> v .getClass .getName)
61
+ ; ; this uses the implementation detail that the clojure compiler always
62
+ ; ; prefixes names of lambdas with the name of its surrounding function class
63
+ deps (into #{} (comp (filter (fn [[k _v]] (clojure.string/includes? k f-class-name)))
64
+ (map (fn [[_k value]] (.get ^java.lang.ref.Reference value)))
65
+ (mapcat fn-deps-class))
66
+ class-cache)]
67
+ ; ; if there's no deps the class is most likely AoT compiled,
68
+ ; ; try to access it directly
69
+ (if (empty? deps)
70
+ (-> v .getClass fn-deps-class)
71
+ deps))))
67
72
68
73
(defn fn-transitive-deps
69
74
" Returns a set with all the functions invoked inside `v` or inside those functions.
Original file line number Diff line number Diff line change 24
24
(testing " with a symbol"
25
25
(is (= (xref/fn-deps 'orchard.xref-test/dummy-fn)
26
26
#{#'clojure.core/map #'clojure.core/filter
27
- #'clojure.core/even? #'clojure.core/range #'orchard.xref-test/fn-dep}))))
27
+ #'clojure.core/even? #'clojure.core/range #'orchard.xref-test/fn-dep})))
28
+ (testing " AoT compiled functions return deps"
29
+ (is (= #{#'clojure.core/conj}
30
+ (xref/fn-deps reverse)))))
28
31
29
32
; ; The mere presence of this var can reproduce a certain issue. See:
30
33
; ; https://github.com/clojure-emacs/orchard/issues/135#issuecomment-939731698
52
55
(testing " basics"
53
56
(let [expected #{#'orchard.xref-test/fn-deps-test #'orchard.xref-test/fn-dep #'clojure.core/even?
54
57
#'clojure.core/filter #'orchard.xref-test/fn-transitive-dep #'clojure.core/map
55
- #'clojure.test/test-var #'clojure.core/range}]
58
+ #'clojure.test/test-var #'clojure.core/range #'clojure.core/inc' }]
56
59
(is (contains? expected #'orchard.xref-test/fn-transitive-dep)
57
60
" Specifically includes `#'fn-transitive-dep`, which is a transitive dep of `#'dummy-fn` (via `#'fn-dep`)" )
61
+ (is (contains? expected #'clojure.core/inc')
62
+ " Specifically includes `#'clojure.core/inc'`, which is a transitive dep of `#'dummy-fn`
63
+ (via `#'clojure.core/range'`). Unlike other AoT compiled core transitive dependancies
64
+ it gets found because its a non `:static` dependancy." )
58
65
(is (= expected
59
66
(xref/fn-transitive-deps dummy-fn))))))
You can’t perform that action at this time.
0 commit comments