|
4329 | 4329 | (.lastIndexOf full-name "."))]
|
4330 | 4330 | (symbol (str "cljs.user." name (util/content-sha full-name 7)))))))
|
4331 | 4331 |
|
| 4332 | +#?(:clj |
| 4333 | + (defn macro-call? [form env] |
| 4334 | + (when (and (seq? form) (seq form) (and (symbol? (first form)))) |
| 4335 | + (let [sym (first form) |
| 4336 | + nstr (namespace sym)] |
| 4337 | + (or (and (some? nstr) |
| 4338 | + (some? (gets env :ns :require-macros (symbol nstr)))) |
| 4339 | + (some? (gets env :ns :rename-macros sym)) |
| 4340 | + (some? (gets env :ns :use-macros sym))))))) |
| 4341 | + |
| 4342 | +#?(:clj |
| 4343 | + (declare ns-side-effects macroexpand-1)) |
| 4344 | + |
4332 | 4345 | #?(:clj
|
4333 | 4346 | (defn ^:dynamic parse-ns
|
4334 | 4347 | "Helper for parsing only the essential namespace information from a
|
|
4354 | 4367 | (binding [env/*compiler* (if (false? (:restore opts))
|
4355 | 4368 | env/*compiler*
|
4356 | 4369 | (atom @env/*compiler*))
|
| 4370 | + *file-defs* nil |
| 4371 | + #?@(:clj [*unchecked-if* false |
| 4372 | + *unchecked-arrays* false]) |
4357 | 4373 | *cljs-ns* 'cljs.user
|
4358 | 4374 | *cljs-file* src
|
4359 | 4375 | *macro-infer*
|
|
4370 | 4386 | false)]
|
4371 | 4387 | (let [rdr (when-not (sequential? src) (io/reader src))]
|
4372 | 4388 | (try
|
4373 |
| - (loop [forms (if rdr |
| 4389 | + (loop [env (empty-env) |
| 4390 | + forms (if rdr |
4374 | 4391 | (forms-seq* rdr (source-path src))
|
4375 | 4392 | src)
|
4376 | 4393 | ret (merge
|
|
4385 | 4402 | {:lines (with-open [reader (io/reader dest)]
|
4386 | 4403 | (-> reader line-seq count))}))]
|
4387 | 4404 | (if (seq forms)
|
4388 |
| - (let [env (empty-env) |
4389 |
| - ast (no-warn (analyze env (first forms) nil opts))] |
| 4405 | + (let [form (first forms) |
| 4406 | + macro? (macro-call? form env) |
| 4407 | + env (if macro? |
| 4408 | + (binding [*load-macros* true] |
| 4409 | + (assoc (:env (ns-side-effects env (:ast ret) opts)) :ns (:ns env))) |
| 4410 | + env) |
| 4411 | + ast (when (or macro? (and (seq? form) ('#{ns ns* require use require-macros} (first form)))) |
| 4412 | + (no-warn (analyze env form nil opts))) |
| 4413 | + env (assoc (:env ast) :ns (:ns env))] |
4390 | 4414 | (cond
|
4391 | 4415 | (= :ns (:op ast))
|
4392 | 4416 | (let [ns-name (:name ast)
|
4393 | 4417 | ns-name (if (and (= 'cljs.core ns-name)
|
4394 | 4418 | (= "cljc" (util/ext src)))
|
4395 | 4419 | 'cljs.core$macros
|
4396 | 4420 | ns-name)
|
4397 |
| - deps (merge (:uses ast) (:requires ast))] |
4398 |
| - (merge |
4399 |
| - {:ns (or ns-name 'cljs.user) |
4400 |
| - :provides [ns-name] |
4401 |
| - :requires (if (= 'cljs.core ns-name) |
4402 |
| - (set (vals deps)) |
4403 |
| - (cond-> (conj (set (vals deps)) 'cljs.core) |
4404 |
| - (get-in @env/*compiler* [:options :emit-constants]) |
4405 |
| - (conj constants-ns-sym))) |
4406 |
| - :file dest |
4407 |
| - :source-file (when rdr src) |
4408 |
| - :source-forms (when-not rdr src) |
4409 |
| - :ast ast |
4410 |
| - :macros-ns (or (:macros-ns opts) |
4411 |
| - (= 'cljs.core$macros ns-name))} |
4412 |
| - (when (and dest (.exists ^File dest)) |
4413 |
| - {:lines (with-open [reader (io/reader dest)] |
4414 |
| - (-> reader line-seq count))}))) |
| 4421 | + deps (merge (:uses ast) (:requires ast)) |
| 4422 | + env (assoc (:env ast) :ns (dissoc ast :env))] |
| 4423 | + (recur env |
| 4424 | + (rest forms) |
| 4425 | + (cond-> |
| 4426 | + {:ns (or ns-name 'cljs.user) |
| 4427 | + :provides [ns-name] |
| 4428 | + :requires (if (= 'cljs.core ns-name) |
| 4429 | + (set (vals deps)) |
| 4430 | + (cond-> (conj (set (vals deps)) 'cljs.core) |
| 4431 | + (get-in @env/*compiler* [:options :emit-constants]) |
| 4432 | + (conj constants-ns-sym))) |
| 4433 | + :file dest |
| 4434 | + :source-file (when rdr src) |
| 4435 | + :source-forms (when-not rdr src) |
| 4436 | + :ast ast |
| 4437 | + :macros-ns (or (:macros-ns opts) |
| 4438 | + (= 'cljs.core$macros ns-name))} |
| 4439 | + (and dest (.exists ^File dest)) |
| 4440 | + (assoc :lines (with-open [reader (io/reader dest)] |
| 4441 | + (-> reader line-seq count)))))) |
4415 | 4442 |
|
4416 | 4443 | (= :ns* (:op ast))
|
4417 | 4444 | (let [deps (merge (:uses ast) (:requires ast))]
|
4418 |
| - (recur (rest forms) |
4419 |
| - (cond-> (update-in ret [:requires] into (set (vals deps))) |
4420 |
| - ;; we need to defer generating the user namespace |
4421 |
| - ;; until we actually need or it will break when |
4422 |
| - ;; `src` is a sequence of forms - António Monteiro |
4423 |
| - (not (:ns ret)) |
4424 |
| - (assoc :ns (gen-user-ns src) :provides [(gen-user-ns src)])))) |
| 4445 | + (recur (:env ast) |
| 4446 | + (rest forms) |
| 4447 | + (cond-> (update-in ret [:requires] into (set (vals deps))) |
| 4448 | + ;; we need to defer generating the user namespace |
| 4449 | + ;; until we actually need or it will break when |
| 4450 | + ;; `src` is a sequence of forms - António Monteiro |
| 4451 | + (not (:ns ret)) |
| 4452 | + (assoc :ns (gen-user-ns src) :provides [(gen-user-ns src)])))) |
4425 | 4453 |
|
4426 | 4454 | :else ret))
|
4427 | 4455 | ret))
|
|
0 commit comments