|
3595 | 3595 | (and (record-tag? tag) |
3596 | 3596 | (contains? (record-basis tag) field))) |
3597 | 3597 |
|
| 3598 | +(defn- invalid-arity? [argc method-params variadic max-fixed-arity] |
| 3599 | + (and (not (valid-arity? argc method-params)) |
| 3600 | + (or (not variadic) |
| 3601 | + (and variadic (< argc max-fixed-arity))))) |
| 3602 | + |
3598 | 3603 | (defn parse-invoke* |
3599 | 3604 | [env [f & args :as form]] |
3600 | 3605 | (let [enve (assoc env :context :expr) |
|
3623 | 3628 | (when (and #?(:cljs (not (and (gstring/endsWith (str cur-ns) "$macros") |
3624 | 3629 | (symbol-identical? cur-ns ns) |
3625 | 3630 | (true? macro)))) |
3626 | | - (not (valid-arity? argc method-params)) |
3627 | | - (or (not variadic) |
3628 | | - (and variadic (< argc max-fixed-arity)))) |
| 3631 | + (invalid-arity? argc method-params variadic max-fixed-arity)) |
3629 | 3632 | (warning :fn-arity env {:name name :argc argc})))) |
3630 | 3633 | (when (and kw? (not (or (== 1 argc) (== 2 argc)))) |
3631 | 3634 | (warning :fn-arity env {:name (first form) :argc argc})) |
|
3822 | 3825 | (catch #?(:clj Throwable :cljs :default) e |
3823 | 3826 | (throw (ex-info nil (error-data env :macro-syntax-check (var->sym mac-var)) e)))))))) |
3824 | 3827 |
|
| 3828 | +#?(:cljs |
| 3829 | + (defn- check-macro-arity [mac-var form] |
| 3830 | + (let [mac-sym (.-sym mac-var)] |
| 3831 | + (when-let [{:keys [variadic? max-fixed-arity method-params]} |
| 3832 | + (get-in @env/*compiler* [::namespaces (symbol (namespace mac-sym)) :defs (symbol (name mac-sym))])] |
| 3833 | + (let [argc (count (rest form)) |
| 3834 | + offset (if (= '&form (ffirst method-params)) 2 0)] |
| 3835 | + (when (invalid-arity? argc (map #(nthrest %1 offset) method-params) |
| 3836 | + variadic? (when max-fixed-arity (- max-fixed-arity offset))) |
| 3837 | + (throw (js/Error. (error-message :fn-arity {:argc argc, :name mac-sym}))))))))) |
| 3838 | + |
3825 | 3839 | (defn macroexpand-1* |
3826 | 3840 | [env form] |
3827 | 3841 | (let [op (first form)] |
|
3836 | 3850 | :cljs [do]) |
3837 | 3851 | (do-macroexpand-check env form mac-var) |
3838 | 3852 | (let [form' (try |
| 3853 | + #?(:cljs (check-macro-arity mac-var form)) |
3839 | 3854 | (apply @mac-var form env (rest form)) |
3840 | 3855 | #?(:clj (catch ArityException e |
3841 | 3856 | (throw (ArityException. (- (.actual e) 2) (.name e))))) |
|
0 commit comments