Skip to content

Commit 96a1615

Browse files
author
dnolen
committed
Merge branch 'cljs-1487'
2 parents e1892f6 + 18158f9 commit 96a1615

File tree

5 files changed

+156
-116
lines changed

5 files changed

+156
-116
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2801,19 +2801,24 @@
28012801
(let [out-src (util/to-target-file output-dir (parse-ns src))]
28022802
(if (not (.exists out-src))
28032803
true
2804-
(if (> (util/last-modified src) (util/last-modified cache))
2804+
(if (util/changed? src cache)
28052805
true
28062806
(let [version' (util/compiled-by-version cache)
2807-
version (util/clojurescript-version)]
2807+
version (util/clojurescript-version)]
28082808
(and version (not= version version'))))))))))
28092809

28102810
#?(:clj
2811-
(defn write-analysis-cache [ns cache-file]
2812-
(util/mkdirs cache-file)
2813-
(spit cache-file
2814-
(str ";; Analyzed by ClojureScript " (util/clojurescript-version) "\n"
2815-
(pr-str
2816-
(dissoc (get-in @env/*compiler* [::namespaces ns]) :macros))))))
2811+
(defn write-analysis-cache
2812+
([ns cache-file]
2813+
(write-analysis-cache ns cache-file nil))
2814+
([ns cache-file src]
2815+
(util/mkdirs cache-file)
2816+
(spit cache-file
2817+
(str ";; Analyzed by ClojureScript " (util/clojurescript-version) "\n"
2818+
(pr-str
2819+
(dissoc (get-in @env/*compiler* [::namespaces ns]) :macros))))
2820+
(when src
2821+
(.setLastModified ^File cache-file (util/last-modified src))))))
28172822

28182823
#?(:clj
28192824
(defn analyze-file
@@ -2861,7 +2866,7 @@
28612866
(recur ns (next forms))))
28622867
ns)))]
28632868
(when (and cache (true? (:cache-analysis opts)))
2864-
(write-analysis-cache ns cache))))
2869+
(write-analysis-cache ns cache res))))
28652870
;; we want want to keep dependency analysis information
28662871
;; don't revert the environment - David
28672872
(let [{:keys [ns]}

src/main/clojure/cljs/closure.clj

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,8 +1522,8 @@
15221522

15231523
(defn write-javascript
15241524
"Write or copy a JavaScript file to output directory. Only write if the file
1525-
does not already exist. Return IJavaScript for the file on disk at the new
1526-
location."
1525+
does not already exist. Return IJavaScript for the file on disk at the new
1526+
location."
15271527
[opts js]
15281528
(let [out-dir (io/file (util/output-directory opts))
15291529
out-name (rel-output-path js opts)
@@ -1532,14 +1532,21 @@
15321532
:out-file (.toString out-file)
15331533
:requires (deps/-requires js)
15341534
:provides (deps/-provides js)
1535-
:group (:group js)}]
1536-
(when-not (.exists out-file)
1535+
:group (:group js)}
1536+
url (:url js)]
1537+
(when (or (not (.exists out-file))
1538+
(and url (util/changed? out-file url)))
1539+
(when (and url (or ana/*verbose* (:verbose opts)))
1540+
(util/debug-prn "Copying" (str url) "to" (str out-file)))
15371541
(util/mkdirs out-file)
15381542
(spit out-file
1539-
(cond-> (if (map? js) (assoc js :source (deps/-source js)) js)
1540-
(:preprocess js) (js-transforms opts)
1541-
(:module-type js) (convert-js-module opts)
1542-
true deps/-source)))
1543+
(cond-> js
1544+
(map? js) (assoc :source (deps/-source js))
1545+
(:preprocess js) (js-transforms opts)
1546+
(:module-type js) (convert-js-module opts)
1547+
true deps/-source))
1548+
(when url
1549+
(.setLastModified ^File out-file (util/last-modified url))))
15431550
(if (map? js)
15441551
(merge js ijs)
15451552
ijs)))
@@ -1556,7 +1563,7 @@
15561563

15571564
(defn source-on-disk
15581565
"Ensure that the given IJavaScript exists on disk in the output directory.
1559-
Return updated IJavaScript with the new location if necessary."
1566+
Return updated IJavaScript with the new location if necessary."
15601567
[opts js]
15611568
(if (write-js? js)
15621569
(write-javascript opts js)
@@ -1568,9 +1575,11 @@
15681575
source-url (:source-url js)]
15691576
(when (and out-file source-url
15701577
(or (not (.exists ^File out-file))
1571-
(> (.lastModified (io/file source-url))
1572-
(.lastModified out-file))))
1573-
(spit out-file (slurp source-url)))
1578+
(util/changed? (io/file source-url) out-file)))
1579+
(when (or ana/*verbose* (:verbose opts))
1580+
(util/debug-prn "Copying" (str source-url) "to" (str out-file)))
1581+
(spit out-file (slurp source-url))
1582+
(.setLastModified ^File out-file (util/last-modified source-url)))
15741583
js)))
15751584

15761585
(comment
@@ -2060,16 +2069,16 @@
20602069

20612070
(defn aot-cache-core []
20622071
(let [base-path (io/file "src" "main" "cljs" "cljs")
2063-
src (io/file base-path "core.cljs")
2064-
dest (io/file base-path "core.aot.js")
2065-
cache (io/file base-path "core.cljs.cache.aot.edn")]
2072+
src (io/file base-path "core.cljs")
2073+
dest (io/file base-path "core.aot.js")
2074+
cache (io/file base-path "core.cljs.cache.aot.edn")]
20662075
(util/mkdirs dest)
20672076
(env/with-compiler-env (env/default-compiler-env)
20682077
(comp/compile-file src dest
20692078
{:source-map true
20702079
:source-map-url "core.js.map"
20712080
:output-dir (str "src" File/separator "main" File/separator "cljs")})
2072-
(ana/write-analysis-cache 'cljs.core cache))))
2081+
(ana/write-analysis-cache 'cljs.core cache src))))
20732082

20742083
(comment
20752084
(time

src/main/clojure/cljs/compiler.cljc

Lines changed: 112 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,108 @@
11671167
(when opts
11681168
(str " " (pr-str (build-affecting-options opts))))))))
11691169

1170+
#?(:clj
1171+
(defn cached-core [ns ext opts]
1172+
(and (= :none (:optimizations opts))
1173+
(not= "cljc" ext)
1174+
(= 'cljs.core ns)
1175+
(io/resource "cljs/core.aot.js"))))
1176+
1177+
#?(:clj
1178+
(defn macro-ns? [ns ext opts]
1179+
(or (= "clj" ext)
1180+
(= 'cljs.core$macros ns)
1181+
(and (= ns 'cljs.core) (= "cljc" ext))
1182+
(:macros-ns opts))))
1183+
1184+
#?(:clj
1185+
(defn emit-cached-core [src dest cached opts]
1186+
;; no need to bother with analysis cache reading, handled by
1187+
;; with-core-cljs
1188+
(when (or ana/*verbose* (:verbose opts))
1189+
(util/debug-prn "Using cached cljs.core" (str src)))
1190+
(spit dest (slurp cached))
1191+
(.setLastModified ^File dest (util/last-modified src))
1192+
(when (true? (:source-map opts))
1193+
(spit (io/file (str dest ".map"))
1194+
(json/write-str
1195+
(assoc
1196+
(json/read-str (slurp (io/resource "cljs/core.aot.js.map")))
1197+
"file"
1198+
(str (io/file (util/output-directory opts) "cljs" "core.js"))))))
1199+
(ana/parse-ns src dest nil)))
1200+
1201+
#?(:clj
1202+
(defn emit-source-map [src dest sm-data opts]
1203+
(let [sm-file (io/file (str (.getPath ^File dest) ".map"))]
1204+
(emits "\n//# sourceMappingURL="
1205+
(or (:source-map-url opts) (.getName sm-file))
1206+
(if (true? (:source-map-timestamp opts))
1207+
(str "?rel=" (System/currentTimeMillis))
1208+
""))
1209+
(spit sm-file
1210+
(sm/encode {(url-path src) (:source-map sm-data)}
1211+
{:lines (+ (:gen-line sm-data) 2)
1212+
:file (url-path dest)
1213+
:source-map-timestamp (:source-map-timestamp opts)
1214+
:source-map-pretty-print (:source-map-pretty-print opts)})))))
1215+
1216+
#?(:clj
1217+
(defn emit-source [src dest ext opts]
1218+
(with-open [out ^java.io.Writer (io/make-writer dest {})]
1219+
(binding [*out* out
1220+
ana/*cljs-ns* 'cljs.user
1221+
ana/*cljs-file* (.getPath ^File src)
1222+
reader/*alias-map* (or reader/*alias-map* {})
1223+
ana/*cljs-static-fns* (or ana/*cljs-static-fns* (:static-fns opts))
1224+
*source-map-data* (when (:source-map opts)
1225+
(atom
1226+
{:source-map (sorted-map)
1227+
:gen-col 0
1228+
:gen-line 0}))]
1229+
(emitln (compiled-by-string opts))
1230+
(with-open [rdr (io/reader src)]
1231+
(let [env (ana/empty-env)]
1232+
(loop [forms (ana/forms-seq* rdr (util/path src))
1233+
ns-name nil
1234+
deps nil]
1235+
(if (seq forms)
1236+
(let [env (assoc env :ns (ana/get-namespace ana/*cljs-ns*))
1237+
ast (ana/analyze env (first forms) nil opts)]
1238+
(emit ast)
1239+
(if (= :ns (:op ast))
1240+
(let [ns-name (:name ast)
1241+
ns-name (if (and (= 'cljs.core ns-name)
1242+
(= "cljc" ext))
1243+
'cljs.core$macros
1244+
ns-name)]
1245+
(recur (rest forms) ns-name (merge (:uses ast) (:requires ast))))
1246+
(recur (rest forms) ns-name deps)))
1247+
(let [sm-data (when *source-map-data* @*source-map-data*)
1248+
ret (merge
1249+
{:ns (or ns-name 'cljs.user)
1250+
:macros-ns (:macros-ns opts)
1251+
:provides [ns-name]
1252+
:requires (if (= ns-name 'cljs.core)
1253+
(set (vals deps))
1254+
(cond-> (conj (set (vals deps)) 'cljs.core)
1255+
(get-in @env/*compiler* [:options :emit-constants])
1256+
(conj 'constants-table)))
1257+
:file dest
1258+
:source-file src}
1259+
(when sm-data
1260+
{:source-map (:source-map sm-data)}))]
1261+
(when (and sm-data (= :none (:optimizations opts)))
1262+
(emit-source-map src dest sm-data opts))
1263+
(let [path (.getPath (.toURL ^File dest))]
1264+
(swap! env/*compiler* assoc-in [::compiled-cljs path] ret))
1265+
(let [{:keys [output-dir cache-analysis]} opts]
1266+
(when (and (true? cache-analysis) output-dir)
1267+
(ana/write-analysis-cache ns-name
1268+
(ana/cache-file src (ana/parse-ns src) output-dir :write)
1269+
src))
1270+
ret))))))))))
1271+
11701272
#?(:clj
11711273
(defn compile-file*
11721274
([src dest] (compile-file* src dest nil))
@@ -1178,93 +1280,14 @@
11781280
(util/debug-prn "Compiling" (str src)))
11791281
(let [ext (util/ext src)
11801282
{:keys [ns] :as ns-info} (ana/parse-ns src)]
1181-
(if-let [cached (and (= :none (:optimizations opts))
1182-
(not= "cljc" ext)
1183-
(= 'cljs.core ns)
1184-
(io/resource "cljs/core.aot.js"))]
1185-
;; no need to bother with analysis cache reading, handled by
1186-
;; with-core-cljs
1187-
(do
1188-
(when (or ana/*verbose* (:verbose opts))
1189-
(util/debug-prn "Using cached cljs.core" (str src)))
1190-
(spit dest (slurp cached))
1191-
(when (true? (:source-map opts))
1192-
(spit (io/file (str dest ".map"))
1193-
(json/write-str
1194-
(assoc
1195-
(json/read-str (slurp (io/resource "cljs/core.aot.js.map")))
1196-
"file"
1197-
(str (io/file (util/output-directory opts) "cljs" "core.js"))))))
1198-
(ana/parse-ns src dest nil))
1199-
(let [opts (if (or (= "clj" ext)
1200-
(= 'cljs.core$macros ns)
1201-
(and (= ns 'cljs.core) (= "cljc" ext))
1202-
(:macros-ns opts))
1203-
(assoc opts :macros-ns true)
1204-
opts)]
1205-
(with-open [out ^java.io.Writer (io/make-writer dest {})]
1206-
(binding [*out* out
1207-
ana/*cljs-ns* 'cljs.user
1208-
ana/*cljs-file* (.getPath ^File src)
1209-
reader/*alias-map* (or reader/*alias-map* {})
1210-
ana/*cljs-static-fns* (or ana/*cljs-static-fns* (:static-fns opts))
1211-
*source-map-data* (when (:source-map opts)
1212-
(atom
1213-
{:source-map (sorted-map)
1214-
:gen-col 0
1215-
:gen-line 0}))]
1216-
(emitln (compiled-by-string opts))
1217-
(with-open [rdr (io/reader src)]
1218-
(let [env (ana/empty-env)]
1219-
(loop [forms (ana/forms-seq* rdr (util/path src))
1220-
ns-name nil
1221-
deps nil]
1222-
(if (seq forms)
1223-
(let [env (assoc env :ns (ana/get-namespace ana/*cljs-ns*))
1224-
ast (ana/analyze env (first forms) nil opts)]
1225-
(emit ast)
1226-
(if (= :ns (:op ast))
1227-
(let [ns-name (:name ast)
1228-
ns-name (if (and (= 'cljs.core ns-name)
1229-
(= "cljc" ext))
1230-
'cljs.core$macros
1231-
ns-name)]
1232-
(recur (rest forms) ns-name (merge (:uses ast) (:requires ast))))
1233-
(recur (rest forms) ns-name deps)))
1234-
(let [sm-data (when *source-map-data* @*source-map-data*)
1235-
ret (merge
1236-
{:ns (or ns-name 'cljs.user)
1237-
:macros-ns (:macros-ns opts)
1238-
:provides [ns-name]
1239-
:requires (if (= ns-name 'cljs.core)
1240-
(set (vals deps))
1241-
(cond-> (conj (set (vals deps)) 'cljs.core)
1242-
(get-in @env/*compiler* [:options :emit-constants])
1243-
(conj 'constants-table)))
1244-
:file dest
1245-
:source-file src}
1246-
(when sm-data
1247-
{:source-map (:source-map sm-data)}))]
1248-
(when (and sm-data (= :none (:optimizations opts)))
1249-
(let [sm-file (io/file (str (.getPath ^File dest) ".map"))]
1250-
(emits "\n//# sourceMappingURL="
1251-
(or (:source-map-url opts) (.getName sm-file))
1252-
(if (true? (:source-map-timestamp opts))
1253-
(str "?rel=" (System/currentTimeMillis))
1254-
""))
1255-
(spit sm-file
1256-
(sm/encode {(url-path src) (:source-map sm-data)}
1257-
{:lines (+ (:gen-line sm-data) 2)
1258-
:file (url-path dest)
1259-
:source-map-timestamp (:source-map-timestamp opts)
1260-
:source-map-pretty-print (:source-map-pretty-print opts)}))))
1261-
(let [path (.getPath (.toURL ^File dest))]
1262-
(swap! env/*compiler* assoc-in [::compiled-cljs path] ret))
1263-
(let [{:keys [output-dir cache-analysis]} opts]
1264-
(when (and (true? cache-analysis) output-dir)
1265-
(ana/write-analysis-cache ns-name
1266-
(ana/cache-file src (ana/parse-ns src) output-dir :write)))
1267-
ret)))))))))))))))))
1283+
(if-let [cached (cached-core ns ext opts)]
1284+
(emit-cached-core src dest cached opts)
1285+
(let [opts (if (macro-ns? ns ext opts)
1286+
(assoc opts :macros-ns true)
1287+
opts)
1288+
ret (emit-source src dest ext opts)]
1289+
(.setLastModified ^File dest (util/last-modified src))
1290+
ret)))))))))
12681291

12691292
#?(:clj
12701293
(defn requires-compilation?
@@ -1274,7 +1297,7 @@
12741297
(let [{:keys [ns requires]} (ana/parse-ns src)]
12751298
(ensure
12761299
(or (not (.exists dest))
1277-
(> (.lastModified src) (.lastModified dest))
1300+
(util/changed? src dest)
12781301
(let [version' (util/compiled-by-version dest)
12791302
version (util/clojurescript-version)]
12801303
(and version (not= version version')))
@@ -1324,7 +1347,7 @@
13241347
(assoc opts :static-fns true)
13251348
opts)]
13261349
(if (or (requires-compilation? src-file dest-file opts)
1327-
(:force opts))
1350+
(:force opts))
13281351
(do
13291352
(util/mkdirs dest-file)
13301353
(when (and (get-in nses [ns :defs])

src/main/clojure/cljs/repl.cljc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@
190190
;; environment will handle actual loading - David
191191
(let [sb (StringBuffer.)]
192192
(doseq [source (->> sources
193-
(remove (comp #{:seed} :type))
194-
(map #(cljsc/source-on-disk opts %)))]
193+
(remove (comp #{:seed} :type))
194+
(map #(cljsc/source-on-disk opts %)))]
195195
(when (:repl-verbose opts)
196196
(println "Loading:" (:provides source)))
197197
(.append sb (cljsc/add-dep-string opts source)))

src/main/clojure/cljs/util.cljc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@
154154
(throw
155155
(IllegalArgumentException. (str "Cannot get last modified for " src)))))
156156

157+
(defn changed? [a b]
158+
(not (== (last-modified a) (last-modified b))))
159+
157160
(defn file-or-resource [s]
158161
(or (and (.exists (io/file s)) (io/file s))
159162
(io/resource s)))

0 commit comments

Comments
 (0)