Skip to content

Commit 2267a8e

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-1490: Watch macro files in cljs.build.api/watch
1 parent af2e8b3 commit 2267a8e

File tree

2 files changed

+45
-19
lines changed

2 files changed

+45
-19
lines changed

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

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
[cljs.analyzer :as ana]
1818
[cljs.compiler :as comp]
1919
[cljs.closure :as closure]
20-
[clojure.set :refer [intersection]]
2120
[cljs.js-deps :as js-deps]
2221
[clojure.java.io :as io])
2322
(:import java.io.File))
@@ -32,19 +31,13 @@
3231
For example:
3332
(target-file-from-cljs-ns \"resources/out\" 'example.core) ->
3433
<File: \"resources/out/example/core.js\">"
35-
([ns-sym] (target-file-for-cljs-ns ns-sym nil))
36-
([ns-sym output-dir]
37-
(util/to-target-file
38-
(util/output-directory {:output-dir output-dir})
39-
{:ns ns-sym})))
34+
([ns-sym] (closure/target-file-for-cljs-ns ns-sym nil))
35+
([ns-sym output-dir] (closure/target-file-for-cljs-ns ns-sym output-dir)))
4036

4137
(defn mark-cljs-ns-for-recompile!
4238
"Backdates a cljs target file so that it the cljs compiler will recompile it."
43-
([ns-sym] (mark-cljs-ns-for-recompile! ns-sym nil))
44-
([ns-sym output-dir]
45-
(let [s (target-file-for-cljs-ns ns-sym output-dir)]
46-
(when (.exists s)
47-
(.setLastModified s 5000)))))
39+
([ns-sym] (closure/mark-cljs-ns-for-recompile! ns-sym nil))
40+
([ns-sym output-dir] (closure/mark-cljs-ns-for-recompile! ns-sym output-dir)))
4841

4942
(defn cljs-dependents-for-macro-namespaces
5043
"Takes a list of Clojure (.clj) namespaces that define macros and
@@ -58,17 +51,13 @@
5851
(cljs-dependents-for-macro-namespaces 'example.macros) ->
5952
('example.core 'example.util)"
6053
([namespaces]
61-
(cljs-dependents-for-macro-namespaces
54+
(closure/cljs-dependents-for-macro-namespaces
6255
(if-not (nil? env/*compiler*)
6356
env/*compiler*
6457
(env/default-compiler-env))
6558
namespaces))
6659
([state namespaces]
67-
(map :name
68-
(let [namespaces-set (set namespaces)]
69-
(filter (fn [x] (not-empty
70-
(intersection namespaces-set (-> x :require-macros vals set))))
71-
(vals (:cljs.analyzer/namespaces @state)))))))
60+
(closure/cljs-dependents-for-macro-namespaces state namespaces)))
7261

7362
(defn parse-js-ns
7463
"Given a Google Closure style JavaScript file or resource return the namespace

src/main/clojure/cljs/closure.clj

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2043,6 +2043,26 @@
20432043
:entries '#{cljs.reader hello.core}}}})
20442044
)
20452045

2046+
(defn ^File target-file-for-cljs-ns
2047+
[ns-sym output-dir]
2048+
(util/to-target-file
2049+
(util/output-directory {:output-dir output-dir})
2050+
{:ns ns-sym}))
2051+
2052+
(defn mark-cljs-ns-for-recompile!
2053+
[ns-sym output-dir]
2054+
(let [s (target-file-for-cljs-ns ns-sym output-dir)]
2055+
(when (.exists s)
2056+
(.setLastModified s 5000))))
2057+
2058+
(defn cljs-dependents-for-macro-namespaces
2059+
[state namespaces]
2060+
(map :name
2061+
(let [namespaces-set (set namespaces)]
2062+
(filter (fn [x] (not-empty
2063+
(set/intersection namespaces-set (-> x :require-macros vals set))))
2064+
(vals (:cljs.analyzer/namespaces @state))))))
2065+
20462066
(defn watch
20472067
"Given a source directory, produce runnable JavaScript. Watch the source
20482068
directory for changes rebuliding when necessary. Takes the same arguments as
@@ -2103,16 +2123,33 @@
21032123
(loop [key nil]
21042124
(when (and (or (nil? quit) (not @quit))
21052125
(or (nil? key) (. ^WatchKey key reset)))
2106-
(let [key (. srvc (poll 300 TimeUnit/MILLISECONDS))]
2126+
(let [key (. srvc (poll 300 TimeUnit/MILLISECONDS))
2127+
poll-events-seq (when key (seq (.pollEvents key)))]
21072128
(when (and key
21082129
(some
21092130
(fn [^WatchEvent e]
21102131
(let [fstr (.. e context toString)]
21112132
(and (or (. fstr (endsWith "cljc"))
21122133
(. fstr (endsWith "cljs"))
2134+
(. fstr (endsWith "clj"))
21132135
(. fstr (endsWith "js")))
21142136
(not (. fstr (startsWith ".#"))))))
2115-
(seq (.pollEvents key))))
2137+
poll-events-seq))
2138+
(when-let [clj-files (seq (keep (fn [^WatchEvent e]
2139+
(let [ctx (.context e)
2140+
fstr (.toString ctx)]
2141+
(when (and (or (. fstr (endsWith "cljc"))
2142+
(. fstr (endsWith "clj")))
2143+
(not (. fstr (startsWith ".#"))))
2144+
ctx)))
2145+
poll-events-seq))]
2146+
(let [^Path dir (.watchable key)
2147+
file-seq (map #(.toFile (.resolve dir %)) clj-files)
2148+
nses (map (comp :ns ana/parse-ns) file-seq)]
2149+
(doseq [ns nses]
2150+
(require ns :reload))
2151+
(doseq [ns (cljs-dependents-for-macro-namespaces compiler-env nses)]
2152+
(mark-cljs-ns-for-recompile! ns (:output-dir opts)))))
21162153
(println "Change detected, recompiling ...")
21172154
(flush)
21182155
(buildf))

0 commit comments

Comments
 (0)