|
6 | 6 | [orchard.misc :as misc]
|
7 | 7 | [orchard.query :as query])
|
8 | 8 | (:import
|
9 |
| - [clojure.lang MultiFn])) |
| 9 | + (clojure.lang MultiFn Var))) |
10 | 10 |
|
11 | 11 | ;;; ## Overview
|
12 | 12 | ;;
|
|
17 | 17 |
|
18 | 18 | ;;; ## Symbol Search
|
19 | 19 |
|
20 |
| -(defn- safe-comparator [x y] |
21 |
| - (compare (pr-str x) (pr-str y))) |
| 20 | +(defn- priority-ns? [ns] |
| 21 | + (some-> ns ns-name name (.startsWith "clojure."))) |
22 | 22 |
|
23 |
| -(defn- default-comparator [ns clojure-ns?] |
24 |
| - (fn [x y] |
| 23 | +(defn- default-comparator [this-ns] |
| 24 | + (fn [^Var x, ^Var y] |
25 | 25 | (cond
|
26 | 26 | (= x y) 0
|
27 | 27 | (nil? x) 1
|
28 | 28 | (nil? y) -1
|
29 |
| - (= x ns) -1 |
30 |
| - (= y ns) 1 |
31 |
| - (and (clojure-ns? x) (not (clojure-ns? y))) -1 |
32 |
| - (and (clojure-ns? y) (not (clojure-ns? x))) 1 |
33 |
| - :else (safe-comparator x y)))) |
| 29 | + :else |
| 30 | + (let [ns1 (when (instance? Var x) (.ns ^Var x)) |
| 31 | + ns2 (when (instance? Var y) (.ns ^Var y)) |
| 32 | + ;; First, vars from the namespace `this-ns`. |
| 33 | + ;; Then, vars from "priority" namespaces (everything from clojure.*) |
| 34 | + ;; Finally, all the rest. |
| 35 | + prio-ns1 (cond (and this-ns (= ns1 this-ns)) 0 |
| 36 | + (priority-ns? ns1) 1 |
| 37 | + :else 2) |
| 38 | + prio-ns2 (cond (and this-ns (= ns2 this-ns)) 0 |
| 39 | + (priority-ns? ns2) 1 |
| 40 | + :else 2) |
| 41 | + c (compare prio-ns1 prio-ns2)] |
| 42 | + (if (zero? c) |
| 43 | + (compare (str x) (str y)) |
| 44 | + c))))) |
34 | 45 |
|
35 | 46 | (defn apropos-sort
|
36 | 47 | "Return a list of vars, ordered with `ns` first,
|
|
39 | 50 | [ns vars]
|
40 | 51 | (assert (every? (some-fn class? var? symbol?) vars)
|
41 | 52 | (pr-str vars))
|
42 |
| - (let [clojure-ns? #(.startsWith (str (ns-name %)) "clojure.") |
43 |
| - key-fn (comp :ns meta)] |
44 |
| - ;; https://clojure.org/guides/comparators |
45 |
| - (try |
46 |
| - (sort-by key-fn (default-comparator ns clojure-ns?) vars) |
47 |
| - ;; Handle https://github.com/clojure-emacs/orchard/issues/128 |
48 |
| - (catch IllegalArgumentException e |
49 |
| - (when (System/getProperty "orchard.internal.test-suite-running") |
50 |
| - ;; Don't accept this exception in our CI - we should fix this if it's reproducible. |
51 |
| - (throw e)) |
52 |
| - ;; Fallback to a simpler comparator: |
53 |
| - (sort-by key-fn safe-comparator vars))))) |
| 53 | + ;; https://clojure.org/guides/comparators |
| 54 | + (sort (default-comparator ns) vars)) |
54 | 55 |
|
55 | 56 | (defn find-symbols
|
56 | 57 | "Takes a map and returns a list of maps containing name, doc and type.
|
|
0 commit comments