Skip to content

Commit 623f563

Browse files
author
dnolen
committed
Same as Clojure 92df7b2a
1 parent 1942e70 commit 623f563

File tree

3 files changed

+19
-44
lines changed

3 files changed

+19
-44
lines changed

src/main/cljs/cljs/repl.cljs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,8 @@
4949
(when doc
5050
(println " " doc))))
5151
(when n
52-
(let [specs (spec/fn-specs (symbol (str (ns-name n)) (name nm)))]
53-
(when (some identity (vals specs))
54-
(print "Spec")
55-
(run! (fn [[role spec]]
56-
(when (and spec (not (= spec ::spec/unknown)))
57-
(print (str "\n " (name role) ":") (spec/describe spec))))
58-
specs)))))))
52+
(when-let [fnspec (spec/fn-spec (symbol (str (ns-name n)) (name nm)))]
53+
(print "Spec")
54+
(doseq [role [:args :ret :fn]]
55+
(when-let [spec (get fnspec role)]
56+
(print (str "\n " (name role) ":") (spec/describe spec)))))))))

src/main/cljs/cljs/spec.cljc

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,6 @@
273273
s
274274
(symbol (str (.-name *ns*)) (str s)))))
275275

276-
(defn- fn-spec-sym
277-
[env sym role]
278-
(symbol (str (ns-qualify env sym) "$" (name role))))
279-
280276
(def ^:private _speced_vars (atom #{}))
281277

282278
(defn speced-vars*
@@ -313,7 +309,7 @@ specified, return speced vars from all namespaces."
313309
314310
Qualifies fn-sym with resolve, or using *ns* if no resolution found.
315311
Registers specs in the global registry, where they can be retrieved
316-
by calling fn-specs.
312+
by calling fn-spec.
317313
318314
Once registered, function specs are included in doc, checked by
319315
instrument, tested by the runner clojure.spec.test/run-tests, and (if
@@ -332,18 +328,11 @@ specified, return speced vars from all namespaces."
332328
:str string?
333329
:sym symbol?)
334330
:ret symbol?)"
335-
[fn-sym & {:keys [args ret fn] :as m}]
331+
[fn-sym & specs]
336332
(let [env &env
337333
qn (ns-qualify env fn-sym)]
338334
(swap! _speced_vars conj qn)
339-
`(do ~@(reduce
340-
(clojure.core/fn [defns role]
341-
(if (contains? m role)
342-
(let [s (fn-spec-sym env qn (name role))]
343-
(conj defns `(cljs.spec/def '~s ~(get m role))))
344-
defns))
345-
[] [:args :ret :fn])
346-
'~qn)))
335+
`(cljs.spec/def '~qn (cljs.spec/fspec ~@specs))))
347336

348337
(defmacro with-instrument-disabled
349338
"Disables instrument's checking of calls, within a scope."

src/main/cljs/cljs/spec.cljs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,6 @@
254254

255255
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instrument ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256256

257-
(def ^:private fn-spec-roles [:args :ret :fn])
258-
259257
(defn- expect
260258
"Returns nil if v conforms to spec, else throws ex-info with explain-data."
261259
[spec v]
@@ -268,25 +266,15 @@
268266
(.-sym x)
269267
x))
270268

271-
(defn- fn-specs?
272-
"Fn-specs must include at least :args or :ret specs."
269+
(defn- fn-spec?
270+
"Fn-spec must include at least :args or :ret specs."
273271
[m]
274272
(c/or (:args m) (:ret m)))
275273

276-
(defn- fn-spec-sym
277-
[sym role]
278-
(symbol (str sym "$" (name role))))
279-
280-
(defn fn-specs
281-
"Returns :args/:ret/:fn map of specs for var or symbol v."
274+
(defn fn-spec
275+
"Returns fspec of specs for var or symbol v, or nil."
282276
[v]
283-
(let [s (->sym v)
284-
reg (registry)]
285-
(reduce
286-
(fn [m role]
287-
(assoc m role (get reg (fn-spec-sym s role))))
288-
{}
289-
fn-spec-roles)))
277+
(get (registry) (->sym v)))
290278

291279
(defn- spec-checking-fn
292280
[v f]
@@ -304,7 +292,7 @@
304292
[& args]
305293
(if *instrument-enabled*
306294
(s/with-instrument-disabled
307-
(let [specs (fn-specs v)]
295+
(let [specs (fn-spec v)]
308296
(let [cargs (when (:args specs) (conform! v :args (:args specs) args args))
309297
ret (binding [*instrument-enabled* true]
310298
(apply f args))
@@ -317,7 +305,7 @@
317305

318306
(defn- macroexpand-check
319307
[v args]
320-
(let [specs (fn-specs v)]
308+
(let [specs (fn-spec v)]
321309
(when-let [arg-spec (:args specs)]
322310
(when (= ::invalid (conform arg-spec args))
323311
(let [ed (assoc (explain-data* arg-spec [:args]
@@ -328,7 +316,7 @@
328316
"Call to " (->sym v) " did not conform to spec:\n"
329317
(with-out-str (explain-out ed))))))))))
330318

331-
(defn- no-fn-specs
319+
(defn- no-fn-spec
332320
[v specs]
333321
(ex-info (str "Fn at " (pr-str v) " is not spec'ed.")
334322
{:var v :specs specs}))
@@ -339,16 +327,16 @@
339327

340328
(defn instrument*
341329
[v]
342-
(let [specs (fn-specs v)]
343-
(if (fn-specs? specs)
330+
(let [spec (fn-spec v)]
331+
(if (fn-spec? spec)
344332
(locking instrumented-vars
345333
(let [{:keys [raw wrapped]} (get @instrumented-vars v)
346334
current @v]
347335
(when-not (= wrapped current)
348336
(let [checked (spec-checking-fn v current)]
349337
(swap! instrumented-vars assoc v {:raw current :wrapped checked})
350338
checked))))
351-
(throw (no-fn-specs v specs)))))
339+
(throw (no-fn-spec v spec)))))
352340

353341
(defn unstrument*
354342
[v]

0 commit comments

Comments
 (0)