Skip to content

Commit 5724f72

Browse files
author
dnolen
committed
CLJS-1539: Parallel compilation fails on circular dependencies
cljs.js-deps/dependency-order-visit now checks for circular dependencies as well
1 parent 27bbf82 commit 5724f72

File tree

5 files changed

+18
-12
lines changed

5 files changed

+18
-12
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1653,7 +1653,8 @@
16531653
(let [compiler @env/*compiler*]
16541654
(binding [*cljs-dep-set* (vary-meta (conj *cljs-dep-set* lib) update-in [:dep-path] conj lib)]
16551655
(assert (every? #(not (contains? *cljs-dep-set* %)) deps)
1656-
(str "Circular dependency detected " (-> *cljs-dep-set* meta :dep-path)))
1656+
(str "Circular dependency detected, "
1657+
(apply str (interpose " -> " (conj (-> *cljs-dep-set* meta :dep-path) lib)))))
16571658
(doseq [dep deps]
16581659
(when-not (or (not-empty (get-in compiler [::namespaces dep :defs]))
16591660
(contains? (:js-dependency-index compiler) (name dep))

src/main/clojure/cljs/js_deps.cljc

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,19 @@ case."
142142
{} deps))
143143

144144
(defn dependency-order-visit
145-
[state ns-name]
146-
(let [file (get state ns-name)]
147-
(if (or (:visited file) (nil? file))
148-
state
149-
(let [state (assoc-in state [ns-name :visited] true)
150-
deps (:requires file)
151-
state (reduce dependency-order-visit state deps)]
152-
(assoc state :order (conj (:order state) file))))))
145+
([state ns-name]
146+
(dependency-order-visit state ns-name []))
147+
([state ns-name seen]
148+
(assert (not (some #{ns-name} seen))
149+
(str "Circular dependency detected, "
150+
(apply str (interpose " -> " (conj seen ns-name)))))
151+
(let [file (get state ns-name)]
152+
(if (or (:visited file) (nil? file))
153+
state
154+
(let [state (assoc-in state [ns-name :visited] true)
155+
deps (:requires file)
156+
state (reduce #(dependency-order-visit %1 %2 (conj seen ns-name)) state deps)]
157+
(assoc state :order (conj (:order state) file)))))))
153158

154159
(defn- pack-string [s]
155160
(if (string? s)
@@ -167,8 +172,8 @@ case."
167172
[coll]
168173
(let [state (build-index (map pack-string coll))]
169174
(map unpack-string
170-
(distinct
171-
(:order (reduce dependency-order-visit (assoc state :order []) (keys state)))))))
175+
(distinct
176+
(:order (reduce dependency-order-visit (assoc state :order []) (keys state)))))))
172177

173178

174179
;; Dependencies

src/test/clojure/cljs/build_api_tests.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150
(let [out-file (io/file "out/main.js")]
151151
(.delete out-file)
152152
(try
153-
(build (inputs "src/test/cljs")
153+
(build (inputs "src/test/cljs_build")
154154
{:main 'circular-deps.a
155155
:optimizations :none
156156
:verbose true

0 commit comments

Comments
 (0)