|
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