Skip to content

Commit 82ab13f

Browse files
committed
CLJS-3137: fspec cannot be reused in clojurescript but can be in clojure
move the var fdef vars bits into def, add tests
1 parent 6431e64 commit 82ab13f

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

src/main/cljs/cljs/spec/alpha.cljc

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,23 @@
6060
(ana/resolve-var env s)))
6161
(symbol (str ana/*cljs-ns*) (str s))))
6262

63+
(defonce ^:private _speced_vars (atom #{}))
64+
65+
(defn speced-vars []
66+
@_speced_vars)
67+
6368
(defmacro def
6469
"Given a namespace-qualified keyword or resolveable symbol k, and a
6570
spec, spec-name, predicate or regex-op makes an entry in the
6671
registry mapping k to the spec. Use nil to remove an entry in
6772
the registry for k."
6873
[k spec-form]
69-
(let [k (if (symbol? k) (ns-qualify &env k) k)
74+
(let [k (if (symbol? k)
75+
(let [sym (ns-qualify &env k)]
76+
(swap! _speced_vars conj
77+
(vary-meta sym assoc :fdef-ns (-> &env :ns :name)))
78+
sym)
79+
k)
7080
form (res &env spec-form)]
7181
(swap! registry-ref (fn [r]
7282
(if (nil? form)
@@ -403,11 +413,6 @@
403413
(clojure.core/assert (not (empty? preds)))
404414
`(tuple-impl '~(mapv #(res &env %) preds) ~(vec preds)))
405415

406-
(defonce ^:private _speced_vars (atom #{}))
407-
408-
(defn speced-vars []
409-
@_speced_vars)
410-
411416
(defmacro fdef
412417
"Takes a symbol naming a function, and one or more of the following:
413418
@@ -441,9 +446,6 @@
441446
:sym symbol?)
442447
:ret symbol?)"
443448
[fn-sym & specs]
444-
(swap! _speced_vars conj
445-
(vary-meta (ns-qualify &env fn-sym)
446-
assoc :fdef-ns (-> &env :ns :name)))
447449
`(cljs.spec.alpha/def ~fn-sym (fspec ~@specs)))
448450

449451
(defmacro keys*

src/test/cljs/cljs/spec_test.cljs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,19 @@
455455
(is (thrown? js/Error (defk :foo 1)))
456456
(is (= [:foo "bar"] (defk :foo "bar"))))
457457

458+
(s/def ::add-spec
459+
(s/fspec :args (s/cat :n pos?)
460+
:ret number?))
461+
462+
(s/def add2 ::add-spec)
463+
(defn add2 [n]
464+
(+ n 2))
465+
466+
(st/instrument `add2)
467+
468+
(deftest cljs-3137
469+
(is (thrown? js/Error (add2 0))))
470+
458471
(comment
459472

460473
(run-tests)

0 commit comments

Comments
 (0)