clojure.walk: preserve record types
walk treated a record as a plain map (record? implies map?), rebuilding it via (into (empty form) ...) which yields a bare map and drops the type. Add a record branch before the map branch that conj-es the walked entries back onto the original, matching JVM clojure.walk's IRecord case. Type-dispatched walks need it — integrant resolves #ig/ref by detecting its Ref record while postwalking the config, so without this every ref silently fails to resolve. clojure.walk is baked into the prelude, so the seed is re-minted. Corpus gains five JVM-certified rows for record type/instance? survival through pre/postwalk.
This commit is contained in:
parent
54c3c6dd2b
commit
ea609d72eb
4 changed files with 670 additions and 660 deletions
|
|
@ -7,6 +7,11 @@
|
|||
; vectors/maps first so seq? can't swallow them (a vector is not seq? on
|
||||
; jolt, but keep the concrete branches authoritative)
|
||||
(vector? form) (outer (vec (map inner form)))
|
||||
; a record is also map?, but (empty record) yields a plain map — rebuild by
|
||||
; conj-ing the walked entries back onto the original so the record TYPE
|
||||
; survives. Type-dispatched walks depend on it (e.g. integrant resolves
|
||||
; #ig/ref by detecting its Ref record while postwalking the config).
|
||||
(record? form) (outer (reduce (fn [r x] (conj r (inner x))) form form))
|
||||
(map? form) (outer (into (empty form) (map inner form)))
|
||||
; lists rebuild as lists, other seqs (incl. macro/template output: cons/
|
||||
; concat/lazy-seq) walk too — without this, postwalk-replace silently no-op'd
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue