Skip to content

Commit e89950e

Browse files
committed
CLJS-1193: recompile dependents fails to work when not auto-building
cljs.analyzer: - ns-dependents, allow supplying custom ns-map. The custom ns-map can supply ns-info map values with :requires entries in a variety of the formats present in the compiler. cljs.compiler: - add *inputs* dynamic var, will hold map from ns -> ns-info - compile-file, merge *inputs* into compiler environment namespaces - compile-root, sort compiler inputs into dependency order. bind *inputs* to a map from ns syms -> inputs (ana/parse-ns results) cljs.analyzer-tests: - add ana/ns-dependents test for new ns-map argument
1 parent 5994526 commit e89950e

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

src/clj/cljs/analyzer.clj

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -545,15 +545,29 @@
545545
(get-in namespaces [ns :macros sym]))))))
546546

547547
(defn ns-dependents
548-
([ns]
549-
(util/topo-sort ns
550-
(fn [ns]
551-
(set
552-
(map first
553-
(filter
554-
(fn [[_ ns-info]]
555-
(contains? (:requires ns-info) ns))
556-
(get @env/*compiler* ::namespaces))))))))
548+
"Given a namespace as a symbol and a map from namespace symbol to
549+
namespace information return the topologically sorted list of all
550+
dependent namespaces. The map values of the optional second argument must
551+
be maps with a :requires set of symbols, a :requires map of symbol -> alias
552+
(analyzer format) or a :requires vector of munged namespace strings
553+
(closure format)."
554+
([ns] (ns-dependents ns (get @env/*compiler* ::namespaces)))
555+
([ns ns-map]
556+
(letfn [(parent? [parent [child {:keys [requires] :as ns-info}]]
557+
(when-not (= parent child)
558+
(cond
559+
(or (map? requires)
560+
(set? requires)) (contains? requires parent)
561+
(vector? requires) (some #{(munge (name parent))} requires))))]
562+
(util/topo-sort ns
563+
(fn [ns']
564+
(set (map first (filter #(parent? ns' %) ns-map))))))))
565+
566+
(comment
567+
(ns-dependents 'bar
568+
'{bar {:requires #{cljs.core}}
569+
foo {:requires #{cljs.core bar}}})
570+
)
557571

558572
(declare analyze analyze-symbol analyze-seq)
559573

src/clj/cljs/compiler.clj

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
[cljs.tagged-literals :as tags]
1717
[cljs.analyzer :as ana]
1818
[cljs.source-map :as sm]
19-
[clojure.data.json :as json])
19+
[clojure.data.json :as json]
20+
[cljs.js-deps :as deps])
2021
(:import java.lang.StringBuilder
2122
java.io.File))
2223

@@ -25,6 +26,7 @@
2526
(def js-reserved ana/js-reserved)
2627

2728
(def ^:dynamic *dependents* nil)
29+
(def ^:dynamic *inputs* nil)
2830
(def ^:dynamic *source-map-data* nil)
2931
(def ^:dynamic *lexical-renames* {})
3032

@@ -1101,7 +1103,8 @@
11011103
([src dest opts]
11021104
{:post [map?]}
11031105
(binding [ana/*file-defs* (atom #{})]
1104-
(let [src-file (io/file src)
1106+
(let [nses (get @env/*compiler* ::ana/namespaces)
1107+
src-file (io/file src)
11051108
dest-file (io/file dest)
11061109
opts (merge {:optimizations :none} opts)]
11071110
(if (.exists src-file)
@@ -1114,21 +1117,23 @@
11141117
(if (requires-compilation? src-file dest-file opts)
11151118
(do
11161119
(util/mkdirs dest-file)
1117-
(when (and (get-in @env/*compiler* [::ana/namespaces ns :defs])
1120+
(when (and (get-in nses [ns :defs])
11181121
(not= ns 'cljs.core))
11191122
(swap! env/*compiler* update-in [::ana/namespaces] dissoc ns))
11201123
(let [ret (compile-file* src-file dest-file opts)]
11211124
(when *dependents*
11221125
(swap! *dependents*
11231126
(fn [{:keys [recompile visited]}]
1124-
{:recompile (into recompile (ana/ns-dependents ns))
1125-
:visited (conj visited ns)})))
1127+
{:recompile (into recompile
1128+
(ana/ns-dependents ns
1129+
(merge *inputs* nses)))
1130+
:visited (conj visited ns)})))
11261131
ret))
11271132
(do
11281133
;; populate compilation environment with analysis information
11291134
;; when constants are optimized
11301135
(when (and (true? (:optimize-constants opts))
1131-
(nil? (get-in @env/*compiler* [::ana/namespaces ns :defs])))
1136+
(nil? (get-in nses [ns :defs])))
11321137
(with-core-cljs opts (fn [] (ana/analyze-file src-file opts))))
11331138
ns-info)))
11341139
(catch Exception e
@@ -1158,15 +1163,21 @@
11581163
(compile-root src-dir target-dir nil))
11591164
([src-dir target-dir opts]
11601165
(swap! env/*compiler* assoc :root src-dir)
1161-
(let [src-dir-file (io/file src-dir)]
1162-
(loop [cljs-files (cljs-files-in src-dir-file)
1163-
output-files []]
1164-
(if (seq cljs-files)
1165-
(let [cljs-file (first cljs-files)
1166-
output-file (util/to-target-file target-dir (ana/parse-ns cljs-file))
1167-
ns-info (compile-file cljs-file output-file opts)]
1168-
(recur (rest cljs-files) (conj output-files (assoc ns-info :file-name (.getPath output-file)))))
1169-
output-files)))))
1166+
(let [src-dir-file (io/file src-dir)
1167+
inputs (deps/dependency-order
1168+
(map #(ana/parse-ns %)
1169+
(cljs-files-in src-dir-file)))]
1170+
(binding [*inputs* (zipmap (map :ns inputs) inputs)]
1171+
(loop [inputs (seq inputs) compiled []]
1172+
(if inputs
1173+
(let [{:keys [source-file] :as ns-info} (first inputs)
1174+
output-file (util/to-target-file target-dir ns-info)
1175+
ijs (compile-file source-file output-file opts)]
1176+
(recur
1177+
(next inputs)
1178+
(conj compiled
1179+
(assoc ijs :file-name (.getPath output-file)))))
1180+
compiled))))))
11701181

11711182
;; TODO: needs fixing, table will include other things than keywords - David
11721183

test/clj/cljs/analyzer_tests.clj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@
332332
(is (= (set (a/ns-dependents 'utils))
333333
#{'file-reloading 'dev 'client 'core}))))
334334

335+
(deftest test-ns-dependents-custom-ns-map
336+
(let [ns-map '{bar {:requires #{cljs.core}}
337+
foo {:requires #{cljs.core bar}}}]
338+
(is (= (set (a/ns-dependents 'bar ns-map)) #{'foo}))))
339+
335340
(deftest test-cljs-1105
336341
;; munge turns - into _, must preserve the dash first
337342
(is (not= (a/gen-constant-id :test-kw)

0 commit comments

Comments
 (0)