Skip to content

Commit 3b51a7f

Browse files
committed
need to thread env through for resolve to work
1 parent ad4561c commit 3b51a7f

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

src/main/clojure/cljs/spec.clj

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
; You must not remove this notice, or any other, from this software.
88

99
(ns cljs.spec
10-
(:refer-clojure :exclude [+ * and or cat def keys])
11-
(:require [cljs.core :as c]
10+
(:refer-clojure :exclude [+ * and or cat def keys resolve])
11+
(:require [cljs.analyzer.api :refer [resolve]]
1212
[clojure.walk :as walk]
1313
[cljs.spec.gen :as gen]
1414
[clojure.string :as str]))
1515

16+
(alias 'c 'clojure.core)
17+
1618
(defn- ->sym
1719
"Returns a symbol from a symbol or var"
1820
[x]
@@ -30,18 +32,18 @@
3032
(conj (walk/postwalk-replace {s '%} form) '[%] 'fn))
3133
expr))
3234

33-
(defn- res [form]
35+
(defn- res [env form]
3436
(cond
3537
(keyword? form) form
36-
(symbol? form) (c/or (-> form resolve ->sym) form)
37-
(sequential? form) (walk/postwalk #(if (symbol? %) (res %) %) (unfn form))
38+
(symbol? form) (c/or (->> form (resolve env) ->sym) form)
39+
(sequential? form) (walk/postwalk #(if (symbol? %) (res env %) %) (unfn form))
3840
:else form))
3941

4042
(defmacro def
4143
"Given a namespace-qualified keyword or symbol k, and a spec, spec-name, predicate or regex-op
4244
makes an entry in the registry mapping k to the spec"
4345
[k spec-form]
44-
`(cljs.spec/def-impl ~k '~(res spec-form) ~spec-form))
46+
`(cljs.spec/def-impl ~k '~(res &env spec-form) ~spec-form))
4547

4648
(defmacro spec
4749
"Takes a single predicate form, e.g. can be the name of a predicate,
@@ -59,7 +61,7 @@
5961
6062
Returns a spec."
6163
[form & {:keys [gen]}]
62-
`(cljs.spec/spec-impl '~(res form) ~form ~gen nil))
64+
`(cljs.spec/spec-impl '~(res &env form) ~form ~gen nil))
6365

6466
(defmacro multi-spec
6567
"Takes the name of a spec/predicate-returning multimethod and a
@@ -88,7 +90,7 @@
8890
though those values are not evident in the spec.
8991
"
9092
[mm retag]
91-
`(cljs.spec/multi-spec-impl '~(res mm) (var ~mm) ~retag))
93+
`(cljs.spec/multi-spec-impl '~(res &env mm) (var ~mm) ~retag))
9294

9395
(defmacro keys
9496
"Creates and returns a map validating spec. :req and :opt are both
@@ -174,19 +176,19 @@
174176
Returns a spec that returns the conformed value. Successive
175177
conformed values propagate through rest of predicates."
176178
[& pred-forms]
177-
`(cljs.spec/and-spec-impl '~(mapv res pred-forms) ~(vec pred-forms) nil))
179+
`(cljs.spec/and-spec-impl '~(mapv #(res &env %) pred-forms) ~(vec pred-forms) nil))
178180

179181
(defmacro *
180182
"Returns a regex op that matches zero or more values matching
181183
pred. Produces a vector of matches iff there is at least one match"
182184
[pred-form]
183-
`(cljs.spec/rep-impl '~(res pred-form) ~pred-form))
185+
`(cljs.spec/rep-impl '~(res &env pred-form) ~pred-form))
184186

185187
(defmacro +
186188
"Returns a regex op that matches one or more values matching
187189
pred. Produces a vector of matches"
188190
[pred-form]
189-
`(cljs.spec/rep+impl '~(res pred-form) ~pred-form))
191+
`(cljs.spec/rep+impl '~(res &env pred-form) ~pred-form))
190192

191193
(defmacro ?
192194
"Returns a regex op that matches zero or one value matching
@@ -248,28 +250,29 @@
248250
Optionally takes :gen generator-fn, which must be a fn of no args
249251
that returns a test.check generator."
250252
[& {:keys [args ret fn gen]}]
251-
`(cljs.spec/fspec-impl ~args '~(res args) ~ret '~(res ret) ~fn '~(res fn) ~gen))
253+
(let [env &env]
254+
`(cljs.spec/fspec-impl ~args '~(res env args) ~ret '~(res env ret) ~fn '~(res env fn) ~gen)))
252255

253256
(defmacro tuple
254257
"takes one or more preds and returns a spec for a tuple, a vector
255258
where each element conforms to the corresponding pred. Each element
256259
will be referred to in paths using its ordinal."
257260
[& preds]
258261
(assert (not (empty? preds)))
259-
`(cljs.spec/tuple-impl '~(mapv res preds) ~(vec preds)))
262+
`(cljs.spec/tuple-impl '~(mapv #(res &env %) preds) ~(vec preds)))
260263

261264
(defn- ns-qualify
262265
"Qualify symbol s by resolving it or using the current *ns*."
263-
[s]
264-
(if-let [resolved (resolve s)]
266+
[env s]
267+
(if-let [resolved (resolve env s)]
265268
(->sym resolved)
266269
(if (namespace s)
267270
s
268271
(symbol (str (.name *ns*)) (str s)))))
269272

270273
(defn- fn-spec-sym
271-
[sym role]
272-
(symbol (str (ns-qualify sym) "$" (name role))))
274+
[env sym role]
275+
(symbol (str (ns-qualify env sym) "$" (name role))))
273276

274277
(defmacro fdef
275278
"Takes a symbol naming a function, and one or more of the following:
@@ -304,11 +307,12 @@
304307
:sym symbol?)
305308
:ret symbol?)"
306309
[fn-sym & {:keys [args ret fn] :as m}]
307-
(let [qn (ns-qualify fn-sym)]
310+
(let [env &env
311+
qn (ns-qualify env fn-sym)]
308312
`(do ~@(reduce
309313
(c/fn [defns role]
310314
(if (contains? m role)
311-
(let [s (fn-spec-sym qn (name role))]
315+
(let [s (fn-spec-sym env qn (name role))]
312316
(conj defns `(cljs.spec/def '~s ~(get m role))))
313317
defns))
314318
[] [:args :ret :fn])

0 commit comments

Comments
 (0)