Skip to content

Commit a6ff1a7

Browse files
committed
dump / restore cljs.spec.alpha/registry-ref to / from analysis caches
1 parent 7de5a02 commit a6ff1a7

File tree

1 file changed

+28
-17
lines changed

1 file changed

+28
-17
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3556,36 +3556,47 @@
35563556
(util/changed? src cache)))))))
35573557

35583558
#?(:clj
3559-
(defn- get-speced-vars
3559+
(defn- get-spec-vars
35603560
[]
35613561
(when-let [spec-ns (find-ns 'cljs.spec.alpha)]
3562-
(ns-resolve spec-ns '_speced_vars)))
3562+
{:registry-ref (ns-resolve spec-ns 'registry-ref)
3563+
:speced-vars (ns-resolve spec-ns '_speced_vars)}))
35633564
:cljs
3564-
;; Here, we look up the symbol '-speced-vars because ns-interns*
3565-
;; is implemented by invoking demunge on the result of js-keys.
3566-
(let [cached-var (delay (get (ns-interns* 'cljs.spec.alpha$macros) '-speced-vars))]
3567-
(defn- get-speced-vars []
3565+
(let [registry-ref (delay (get (ns-interns* 'cljs.spec.alpha$macros) 'registry-ref))
3566+
;; Here, we look up the symbol '-speced-vars because ns-interns*
3567+
;; is implemented by invoking demunge on the result of js-keys.
3568+
speced-vars (delay (get (ns-interns* 'cljs.spec.alpha$macros) '-speced-vars))]
3569+
(defn- get-spec-vars []
35683570
(when (some? (find-ns-obj 'cljs.spec.alpha$macros))
3569-
@cached-var))))
3571+
{:registry-ref @registry-ref
3572+
:speced-vars @speced-vars}))))
35703573

35713574
(defn dump-specs
35723575
"Dumps registered speced vars for a given namespace into the compiler
35733576
environment."
35743577
[ns]
3575-
(when-let [speced-vars (get-speced-vars)]
3576-
(let [ns-str (str ns)]
3577-
(swap! env/*compiler* update-in [::namespaces ns :cljs.spec/speced-vars]
3578-
(fnil into #{}) (filter #(= ns-str (namespace %))) @@speced-vars))))
3578+
(let [spec-vars (get-spec-vars)
3579+
ns-str (str ns)]
3580+
(swap! env/*compiler* update-in [::namespaces ns]
3581+
merge
3582+
(when-let [registry-ref (:registry-ref spec-vars)]
3583+
{:cljs.spec/registry-ref (into [] (filter (fn [[k _]] (= ns-str (namespace k)))) @@registry-ref)})
3584+
(when-let [speced-vars (:speced-vars spec-vars)]
3585+
{:cljs.spec/speced-vars (into [] (filter #(= ns-str (namespace %))) @@speced-vars)}))))
35793586

35803587
(defn register-specs
35813588
"Registers speced vars found in a namespace analysis cache."
35823589
[cached-ns]
3583-
(when-let [vars (seq (:cljs.spec/speced-vars cached-ns))]
3584-
#?(:clj (try
3585-
(require 'cljs.spec.alpha)
3586-
(catch Throwable t)))
3587-
(when-let [speced-vars (get-speced-vars)]
3588-
(swap! @speced-vars into vars))))
3590+
#?(:clj (try
3591+
(require 'cljs.spec.alpha)
3592+
(catch Throwable t)))
3593+
(let [{:keys [registry-ref speced-vars]} (get-spec-vars)]
3594+
(when-let [registry (seq (:cljs.spec/registry-ref cached-ns))]
3595+
(when registry-ref
3596+
(swap! @registry-ref merge registry)))
3597+
(when-let [vars (seq (:cljs.spec/speced-vars cached-ns))]
3598+
(when speced-vars
3599+
(swap! @speced-vars into vars)))))
35893600

35903601
#?(:clj
35913602
(defn write-analysis-cache

0 commit comments

Comments
 (0)