|
7 | 7 | ; You must not remove this notice, or any other, from this software.
|
8 | 8 |
|
9 | 9 | (ns cljs.spec
|
10 |
| - (:refer-clojure :exclude [+ * and or cat def keys merge resolve]) |
| 10 | + (:refer-clojure :exclude [+ * and or cat def keys merge resolve assert]) |
11 | 11 | (:require [cljs.core :as c]
|
12 | 12 | [cljs.analyzer :as ana]
|
| 13 | + [cljs.env :as env] |
13 | 14 | [cljs.analyzer.api :refer [resolve]]
|
14 | 15 | [clojure.walk :as walk]
|
15 | 16 | [cljs.spec.impl.gen :as gen]
|
|
44 | 45 | [env s]
|
45 | 46 | (if (namespace s)
|
46 | 47 | (let [v (resolve env s)]
|
47 |
| - (assert v (str "Unable to resolve: " s)) |
| 48 | + (clojure.core/assert v (str "Unable to resolve: " s)) |
48 | 49 | (->sym v))
|
49 | 50 | (symbol (str ana/*cljs-ns*) (str s))))
|
50 | 51 |
|
|
138 | 139 | (let [unk #(-> % name keyword)
|
139 | 140 | req-keys (filterv keyword? (flatten req))
|
140 | 141 | req-un-specs (filterv keyword? (flatten req-un))
|
141 |
| - _ (assert (every? #(clojure.core/and (keyword? %) (namespace %)) (concat req-keys req-un-specs opt opt-un)) |
| 142 | + _ (clojure.core/assert (every? #(clojure.core/and (keyword? %) (namespace %)) (concat req-keys req-un-specs opt opt-un)) |
142 | 143 | "all keys must be namespace-qualified keywords")
|
143 | 144 | req-specs (into req-keys req-un-specs)
|
144 | 145 | req-keys (into req-keys (map unk req-un-specs))
|
|
180 | 181 | keys (mapv first pairs)
|
181 | 182 | pred-forms (mapv second pairs)
|
182 | 183 | pf (mapv #(res &env %) pred-forms)]
|
183 |
| - (assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "spec/or expects k1 p1 k2 p2..., where ks are keywords") |
| 184 | + (clojure.core/assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "spec/or expects k1 p1 k2 p2..., where ks are keywords") |
184 | 185 | `(cljs.spec/or-spec-impl ~keys '~pf ~pred-forms nil)))
|
185 | 186 |
|
186 | 187 | (defmacro and
|
|
295 | 296 | keys (mapv first pairs)
|
296 | 297 | pred-forms (mapv second pairs)
|
297 | 298 | pf (mapv #(res &env %) pred-forms)]
|
298 |
| - (assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "alt expects k1 p1 k2 p2..., where ks are keywords") |
| 299 | + (clojure.core/assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "alt expects k1 p1 k2 p2..., where ks are keywords") |
299 | 300 | `(cljs.spec/alt-impl ~keys ~pred-forms '~pf)))
|
300 | 301 |
|
301 | 302 | (defmacro cat
|
|
311 | 312 | pred-forms (mapv second pairs)
|
312 | 313 | pf (mapv #(res &env %) pred-forms)]
|
313 | 314 | ;;(prn key-pred-forms)
|
314 |
| - (assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "cat expects k1 p1 k2 p2..., where ks are keywords") |
| 315 | + (clojure.core/assert (clojure.core/and (even? (count key-pred-forms)) (every? keyword? keys)) "cat expects k1 p1 k2 p2..., where ks are keywords") |
315 | 316 | `(cljs.spec/cat-impl ~keys ~pred-forms '~pf)))
|
316 | 317 |
|
317 | 318 | (defmacro &
|
|
355 | 356 | where each element conforms to the corresponding pred. Each element
|
356 | 357 | will be referred to in paths using its ordinal."
|
357 | 358 | [& preds]
|
358 |
| - (assert (not (empty? preds))) |
| 359 | + (clojure.core/assert (not (empty? preds))) |
359 | 360 | `(cljs.spec/tuple-impl '~(mapv #(res &env %) preds) ~(vec preds)))
|
360 | 361 |
|
361 | 362 | (def ^:private _speced_vars (atom #{}))
|
|
467 | 468 | f# ~sym]
|
468 | 469 | (for [args# (gen/sample (gen (:args fspec#)) ~n)]
|
469 | 470 | [args# (apply f# args#)]))))
|
| 471 | + |
| 472 | +(defmacro ^:private init-compile-asserts [] |
| 473 | + (let [compile-asserts (not (-> env/*compiler* deref :options :elide-asserts))] |
| 474 | + compile-asserts)) |
| 475 | + |
| 476 | +(defmacro assert |
| 477 | + "spec-checking assert expression. Returns x if x is valid? according |
| 478 | +to spec, else throws an error with explain-data plus ::failure of |
| 479 | +:assertion-failed. |
| 480 | +Can be disabled at either compile time or runtime: |
| 481 | +If *compile-asserts* is false at compile time, compiles to x. Defaults |
| 482 | +to the negation value of the ':elide-asserts' compiler option, or true if |
| 483 | +not set. |
| 484 | +If (check-asserts?) is false at runtime, always returns x. Defaults to |
| 485 | +value of 'cljs.spec/*runtime-asserts*', or false if not set. You can |
| 486 | +toggle check-asserts? with (check-asserts bool)." |
| 487 | + [spec x] |
| 488 | + `(if cljs.spec/*compile-asserts* |
| 489 | + (if cljs.spec/*runtime-asserts* |
| 490 | + (cljs.spec/assert* ~spec ~x) |
| 491 | + ~x) |
| 492 | + ~x)) |
0 commit comments