|
2230 | 2230 | (apply merge-with merge m |
2231 | 2231 | (map (spec-parsers k) |
2232 | 2232 | (remove #{:reload :reload-all} libs)))) |
2233 | | - {} (remove (fn [[r]] (= r :refer-clojure)) args))] |
| 2233 | + {} (remove (fn [[r]] (= r :refer-clojure)) args)) |
| 2234 | + ;; patch `require-macros` and `use-macros` in Bootstrap for namespaces |
| 2235 | + ;; that require their own macros |
| 2236 | + #?@(:cljs [[require-macros use-macros] |
| 2237 | + (map (fn [spec-map] |
| 2238 | + (if (:macros-ns opts) |
| 2239 | + (let [ns (symbol (subs (str name) 0 (- (count (str name)) 7)))] |
| 2240 | + (reduce (fn [m [k v]] |
| 2241 | + (cond-> m |
| 2242 | + (not (symbol-identical? v ns)) |
| 2243 | + (assoc k v))) |
| 2244 | + {} spec-map)) |
| 2245 | + spec-map)) [require-macros use-macros])])] |
2234 | 2246 | (set! *cljs-ns* name) |
2235 | 2247 | (let [ns-info |
2236 | 2248 | {:name name |
|
2528 | 2540 | fexpr (analyze enve f) |
2529 | 2541 | argc (count args) |
2530 | 2542 | fn-var? (-> fexpr :info :fn-var) |
2531 | | - kw? (= 'cljs.core/Keyword (:tag fexpr))] |
| 2543 | + kw? (= 'cljs.core/Keyword (:tag fexpr)) |
| 2544 | + cur-ns (-> env :ns :name)] |
2532 | 2545 | (when ^boolean fn-var? |
2533 | | - (let [{:keys [^boolean variadic max-fixed-arity method-params name]} (:info fexpr)] |
2534 | | - (when (and (not (valid-arity? argc method-params)) |
| 2546 | + (let [{:keys [^boolean variadic max-fixed-arity method-params name ns macro]} (:info fexpr)] |
| 2547 | + ;; don't warn about invalid arity when when compiling a macros namespace |
| 2548 | + ;; that requires itself, as that code is not meant to be executed in the |
| 2549 | + ;; `$macros` ns - António Monteiro |
| 2550 | + (when (and #?(:cljs (not (and (gstring/endsWith (str cur-ns) "$macros") |
| 2551 | + (symbol-identical? cur-ns ns) |
| 2552 | + (true? macro)))) |
| 2553 | + (not (valid-arity? argc method-params)) |
2535 | 2554 | (or (not variadic) |
2536 | 2555 | (and variadic (< argc max-fixed-arity)))) |
2537 | 2556 | (warning :fn-arity env {:name name :argc argc})))) |
|
2581 | 2600 | lb (get lcls sym)] |
2582 | 2601 | (if-not (nil? lb) |
2583 | 2602 | (assoc ret :op :var :info lb) |
2584 | | - (if-not (true? (:def-var env)) |
2585 | | - (let [sym-meta (meta sym) |
2586 | | - info (if-not (contains? sym-meta ::analyzed) |
2587 | | - (resolve-existing-var env sym) |
2588 | | - (resolve-var env sym))] |
2589 | | - (assoc ret :op :var :info info)) |
2590 | | - (let [info (resolve-var env sym)] |
2591 | | - (assoc ret :op :var :info info))))))) |
| 2603 | + (let [sym-meta (meta sym) |
| 2604 | + sym-ns (namespace sym) |
| 2605 | + cur-ns (str (-> env :ns :name)) |
| 2606 | + ;; when compiling a macros namespace that requires itself, we need |
| 2607 | + ;; to resolve calls to `my-ns.core/foo` to `my-ns.core$macros/foo` |
| 2608 | + ;; to avoid undeclared variable warnings - António Monteiro |
| 2609 | + #?@(:cljs [sym (if (and sym-ns |
| 2610 | + (not= sym-ns "cljs.core") |
| 2611 | + (gstring/endsWith cur-ns "$macros") |
| 2612 | + (not (gstring/endsWith sym-ns "$macros")) |
| 2613 | + (= sym-ns (subs cur-ns 0 (- (count cur-ns) 7)))) |
| 2614 | + (symbol (str sym-ns "$macros") (name sym)) |
| 2615 | + sym)]) |
| 2616 | + info (if-not (contains? sym-meta ::analyzed) |
| 2617 | + (resolve-existing-var env sym) |
| 2618 | + (resolve-var env sym))] |
| 2619 | + (if-not (true? (:def-var env)) |
| 2620 | + (assoc ret :op :var :info info) |
| 2621 | + (let [info (resolve-var env sym)] |
| 2622 | + (assoc ret :op :var :info info)))))))) |
2592 | 2623 |
|
2593 | 2624 | (defn excluded? |
2594 | 2625 | #?(:cljs {:tag boolean}) |
|
0 commit comments