Skip to content

Commit c4ebc0a

Browse files
CLJ-2429 datafy JavaReflector, fix do-reflect for arrays and primitives
Signed-off-by: Stuart Halloway <stu@cognitect.com>
1 parent 4d2a7db commit c4ebc0a

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/clj/clojure/reflect/java.clj

+15-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
;; Java-specific parts of clojure.reflect
1010
(in-ns 'clojure.reflect)
1111

12-
(require '[clojure.set :as set]
12+
(require '[clojure.datafy :refer (datafy)]
13+
'[clojure.set :as set]
1314
'[clojure.string :as str])
1415
(import '[clojure.asm ClassReader ClassVisitor Type Opcodes]
1516
'[java.lang.reflect Modifier]
@@ -34,9 +35,12 @@
3435
"Given a typeref, create a legal Clojure symbol version of the
3536
type's name."
3637
[t]
37-
(-> (typename t)
38-
(str/replace "[]" "<>")
39-
(symbol)))
38+
(cond->
39+
(-> (typename t)
40+
(str/replace "[]" "<>")
41+
(symbol))
42+
(class? t) (with-meta {'clojure.core.protocols/datafy
43+
(fn [_] (datafy t))})))
4044

4145
(defn- resource-name
4246
"Given a typeref, return implied resource name. Used by Reflectors
@@ -163,10 +167,16 @@ the kinds of objects to which they can apply."}
163167
field->map
164168
(.getDeclaredFields cls))))
165169

170+
(defn- typeref->class
171+
[typeref classloader]
172+
(if (class? typeref)
173+
typeref
174+
(clojure.lang.RT/classForName (typename typeref) false classloader)))
175+
166176
(deftype JavaReflector [classloader]
167177
Reflector
168178
(do-reflect [_ typeref]
169-
(let [cls (clojure.lang.RT/classForName (typename typeref) false classloader)]
179+
(let [cls (typeref->class typeref classloader)]
170180
{:bases (not-empty (set (map typesym (bases cls))))
171181
:flags (parse-flags (.getModifiers cls) :class)
172182
:members (set/union (declared-fields cls)

0 commit comments

Comments
 (0)