|
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