Skip to content

Commit 4b5fd54

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-2354: Self-host: compile-str doesn't handle clojure -> cljs aliasing
1 parent fe28810 commit 4b5fd54

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

src/main/cljs/cljs/js.cljs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,20 @@
423423
(fn [resource]
424424
(assert (or (map? resource) (nil? resource))
425425
"*load-fn* may only return a map or nil")
426-
(if resource
426+
(if-not resource
427+
(if-let [cljs-dep (let [cljs-ns (ana/clj-ns->cljs-ns dep)]
428+
(get {dep nil} cljs-ns cljs-ns))]
429+
(do
430+
(patch-alias-map (:*compiler* bound-vars) lib dep cljs-dep)
431+
(analyze-deps bound-vars ana-env lib (cons cljs-dep (next deps)) opts
432+
(fn [res]
433+
(if (:error res)
434+
(cb res)
435+
(cb (update res :aliased-loads assoc dep cljs-dep))))))
436+
(cb (wrap-error
437+
(ana/error ana-env
438+
(ana/error-message :undeclared-ns
439+
{:ns-sym dep :js-provide (name dep)})))))
427440
(let [{:keys [name lang source file]} resource]
428441
(condp = lang
429442
:clj (do
@@ -437,11 +450,7 @@
437450
:js (analyze-deps bound-vars ana-env lib (next deps) opts cb)
438451
(wrap-error
439452
(ana/error ana-env
440-
(str "Invalid :lang specified " lang ", only :clj or :js allowed")))))
441-
(cb (wrap-error
442-
(ana/error ana-env
443-
(ana/error-message :undeclared-ns
444-
{:ns-sym dep :js-provide (name dep)})))))))
453+
(str "Invalid :lang specified " lang ", only :clj or :js allowed"))))))))
445454
(catch :default cause
446455
(cb (wrap-error
447456
(ana/error ana-env
@@ -494,11 +503,19 @@
494503
(if (some? to)
495504
(assoc acc renamed (symbol (str to) (name qualified-sym)))
496505
(merge acc entry))))
497-
{} m)))]
506+
{} m)))
507+
rewrite-deps (fn [deps]
508+
(into []
509+
(map (fn [dep]
510+
(if-let [new-dep (get smap dep)]
511+
new-dep
512+
dep)))
513+
deps))]
498514
(-> ast
499515
(update uk #(walk/postwalk-replace smap %))
500516
(update rk #(merge smap (walk/postwalk-replace smap %)))
501-
(update renk rewrite-renames)))))
517+
(update renk rewrite-renames)
518+
(update :deps rewrite-deps)))))
502519

503520
(defn- check-macro-autoload-inferring-missing
504521
[{:keys [requires name] :as ast} cenv]
@@ -583,7 +600,7 @@
583600

584601
(and (not load) (:*analyze-deps* bound-vars) (seq (:deps ast)))
585602
(analyze-deps bound-vars ana-env (:name ast) (:deps ast) (dissoc opts :macros-ns)
586-
#(check-uses-and-load-macros % ast))
603+
#(check-uses-and-load-macros % (rewrite-ns-ast ast (:aliased-loads %))))
587604

588605
:else
589606
(check-uses-and-load-macros {:value nil} ast)))
@@ -882,17 +899,19 @@
882899
(let [{node-libs true libs-to-load false} (group-by ana/node-module-dep? (:deps ast))]
883900
[node-libs (assoc ast :deps libs-to-load)])
884901
[nil ast])]
885-
(.append sb (with-out-str (comp/emit ast)))
886902
(if (#{:ns :ns*} (:op ast))
887903
(ns-side-effects bound-vars aenv ast opts
888904
(fn [res]
889905
(if (:error res)
890906
(cb res)
891907
(let [ns-name (:name ast)]
908+
(.append sb (with-out-str (comp/emit (:value res))))
892909
(when-not (nil? node-deps)
893910
(node-side-effects bound-vars sb node-deps ns-name (:def-emits-var opts)))
894911
(compile-loop (:name ast))))))
895-
(recur ns)))))
912+
(do
913+
(.append sb (with-out-str (comp/emit ast)))
914+
(recur ns))))))
896915
(do
897916
(when (:source-map opts)
898917
(append-source-map env/*compiler*

src/test/self/self_host/test.cljs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1094,7 +1094,7 @@
10941094
(deftest test-cljs-2287
10951095
(async done
10961096
(let [st (cljs/empty-state)
1097-
l (latch 1 done)]
1097+
l (latch 2 done)]
10981098
(cljs/eval-str
10991099
(atom @st)
11001100
"(ns foo.core (:require [path]))"
@@ -1212,6 +1212,22 @@
12121212
(is (nil? error))
12131213
(inc! l))))))))
12141214

1215+
(deftest test-cljs-2354
1216+
(async done
1217+
(let [st (cljs/empty-state)
1218+
load (fn [{:keys [name macros]} cb]
1219+
(cb (when (and (= name 'cljs.x)
1220+
(not macros))
1221+
{:lang :clj
1222+
:source "(ns cljs.x)"})))
1223+
l (latch 1 done)]
1224+
(cljs.js/compile-str st "(require 'clojure.x)" nil
1225+
{:load load}
1226+
(fn [{:keys [error value] :as m}]
1227+
(is (nil? error))
1228+
(is (re-find #"goog\.require\('cljs.x'\)" value))
1229+
(inc! l))))))
1230+
12151231
(defn -main [& args]
12161232
(run-tests))
12171233

0 commit comments

Comments
 (0)