Skip to content

Commit 455724c

Browse files
committed
CLJS-2839: [spec] s/& explain-data :pred problem
1 parent 0ec3870 commit 455724c

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@
361361
conjunction of the predicates, and any conforming they might perform."
362362
[re & preds]
363363
(let [pv (vec preds)]
364-
`(amp-impl ~re ~pv '~(mapv #(res &env %) pv))))
364+
`(amp-impl ~re '~(res &env re) ~pv '~(mapv #(res &env %) pv))))
365365

366366
(defmacro conformer
367367
"takes a predicate function with the semantics of conform i.e. it should return either a

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -963,8 +963,8 @@
963963

964964
(defn ^:skip-wiki amp-impl
965965
"Do not call this directly, use '&'"
966-
[re preds pred-forms]
967-
{::op ::amp :p1 re :ps preds :forms pred-forms})
966+
[re re-form preds pred-forms]
967+
{::op ::amp :p1 re :amp re-form :ps preds :forms pred-forms})
968968

969969
(defn- filter-alt [ps ks forms f]
970970
(if (c/or ks forms)
@@ -1071,7 +1071,7 @@
10711071

10721072
(defn- deriv
10731073
[p x]
1074-
(let [{[p0 & pr :as ps] :ps, [k0 & kr :as ks] :ks, :keys [::op p1 p2 ret splice forms] :as p} (reg-resolve! p)]
1074+
(let [{[p0 & pr :as ps] :ps, [k0 & kr :as ks] :ks, :keys [::op p1 p2 ret splice forms amp] :as p} (reg-resolve! p)]
10751075
(when p
10761076
(case op
10771077
::accept nil
@@ -1082,21 +1082,21 @@
10821082
(let [ret (-> (preturn p1) (and-preds ps (next forms)))]
10831083
(when-not (invalid? ret)
10841084
(accept ret)))
1085-
(amp-impl p1 ps forms)))
1085+
(amp-impl p1 amp ps forms)))
10861086
::pcat (alt2 (pcat* {:ps (cons (deriv p0 x) pr), :ks ks, :forms forms, :ret ret})
10871087
(when (accept-nil? p0) (deriv (pcat* {:ps pr, :ks kr, :forms (next forms), :ret (add-ret p0 ret k0)}) x)))
10881088
::alt (alt* (map #(deriv % x) ps) ks forms)
10891089
::rep (alt2 (rep* (deriv p1 x) p2 ret splice forms)
10901090
(when (accept-nil? p1) (deriv (rep* p2 p2 (add-ret p1 ret nil) splice forms) x)))))))
10911091

10921092
(defn- op-describe [p]
1093-
(let [{:keys [::op ps ks forms splice p1 rep+ maybe] :as p} (reg-resolve! p)]
1093+
(let [{:keys [::op ps ks forms splice p1 rep+ maybe amp] :as p} (reg-resolve! p)]
10941094
;;(prn {:op op :ks ks :forms forms :p p})
10951095
(when p
10961096
(case op
10971097
::accept nil
10981098
nil p
1099-
::amp (list* 'cljs.spec.alpha/& (op-describe p1) forms)
1099+
::amp (list* 'cljs.spec.alpha/& amp forms)
11001100
::pcat (if rep+
11011101
(list `+ rep+)
11021102
(cons `cat (mapcat vector (c/or (seq ks) (repeat :_)) forms)))
@@ -1126,10 +1126,10 @@
11261126
::amp (if (empty? input)
11271127
(if (accept-nil? p1)
11281128
(explain-pred-list forms ps path via in (preturn p1))
1129-
(insufficient path (op-describe p1)))
1129+
(insufficient path (:amp p)))
11301130
(if-let [p1 (deriv p1 x)]
11311131
(explain-pred-list forms ps path via in (preturn p1))
1132-
(op-explain (op-describe p1) p1 path via in input)))
1132+
(op-explain (:amp p) p1 path via in input)))
11331133
::pcat (let [pkfs (map vector
11341134
ps
11351135
(c/or (seq ks) (repeat nil))

src/test/cljs/cljs/spec_test.cljs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@
298298
[{10 10 20 "x"}]
299299
[{10 10 20 "x"}]))
300300

301+
(deftest &-explain-pred
302+
(are [val expected]
303+
(= expected (-> (s/explain-data (s/& int? even?) val) ::s/problems first :pred))
304+
[] 'cljs.core/int?
305+
[0 2] '(cljs.spec.alpha/& cljs.core/int? cljs.core/even?)))
306+
301307
(s/fdef foo.bar/cljs-2275
302308
:args (s/cat :k keyword?)
303309
:ret string?)

0 commit comments

Comments
 (0)