summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-12-03 12:43:14 +0000
committerRich Hickey <richhickey@gmail.com>2008-12-03 12:43:14 +0000
commitb54379cd4084f6e0a4b74fe5000741e2529347ac (patch)
tree2b2c22299cfe6ff56d6e4e9efcda964eb885eb10 /src
parente257178bfdbde16e7e077623af5d14594354487b (diff)
expose inherited protected fields that originate from farther
up the hierarchy than the super class, patch from Matt Revelle
Diffstat (limited to 'src')
-rw-r--r--src/clj/clojure/genclass.clj11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/clj/clojure/genclass.clj b/src/clj/clojure/genclass.clj
index 482f791e..6e590cea 100644
--- a/src/clj/clojure/genclass.clj
+++ b/src/clj/clojure/genclass.clj
@@ -57,6 +57,15 @@
(map escape-class-name pclasses)))
(str mname "-void")))
+(defn- find-field [#^Class c f]
+ (let [start-class c]
+ (loop [c c]
+ (if (= c Object)
+ (throw (new Exception (str "field, " f ", not defined in class, " start-class ", or its ancestors")))
+ (let [dflds (.getDeclaredFields c)
+ rfld (first (filter #(= f (.getName %)) dflds))]
+ (or rfld (recur (.getSuperclass c))))))))
+
;(distinct (map first(keys (mapcat non-private-methods [Object IPersistentMap]))))
(def #^{:private true} prim->class
@@ -373,7 +382,7 @@
(. gen (endMethod))))
;field exposers
(doseq [[f {getter :get setter :set}] exposes]
- (let [fld (.getDeclaredField super (str f))
+ (let [fld (find-field super (str f))
ftype (totype (.getType fld))]
(when getter
(let [m (new Method (str getter) ftype (to-types []))