Skip to content

Commit ede37b5

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-2243: Self-host: Add support for :global-exports
also cleanup some variable accesses in `cljs.compiler/load-libs`
1 parent a29e19d commit ede37b5

File tree

3 files changed

+102
-16
lines changed

3 files changed

+102
-16
lines changed

src/main/cljs/cljs/js.cljs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,17 @@
584584
(ana/munge-node-lib dep)
585585
" = require('" dep "');")))))
586586

587+
(defn- global-exports-side-effects
588+
[bound-vars sb deps ns-name]
589+
(let [{:keys [js-dependency-index]} @(:*compiler* bound-vars)]
590+
(doseq [dep deps]
591+
(let [{:keys [global-exports]} (get js-dependency-index (name dep))]
592+
(.append sb
593+
(with-out-str
594+
(comp/emitln (munge ns-name) "."
595+
(ana/munge-global-export dep)
596+
" = goog.global." (get global-exports (symbol dep)) ";")))))))
597+
587598
(defn- analyze-str* [bound-vars source name opts cb]
588599
(let [rdr (rt/indexing-push-back-reader source 1 name)
589600
eof (js-obj)
@@ -735,11 +746,15 @@
735746
(fn [res]
736747
(if (:error res)
737748
(cb res)
738-
(let [sb (StringBuffer.)]
749+
(let [ns-name (:name ast)
750+
sb (StringBuffer.)]
739751
(.append sb
740-
(with-out-str (comp/emitln (str "goog.provide(\"" (comp/munge (:name ast)) "\");"))))
752+
(with-out-str (comp/emitln (str "goog.provide(\"" (comp/munge ns-name) "\");"))))
741753
(when-not (nil? node-deps)
742-
(node-side-effects bound-vars sb node-deps (:name ast)))
754+
(node-side-effects bound-vars sb node-deps ns-name))
755+
(global-exports-side-effects bound-vars sb
756+
(filter ana/dep-has-global-exports? (:deps ast))
757+
ns-name)
743758
(cb {:value (*eval-fn* {:source (.toString sb)})})))))
744759
(let [src (with-out-str (comp/emit ast))]
745760
(cb {:value (*eval-fn* {:source src})})))))))))
@@ -850,9 +865,12 @@
850865
(fn [res]
851866
(if (:error res)
852867
(cb res)
853-
(do
868+
(let [ns-name (:name ast)]
854869
(when-not (nil? node-deps)
855-
(node-side-effects bound-vars sb node-deps (:name ast)))
870+
(node-side-effects bound-vars sb node-deps ns-name))
871+
(global-exports-side-effects bound-vars sb
872+
(filter ana/dep-has-global-exports? (:deps ast))
873+
ns-name)
856874
(compile-loop (:name ast))))))
857875
(recur ns)))))
858876
(do
@@ -981,9 +999,12 @@
981999
(fn [res]
9821000
(if (:error res)
9831001
(cb res)
984-
(do
1002+
(let [ns-name (:name ast)]
9851003
(when-not (nil? node-deps)
986-
(node-side-effects bound-vars sb node-deps (:name ast)))
1004+
(node-side-effects bound-vars sb node-deps ns-name))
1005+
(global-exports-side-effects bound-vars sb
1006+
(filter ana/dep-has-global-exports? (:deps ast))
1007+
ns-name)
9871008
(compile-loop ns'))))))
9881009
(do
9891010
(.append sb (with-out-str (comp/emit ast)))

src/main/clojure/cljs/compiler.cljc

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,15 +1062,16 @@
10621062

10631063
(defn load-libs
10641064
[libs seen reloads deps ns-name]
1065-
(let [{:keys [target optimizations]} (get @env/*compiler* :options)
1065+
(let [{:keys [options js-dependency-index]} @env/*compiler*
1066+
{:keys [target optimizations]} options
10661067
loaded-libs (munge 'cljs.core.*loaded-libs*)
10671068
loaded-libs-temp (munge (gensym 'cljs.core.*loaded-libs*))
10681069
[node-libs libs-to-load] (let [libs (remove (set (vals seen)) (filter (set (vals libs)) deps))]
10691070
(if (= :nodejs target)
10701071
(let [{node-libs true libs-to-load false} (group-by ana/node-module-dep? libs)]
10711072
[node-libs libs-to-load])
10721073
[nil libs]))
1073-
{global-exports-libs true, libs-to-load false} (group-by ana/dep-has-global-exports? libs-to-load)]
1074+
{global-exports-libs true libs-to-load false} (group-by ana/dep-has-global-exports? libs-to-load)]
10741075
(when (-> libs meta :reload-all)
10751076
(emitln "if(!COMPILED) " loaded-libs-temp " = " loaded-libs " || cljs.core.set();")
10761077
(emitln "if(!COMPILED) " loaded-libs " = cljs.core.set();"))
@@ -1082,17 +1083,15 @@
10821083
(when (= :none optimizations)
10831084
(if (= :nodejs target)
10841085
;; under node.js we load foreign libs globally
1085-
(let [{:keys [js-dependency-index options]} @env/*compiler*
1086-
ijs (get js-dependency-index (name lib))]
1086+
(let [ijs (get js-dependency-index (name lib))]
10871087
(emitln "cljs.core.load_file(\""
10881088
(str (io/file (util/output-directory options) (or (deps/-relative-path ijs)
10891089
(util/relative-name (:url ijs)))))
10901090
"\");"))
10911091
(emitln "goog.require('" (munge lib) "');")))]
10921092
:cljs
10931093
[(and (ana/foreign-dep? lib)
1094-
(when-let [{:keys [optimizations]} (get @env/*compiler* :options)]
1095-
(not (keyword-identical? optimizations :none))))
1094+
(not (keyword-identical? optimizations :none)))
10961095
nil])
10971096

10981097
(or (-> libs meta :reload)
@@ -1110,11 +1109,10 @@
11101109
(ana/munge-node-lib lib)
11111110
" = require('" lib "');"))
11121111
(doseq [lib global-exports-libs]
1113-
(let [{:keys [js-dependency-index options]} @env/*compiler*
1114-
ijs (get js-dependency-index (name lib))]
1112+
(let [{:keys [global-exports]} (get js-dependency-index (name lib))]
11151113
(emitln (munge ns-name) "."
11161114
(ana/munge-global-export lib)
1117-
" = goog.global." (get (:global-exports ijs) (symbol lib)) ";")))
1115+
" = goog.global." (get global-exports (symbol lib)) ";")))
11181116
(when (-> libs meta :reload-all)
11191117
(emitln "if(!COMPILED) " loaded-libs " = cljs.core.into(" loaded-libs-temp ", " loaded-libs ");"))))
11201118

src/test/self/self_host/test.cljs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,73 @@
976976
(is (= value "bar"))
977977
(inc! l)))))))))
978978

979+
(deftest test-global-exports-cljs-2243
980+
(async done
981+
(let [calculator-load (fn [_ cb]
982+
(cb {:lang :js
983+
:source "global.Calculator = {
984+
add: function (a, b) {
985+
return a + b;
986+
},
987+
subtract: function (a, b) {
988+
return a - b;
989+
}
990+
};"}))
991+
st (cljs/empty-state)
992+
l (latch 4 done)]
993+
(swap! st assoc :js-dependency-index {"calculator" {:global-exports '{calculator Calculator}}})
994+
(cljs/compile-str
995+
(atom @st)
996+
"(ns foo.core (:require [calculator]))"
997+
nil
998+
{:context :expr
999+
:load calculator-load
1000+
:eval node-eval}
1001+
(fn [{:keys [error value] :as m}]
1002+
(is (nil? error))
1003+
(is (some? (re-find #"foo\.core\.global\$module\$calculator = goog.global.Calculator;" value)))
1004+
(inc! l)))
1005+
(cljs/eval-str
1006+
(atom @st)
1007+
"(ns foo.core (:require [calculator])) (calculator/add 1 2)"
1008+
nil
1009+
{:context :expr
1010+
:load calculator-load
1011+
:eval node-eval}
1012+
(fn [{:keys [error value] :as m}]
1013+
(is (nil? error))
1014+
(is (= value 3))
1015+
(inc! l)))
1016+
(cljs/analyze-str
1017+
(atom @st)
1018+
"(ns foo.core (:require [calculator]))"
1019+
nil
1020+
{:context :expr
1021+
:load calculator-load}
1022+
(fn [{:keys [error value] :as m}]
1023+
(is (nil? error))
1024+
(is (= (:deps value) '[calculator]))
1025+
(inc! l)))
1026+
(let [st (atom @st)]
1027+
(cljs/eval
1028+
st
1029+
'(ns foo.core (:require [calculator]))
1030+
{:context :expr
1031+
:load calculator-load
1032+
:eval node-eval}
1033+
(fn [{:keys [error value] :as m}]
1034+
(is (nil? error))
1035+
(cljs/eval
1036+
st
1037+
'(calculator/add 1 2)
1038+
{:context :expr
1039+
:ns 'foo.core
1040+
:eval node-eval}
1041+
(fn [{:keys [error value]}]
1042+
(is (nil? error))
1043+
(is (= value 3))
1044+
(inc! l)))))))))
1045+
9791046
(defn -main [& args]
9801047
(run-tests))
9811048

0 commit comments

Comments
 (0)