Skip to content

Commit 9d1b008

Browse files
author
dnolen
committed
CLJS-1228: cljs.util/topo-sort is polynomial on larger dependency graphs
remove ns-dependencies, remove corresponding build api. remove tests. simplify cljs.compiler/requires-compilation? now that we know that the build order is fixed.
1 parent 409d1ec commit 9d1b008

File tree

6 files changed

+8
-100
lines changed

6 files changed

+8
-100
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -782,31 +782,6 @@
782782
(when ns
783783
(get-in namespaces [ns :macros sym]))))))
784784

785-
(defn ns-dependents
786-
"Given a namespace as a symbol and a map from namespace symbol to
787-
namespace information return the topologically sorted list of all
788-
dependent namespaces. The map values of the optional second argument must
789-
be maps with a :requires set of symbols, a :requires map of symbol -> alias
790-
(analyzer format) or a :requires vector of munged namespace strings
791-
(closure format)."
792-
([ns] (ns-dependents ns (get @env/*compiler* ::namespaces)))
793-
([ns ns-map]
794-
(letfn [(parent? [parent [child {:keys [requires] :as ns-info}]]
795-
(when-not (= parent child)
796-
(cond
797-
(or (map? requires)
798-
(set? requires)) (contains? requires parent)
799-
(vector? requires) (some #{(munge (name parent))} requires))))]
800-
(topo-sort ns
801-
(fn [ns']
802-
(set (map first (filter #(parent? ns' %) ns-map))))))))
803-
804-
(comment
805-
(ns-dependents 'bar
806-
'{bar {:requires #{cljs.core}}
807-
foo {:requires #{cljs.core bar}}})
808-
)
809-
810785
(declare analyze analyze-symbol analyze-seq)
811786

812787
(def specials '#{if def fn* do let* loop* letfn* throw try recur new set!

src/main/clojure/cljs/build/api.clj

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,6 @@
7070
(intersection namespaces-set (-> x :require-macros vals set))))
7171
(vals (:cljs.analyzer/namespaces @state)))))))
7272

73-
(defn cljs-ns-dependents
74-
"Given a namespace symbol return a seq of all dependent
75-
namespaces sorted in dependency order. Will include
76-
transient dependents."
77-
([ns]
78-
(cljs-ns-dependents
79-
(if-not (nil? env/*compiler*)
80-
env/*compiler*
81-
(env/default-compiler-env))
82-
ns))
83-
([state ns]
84-
(env/with-compiler-env state
85-
(ana/ns-dependents ns))))
86-
8773
(defn parse-js-ns
8874
"Given a Google Closure style JavaScript file or resource return the namespace
8975
information for the given file. Only returns the value extracted from the

src/main/clojure/cljs/closure.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,8 +1769,8 @@
17691769
(assoc :js-dependency-index (deps/js-dependency-index all-opts))
17701770
;; Save list of sources for cljs.analyzer/locate-src - Juho Teperi
17711771
(assoc :sources (-find-sources source all-opts))))
1772-
(binding [comp/*dependents* (when-not (false? (:recompile-dependents opts))
1773-
(atom {:recompile #{} :visited #{}}))
1772+
(binding [comp/*recompiled* (when-not (false? (:recompile-dependents opts))
1773+
(atom #{}))
17741774
ana/*cljs-static-fns*
17751775
(or (and (= (:optimizations opts) :advanced)
17761776
(not (false? (:static-fns opts))))

src/main/clojure/cljs/compiler.cljc

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
(def js-reserved ana/js-reserved)
3737

38-
(def ^:dynamic *dependents* nil)
38+
(def ^:dynamic *recompiled* nil)
3939
(def ^:dynamic *inputs* nil)
4040
(def ^:dynamic *source-map-data* nil)
4141
(def ^:dynamic *lexical-renames* {})
@@ -1268,7 +1268,7 @@
12681268
"Return true if the src file requires compilation."
12691269
([src dest] (requires-compilation? src dest nil))
12701270
([^File src ^File dest opts]
1271-
(let [{:keys [ns]} (ana/parse-ns src)]
1271+
(let [{:keys [ns requires]} (ana/parse-ns src)]
12721272
(ensure
12731273
(or (not (.exists dest))
12741274
(> (.lastModified src) (.lastModified dest))
@@ -1283,10 +1283,8 @@
12831283
(if (= (:optimizations opts) :none)
12841284
(not (.exists (io/file (str (.getPath dest) ".map"))))
12851285
(not (get-in @env/*compiler* [::compiled-cljs (.getAbsolutePath dest)]))))
1286-
(let [{:keys [recompile visited]}
1287-
(and *dependents* @*dependents*)]
1288-
(and (contains? recompile ns)
1289-
(not (contains? visited ns))))))))))
1286+
(when-let [recompiled' (and *recompiled* @*recompiled*)]
1287+
(some requires recompiled'))))))))
12901288

12911289
#?(:clj
12921290
(defn compile-file
@@ -1331,13 +1329,8 @@
13311329
(not= :interactive (:mode opts)))
13321330
(swap! env/*compiler* update-in [::ana/namespaces] dissoc ns))
13331331
(let [ret (compile-file* src-file dest-file opts)]
1334-
(when *dependents*
1335-
(swap! *dependents*
1336-
(fn [{:keys [recompile visited]}]
1337-
{:recompile (into recompile
1338-
(ana/ns-dependents ns
1339-
(merge *inputs* nses)))
1340-
:visited (conj visited ns)})))
1332+
(when *recompiled*
1333+
(swap! *recompiled* conj ns))
13411334
ret))
13421335
(do
13431336
;; populate compilation environment with analysis information

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -305,39 +305,6 @@
305305
(is (= (meta (:name (a/analyze ns-env '(ns ^{:foo bar} weeble {:foo baz}))))
306306
{:foo 'baz}))))
307307

308-
(def test-deps-env (atom
309-
{:cljs.analyzer/namespaces
310-
{'file-reloading {:requires {'utils 'utils}}
311-
'core {:requires {'file-reloading 'file-reloading}}
312-
'dev {:requires {'client 'client
313-
'core 'core}}
314-
'client {:requires {'utils 'utils}}
315-
'utils {:requires {}}}}))
316-
317-
(deftest test-ns-dependents
318-
(binding [env/*compiler* test-deps-env]
319-
(is (= (set (a/ns-dependents 'client))
320-
#{'dev}))
321-
(is (= (set (a/ns-dependents 'core))
322-
#{'dev}))
323-
(is (= (set (a/ns-dependents 'dev))
324-
#{}))
325-
326-
;; if 'file-reloading returns 'core
327-
(is (= (set (a/ns-dependents 'file-reloading))
328-
#{'dev 'core}))
329-
330-
;; how can 'utils include 'file-reloading but not 'core
331-
;; FAILS with
332-
;; actual: (not (= #{file-reloading dev client} #{file-reloading dev client core}))
333-
(is (= (set (a/ns-dependents 'utils))
334-
#{'file-reloading 'dev 'client 'core}))))
335-
336-
(deftest test-ns-dependents-custom-ns-map
337-
(let [ns-map '{bar {:requires #{cljs.core}}
338-
foo {:requires #{cljs.core bar}}}]
339-
(is (= (set (a/ns-dependents 'bar ns-map)) #{'foo}))))
340-
341308
(deftest test-cljs-1105
342309
;; munge turns - into _, must preserve the dash first
343310
(is (not= (a/gen-constant-id :test-kw)

src/test/clojure/cljs/build_api_tests.clj

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -104,19 +104,6 @@
104104
(:require [graph.foo.core :as foo]
105105
[graph.bar.core :as bar]))))))
106106

107-
(deftest test-cljs-ns-dependencies
108-
(is (= (env/with-compiler-env test-cenv
109-
(cljs-ns-dependents 'clojure.string))
110-
'(cljs.user)))
111-
(is (= (env/with-compiler-env test-cenv
112-
(cljs-ns-dependents 'foo.core))
113-
'(bar.core baz.core)))
114-
(is (= (env/with-compiler-env test-cenv
115-
(cljs-ns-dependents 'graph.foo.core))
116-
'(graph.bar.core graph.baz.core)))
117-
(is (= (cljs-ns-dependents test-cenv 'graph.foo.core)
118-
'(graph.bar.core graph.baz.core))))
119-
120107
(deftest cljs-1469
121108
(let [srcs "samples/hello/src"
122109
[common-tmp app-tmp] (mapv #(File/createTempFile % ".js")

0 commit comments

Comments
 (0)