Skip to content

Commit 09d5969

Browse files
mfikesswannodette
authored andcommitted
CLJS-1854: Self-host: Reload ns with const
1 parent cea2371 commit 09d5969

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

src/main/cljs/cljs/js.cljs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,17 @@
234234
(dissoc opts :macros-ns)
235235
cb))
236236

237-
(defn post-file-side-effects
237+
(defn- pre-file-side-effects
238+
[st name file opts]
239+
(when (:verbose opts)
240+
(debug-prn "Pre-file side-effects" file))
241+
;; In case any constants are defined in the namespace, flush any analysis metadata
242+
;; so that the constants can be defined wihtout triggering re-defined errors.
243+
(when (and (get-in @st [::ana/namespaces name :defs])
244+
(not ('#{cljs.core cljs.core$macros} name)))
245+
(swap! st update ::ana/namespaces dissoc name)))
246+
247+
(defn- post-file-side-effects
238248
[file opts]
239249
(when (:verbose opts)
240250
(debug-prn "Post-file side-effects" file))
@@ -279,14 +289,16 @@
279289
(if resource
280290
(let [{:keys [lang source cache source-map file]} resource]
281291
(condp = lang
282-
:clj (eval-str* bound-vars source name (assoc opts :cljs-file file)
283-
(fn [res]
284-
(post-file-side-effects file opts)
285-
(if (:error res)
286-
(cb res)
287-
(do
288-
(swap! *loaded* conj aname)
289-
(cb {:value true})))))
292+
:clj (do
293+
(pre-file-side-effects (:*compiler* bound-vars) aname file opts)
294+
(eval-str* bound-vars source name (assoc opts :cljs-file file)
295+
(fn [res]
296+
(post-file-side-effects file opts)
297+
(if (:error res)
298+
(cb res)
299+
(do
300+
(swap! *loaded* conj aname)
301+
(cb {:value true}))))))
290302
:js (process-macros-deps bound-vars cache opts
291303
(fn [res]
292304
(if (:error res)
@@ -416,12 +428,14 @@
416428
(if resource
417429
(let [{:keys [name lang source file]} resource]
418430
(condp = lang
419-
:clj (analyze-str* bound-vars source name (assoc opts :cljs-file file)
420-
(fn [res]
421-
(post-file-side-effects file opts)
422-
(if-not (:error res)
423-
(analyze-deps bound-vars ana-env lib (next deps) opts cb)
424-
(cb res))))
431+
:clj (do
432+
(pre-file-side-effects (:*compiler* bound-vars) name file opts)
433+
(analyze-str* bound-vars source name (assoc opts :cljs-file file)
434+
(fn [res]
435+
(post-file-side-effects file opts)
436+
(if-not (:error res)
437+
(analyze-deps bound-vars ana-env lib (next deps) opts cb)
438+
(cb res)))))
425439
:js (analyze-deps bound-vars ana-env lib (next deps) opts cb)
426440
(wrap-error
427441
(ana/error ana-env

src/test/self/self_host/test.cljs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,54 @@
850850
(fn [{:keys [value error]}]
851851
(is (= value [6 6]))))))))
852852

853+
(deftest test-cljs-1854
854+
(let [st (cljs/empty-state)]
855+
(cljs/eval st
856+
'(require 'foo.core1854)
857+
{:eval node-eval
858+
:context :expr
859+
:load (fn [_ cb] (cb {:lang :clj :source "(ns foo.core1854) (def ^:const x 1)"}))}
860+
(fn [{:keys [value error]}]
861+
(is (nil? error))
862+
(cljs/eval st
863+
'foo.core1854/x
864+
{:eval node-eval
865+
:context :expr}
866+
(fn [{:keys [value error]}]
867+
(is (nil? error))
868+
(is (= value 1))))
869+
(cljs/eval st
870+
'(require 'foo.core1854 :reload)
871+
{:eval node-eval
872+
:context :expr
873+
:load (fn [_ cb] (cb {:lang :clj :source "(ns foo.core1854) (def ^:const x 2)"}))}
874+
(fn [{:keys [value error]}]
875+
(is (nil? error))
876+
(cljs/eval st
877+
'foo.core1854/x
878+
{:eval node-eval
879+
:context :expr}
880+
(fn [{:keys [value error]}]
881+
(is (nil? error))
882+
(is (= value 2))))
883+
(cljs/eval st
884+
'(require 'bar.core1854 :reload-all)
885+
{:eval node-eval
886+
:context :expr
887+
:load (fn [{:keys [name]} cb]
888+
(case name
889+
bar.core1854 (cb {:lang :clj :source "(ns bar.core1854 (:require [foo.core1854]))"})
890+
foo.core1854 (cb {:lang :clj :source "(ns foo.core1854) (def ^:const x 3)"})))}
891+
(fn [{:keys [value error]}]
892+
(is (nil? error))
893+
(cljs/eval st
894+
'foo.core1854/x
895+
{:eval node-eval
896+
:context :expr}
897+
(fn [{:keys [value error]}]
898+
(is (nil? error))
899+
(is (= value 3))))))))))))
900+
853901
(deftest test-cljs-1874
854902
(async done
855903
(let [st (cljs/empty-state)

0 commit comments

Comments
 (0)