diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-12-03 12:43:14 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-12-03 12:43:14 +0000 |
commit | b54379cd4084f6e0a4b74fe5000741e2529347ac (patch) | |
tree | 2b2c22299cfe6ff56d6e4e9efcda964eb885eb10 /src | |
parent | e257178bfdbde16e7e077623af5d14594354487b (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.clj | 11 |
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 [])) |