|
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