diff --git a/src/main/cljs/clojure/walk.cljs b/src/main/cljs/clojure/walk.cljs index d92d61c91..871b769eb 100644 --- a/src/main/cljs/clojure/walk.cljs +++ b/src/main/cljs/clojure/walk.cljs @@ -43,10 +43,10 @@ the sorting function."} {:added "1.1"} [inner outer form] (cond - (list? form) (outer (apply list (map inner form))) + (list? form) (outer (with-meta (apply list (map inner form)) (meta form))) (map-entry? form) (outer (MapEntry. (inner (key form)) (inner (val form)) nil)) - (seq? form) (outer (doall (map inner form))) + (seq? form) (outer (with-meta (doall (map inner form)) (meta form))) (record? form) (outer (reduce (fn [r x] (conj r (inner x))) form form)) (coll? form) (outer (into (empty form) (map inner form))) :else (outer form))) diff --git a/src/test/cljs/cljs/walk_test.cljs b/src/test/cljs/cljs/walk_test.cljs index fb3476f53..483483732 100644 --- a/src/test/cljs/cljs/walk_test.cljs +++ b/src/test/cljs/cljs/walk_test.cljs @@ -7,7 +7,7 @@ ;; You must not remove this notice, or any other, from this software. (ns cljs.walk-test - (:require [cljs.test :refer-macros [deftest testing is]] + (:require [cljs.test :refer-macros [deftest testing is are]] [clojure.walk :as w])) (deftest t-prewalk-replace @@ -80,3 +80,14 @@ (let [coll [:html {:a ["b" 1]} ""] f (fn [e] (if (and (vector? e) (not (map-entry? e))) (apply list e) e))] (is (= (list :html {:a (list "b" 1)} "") (w/postwalk f coll))))) + +(defrecord RM [a]) +(deftest retain-meta + (let [m {:foo true}] + (are [o] (= m (meta (w/postwalk identity (with-meta o m)))) + '(1 2) + [1 2] + #{1 2} + {1 2} + (map inc (range 3)) + (->RM 1))))