|
1167 | 1167 | (when opts |
1168 | 1168 | (str " " (pr-str (build-affecting-options opts)))))))) |
1169 | 1169 |
|
| 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 | + |
1170 | 1272 | #?(:clj |
1171 | 1273 | (defn compile-file* |
1172 | 1274 | ([src dest] (compile-file* src dest nil)) |
|
1178 | 1280 | (util/debug-prn "Compiling" (str src))) |
1179 | 1281 | (let [ext (util/ext src) |
1180 | 1282 | {: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))))))))) |
1268 | 1291 |
|
1269 | 1292 | #?(:clj |
1270 | 1293 | (defn requires-compilation? |
|
1274 | 1297 | (let [{:keys [ns requires]} (ana/parse-ns src)] |
1275 | 1298 | (ensure |
1276 | 1299 | (or (not (.exists dest)) |
1277 | | - (> (.lastModified src) (.lastModified dest)) |
| 1300 | + (util/changed? src dest) |
1278 | 1301 | (let [version' (util/compiled-by-version dest) |
1279 | 1302 | version (util/clojurescript-version)] |
1280 | 1303 | (and version (not= version version'))) |
|
1324 | 1347 | (assoc opts :static-fns true) |
1325 | 1348 | opts)] |
1326 | 1349 | (if (or (requires-compilation? src-file dest-file opts) |
1327 | | - (:force opts)) |
| 1350 | + (:force opts)) |
1328 | 1351 | (do |
1329 | 1352 | (util/mkdirs dest-file) |
1330 | 1353 | (when (and (get-in nses [ns :defs]) |
|
0 commit comments