|
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