diff --git a/sci b/sci index c9081df5..79ae49fa 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c9081df5788f6336108bd530e0aa7da3d42d42bb +Subproject commit 79ae49faaedadfb4572b144b4f50744146416d48 diff --git a/src/babashka/impl/reify.clj b/src/babashka/impl/reify.clj index b355f5e6..6c97dac0 100644 --- a/src/babashka/impl/reify.clj +++ b/src/babashka/impl/reify.clj @@ -9,29 +9,48 @@ "Generates pre-compiled reify combinations" [methods] (let [subsets (rest (combo/subsets (seq methods)))] - (reduce (fn [opts classes] - (assoc opts - (set (map (fn [[class _]] - (list 'quote class)) - classes)) - (list 'fn ['methods] - (list* 'reify - (mapcat - (fn [[clazz methods]] - (cons clazz - (mapcat - (fn [[meth arities]] - (map - (fn [arity] - (list meth arity - (list* - (list 'get 'methods (list 'quote meth)) - arity))) - arities)) - methods))) - classes))))) + (reduce (fn [opts [classes protocols?]] + (let [prelude '[reify] + prelude (if protocols? + (conj prelude + 'sci.impl.types.IReified + '(getInterfaces [this] + interfaces) + '(getMethods [this] + methods) + '(getProtocols [this] + protocols)) + prelude)] + (assoc opts + (cond-> (set (map #(list 'quote %) + classes)) + protocols? + (conj (list 'quote 'sci.impl.IReified))) + (list 'fn ['interfaces 'methods 'protocols] + (concat prelude + (mapcat + (fn [[clazz methods]] + (cons clazz + (mapcat + (fn [[meth arities]] + (map + (fn [arity] + (list meth arity + (list* + (list 'get 'methods (list 'quote meth)) + arity))) + arities)) + methods))) + classes)))))) {} - subsets))) + (concat (map (fn [subset bool] + [subset bool]) + subsets + (repeat true)) + (map (fn [subset bool] + [subset bool]) + subsets + (repeat false)))))) #_(prn (macroexpand '(gen-reify-combos {java.io.FileFilter {accept [[this f]]}}))) @@ -39,9 +58,7 @@ #_:clj-kondo/ignore (def reify-opts (gen-reify-combos - {sci.impl.types.IReified {getMethods [[this]] - getInterfaces [[this]]} - java.nio.file.FileVisitor {preVisitDirectory [[this p attrs]] + {java.nio.file.FileVisitor {preVisitDirectory [[this p attrs]] postVisitDirectory [[this p attrs]] visitFile [[this p attrs]]} java.io.FileFilter {accept [[this f]]}