When there is a instrumentation failure for a function, the explain-data includes "caller" information. However, this information is missing if the instrumentation failure is for a macro.
This comment has led me to believe that the intended behavior is for explain-data to contain this info, so third-party error printers can display it.
In the repro below, I'm setting up a custom printer just to capture the raw explain-data (it's not a useful printer, just a means to show what is happenening)
Repro:
(require '[clojure.spec.alpha :as s])
(require '[clojure.spec.test.alpha :as st])
(require '[clojure.specs.alpha :as s])
(s/fdef my-fn
:args (s/cat :x int?))
(defn my-fn [x]
x)
(s/fdef my-macro
:args (s/cat :x int?))
(defmacro my-macro [x]
x)
(st/instrument)
(def !ed (atom nil))
(set! s/*explain-out* (fn [ed]
(reset! !ed ed)))
(my-fn "")
@!ed
;; {:clojure.spec.alpha/problems [{:path [:args :x], :pred clojure.core/int?, :val "", :via [], :in [0]}], :clojure.spec.alpha/spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x72029b0e "clojure.spec.alpha$regex_spec_impl$reify__2436@72029b0e"], :clojure.spec.alpha/value (""), :clojure.spec.alpha/args (""), :clojure.spec.alpha/failure :instrument, :clojure.spec.test.alpha/caller {:file "form-init8333540581183382896.clj", :line 548, :var-scope expound.alpha/eval27394}}
;; ^--- Note there is an entry for :clojure.spec.test.alpha/caller
(my-macro "")
@!ed
;; #:clojure.spec.alpha{:problems [{:path [:args :x], :pred clojure.core/int?, :val "", :via [], :in [0]}], :spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x479a6a73 "clojure.spec.alpha$regex_spec_impl$reify__2436@479a6a73"], :value (""), :args ("")}
;; ^--- No caller information