File tree Expand file tree Collapse file tree 3 files changed +43
-3
lines changed Expand file tree Collapse file tree 3 files changed +43
-3
lines changed Original file line number Diff line number Diff line change 6363 (m/special-sym-meta sym)
6464 ; ; it's a var
6565 (some-> ns (m/resolve-var sym) (m/var-meta var-meta-allowlist))
66+ ; ; it's a munged printed var or .invoke method of a Clojure function
67+ (some-> (m/resolve-munged-printed-var sym) (m/var-meta var-meta-allowlist))
6668 ; ; it's a Java class/constructor/member symbol
6769 (some-> ns (java/resolve-symbol sym))
6870 ; ; it's an alias for another ns
Original file line number Diff line number Diff line change 1111 [orchard.namespace :as ns ]
1212 [orchard.spec :as spec])
1313 (:import
14- (clojure.lang LineNumberingPushbackReader Namespace Var)))
14+ (clojure.lang Compiler LineNumberingPushbackReader Namespace Var)))
1515
1616; ;; ## Extractors
1717
119119 (when-let [ns (find-ns ns )]
120120 (ns-aliases ns )))
121121
122+ (defn resolve-munged-printed-var
123+ " Given a printed munged representation of Clojure function, try to resolve it as
124+ a var. Supports the following representations:
125+ - clojure.core$str
126+ - clojure.core$str.invoke
127+ - clojure.main$repl$fn__9119.invoke (resolves to named var, not internal lambda)
128+ - some.ns$eval1234$closing_over_fn__12345.invoke"
129+ [sym]
130+ (let [demunged (-> (Compiler/demunge (str sym))
131+ (string/replace #"--\d +" " " ))
132+ [_ wo-method] (re-matches #"(.+?)(?:\. (?:invoke|invokeStatic|doInvoke))?"
133+ demunged)
134+ [ns-str name-str] (->> (string/split wo-method #"/" )
135+ (remove #(re-matches #"eval\d +" %)))
136+ ns (some-> ns-str symbol find-ns)
137+ resolved (when (and ns name-str)
138+ (ns-resolve ns (symbol name-str)))]
139+ (when (var? resolved)
140+ resolved)))
141+
122142; ; Even if things like catch or finally aren't clojure special
123143; ; symbols we want to be able to talk about them.
124144; ; They just map to a special symbol.
Original file line number Diff line number Diff line change 191191 (select-keys [:ns :name :arglists :doc ])
192192 (update :ns ns-name))))))))
193193
194+ (let [a 1 ]
195+ (defn- closed-over [] a ))
196+ (closed-over )
197+
198+ (deftest info-munged-printed-var-test
199+ (is (= 'str
200+ (:name (info/info 'orchard.test-ns 'clojure.core$str))))
201+ (is (= 'str
202+ (:name (info/info 'orchard.test-ns 'clojure.core$str.invoke))))
203+ (is (= 'str
204+ (:name (info/info 'orchard.test-ns 'clojure.core$str$fn__12.doInvoke))))
205+ (is (= 'str
206+ (:name (info/info 'orchard.test-ns (symbol " clojure.core/str/fn--12" )))))
207+ (is (= 'closed-over
208+ (:name (info/info 'orchard.test-ns 'orchard.info_test$eval17939$closed_over__17940.invokeStatic))))
209+ (is (= 'closed-over
210+ (:name (info/info 'orchard.test-ns (symbol " orchard.info-test/eval17939/closed_over--17940" ))))))
211+
194212(deftest info-unqualified-sym-and-namespace-test
195213 (testing " Resolution from current namespace"
196214 (when cljs-available?
410428
411429 (when cljs-available?
412430 (testing " - :cljs"
413- (is (= (take 3 ( repeat expected) )
431+ (is (= (repeat 3 expected)
414432 (->> params
415433 (map #(info/info* (merge @*cljs-params* %)))
416434 (map #(select-keys % [:ns :name :arglists :macro :file ])))))))
417435
418436 (testing " - :clj"
419- (is (= [{}, expected, {}]
437+ (is (= ( repeat 3 expected)
420438 (->> params
421439 (map #(info/info* %))
422440 (map #(select-keys % [:ns :name :arglists :macro :file ])))))))))
You can’t perform that action at this time.
0 commit comments