|
3217 | 3217 | (fn ~method))))] |
3218 | 3218 | (core/let [rname (symbol (core/str ana/*cljs-ns*) (core/str name)) |
3219 | 3219 | arglists (map first fdecl) |
3220 | | - varsig? #(some '#{&} %) |
3221 | | - variadic (boolean (some varsig? arglists)) |
3222 | | - sigs (remove varsig? arglists) |
| 3220 | + macro? (:macro meta) |
| 3221 | + varsig? #(boolean (some '#{&} %)) |
| 3222 | + {sigs false var-sigs true} (group-by varsig? arglists) |
| 3223 | + variadic? (core/pos? (core/count var-sigs)) |
| 3224 | + variadic-params (if variadic? |
| 3225 | + (core/cond-> (remove '#{&} (first var-sigs)) |
| 3226 | + true core/count |
| 3227 | + macro? (core/- 2)) |
| 3228 | + 0) |
3223 | 3229 | maxfa (apply core/max |
3224 | 3230 | (concat |
3225 | 3231 | (map count sigs) |
3226 | | - [(core/- (count (first (filter varsig? arglists))) 2)])) |
3227 | | - macro? (:macro meta) |
| 3232 | + [(core/- (count (first var-sigs)) 2)])) |
3228 | 3233 | mfa (core/cond-> maxfa macro? (core/- 2)) |
3229 | 3234 | meta (assoc meta |
3230 | 3235 | :top-fn |
3231 | | - {:variadic? variadic |
| 3236 | + {:variadic? variadic? |
3232 | 3237 | :fixed-arity mfa |
3233 | 3238 | :max-fixed-arity mfa |
3234 | 3239 | :method-params (core/cond-> sigs macro? elide-implicit-macro-args) |
|
3237 | 3242 | args-sym (gensym "args") |
3238 | 3243 | param-counts (map count arglists) |
3239 | 3244 | name (with-meta name meta)] |
| 3245 | + (core/when (core/< 1 (count var-sigs)) |
| 3246 | + (ana/warning :multiple-variadic-overloads {} {:name name})) |
| 3247 | + (core/when (core/and (core/pos? variadic-params) |
| 3248 | + (not (core/== variadic-params (core/+ 1 mfa)))) |
| 3249 | + (ana/warning :variadic-max-arity {} {:name name})) |
3240 | 3250 | (core/when (not= (distinct param-counts) param-counts) |
3241 | 3251 | (ana/warning :overload-arity {} {:name name})) |
3242 | 3252 | `(do |
3243 | 3253 | (def ~name |
3244 | 3254 | (fn [~'var_args] |
3245 | 3255 | (case (alength (js-arguments)) |
3246 | 3256 | ~@(mapcat #(fixed-arity rname %) sigs) |
3247 | | - ~(if variadic |
| 3257 | + ~(if variadic? |
3248 | 3258 | `(let [args-arr# (array)] |
3249 | 3259 | (copy-arguments args-arr#) |
3250 | 3260 | (let [argseq# (new ^::ana/no-resolve cljs.core/IndexedSeq |
|
0 commit comments