From a426cddd4a58dd527b6362ba4db57d534acca4bb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 13 Mar 2021 17:25:24 +0100 Subject: [PATCH] proxy + protocols --- sci | 2 +- src/babashka/impl/proxy.clj | 10 ++++++++-- test/babashka/proxy_test.clj | 18 +++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/sci b/sci index 139df5af..bf0fc870 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 139df5af5ab8e80a4988db45f1c7110ff40f3e8f +Subproject commit bf0fc870e5d9060ea79dd49594487d600bb64571 diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index 4dd06fe4..790a358b 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -15,11 +15,17 @@ (defn class-name [^Class clazz] (.getName clazz)) -(defn proxy-fn [{:keys [class interfaces methods]}] +(defn proxy-fn [{:keys [class interfaces protocols methods]}] (let [interfaces (set (map class-name interfaces))] (case [(class-name class) interfaces ] ["clojure.lang.APersistentMap" #{"clojure.lang.IMeta" "clojure.lang.IObj"}] - (proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj] [] + (proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj sci.impl.types.IReified] [] + (getInterfaces [] + interfaces) + (getMethods [] + methods) + (getProtocols [] + protocols) (iterator [] ((method-or-bust methods 'iterator) this)) (containsKey [k] ((method-or-bust methods 'containsKey) this k)) (entryAt [k] ((method-or-bust methods 'entryAt) this k)) diff --git a/test/babashka/proxy_test.clj b/test/babashka/proxy_test.clj index e4213f10..bfd05534 100644 --- a/test/babashka/proxy_test.clj +++ b/test/babashka/proxy_test.clj @@ -12,6 +12,8 @@ (def code '(do + (require '[clojure.core.protocols]) + (require '[clojure.datafy :as d]) (defn auto-deref "If value implements IDeref, deref it, otherwise return original." [x] @@ -21,7 +23,7 @@ (defn proxy-deref-map {:added "1.0"} [m] - (proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj] + (proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj clojure.core.protocols.Datafiable] [] (iterator [] ::TODO) @@ -39,7 +41,9 @@ (key [] k) (val [] (auto-deref (get m k))))) m)) (withMeta [md] (proxy-deref-map (with-meta m md))) - (meta [] (meta m)))) + (meta [] (meta m)) + + (datafy [] {:datafied true}))) (let [m (proxy-deref-map {:a (delay 1) :b (delay 2) @@ -58,11 +62,15 @@ (contains? :a)) (seq m) (meta (with-meta m {:a 1})) - ]))) + (d/datafy m) + ,]))) + +(require 'clojure.pprint) (deftest APersistentMap-proxy-test (is (= [1 2 3 true [:c 3] 5 3 5 false '([:a 1] [:b 2] [:c 3]) - {:a 1}] - (bb code)))) + {:a 1} + {:datafied true}] + (bb (with-out-str (clojure.pprint/pprint code))))))