Created
May 1, 2014 17:10
-
-
Save guns/621b622738baec56c4b9 to your computer and use it in GitHub Desktop.
Type scaffolding of Clojure objects
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn type-scaffold | |
"https://gist.github.com/mpenet/2053633, originally by cgrand" | |
[^Class cls] | |
(let [ms (map (fn [^Method m] | |
[(.getDeclaringClass m) | |
(symbol (.getName m)) | |
(map #(symbol (.getCanonicalName ^Class %)) (.getParameterTypes m))]) | |
(.getMethods cls)) | |
idecls (mapv (fn [[^Class cls ms]] | |
(let [decls (map (fn [[_ s ps]] (str (list s (into ['this] ps)))) | |
ms) | |
typ (if (.isInterface cls) "Interface" "Superclass")] | |
(str " ;; " typ | |
"\n " (.getCanonicalName cls) | |
"\n " (string/join "\n " decls)))) | |
(group-by first ms))] | |
idecls)) | |
(defn object-scaffold [obj] | |
(let [cls (if (class? obj) obj (class obj)) | |
decls (->> cls supers (mapcat type-scaffold) distinct sort)] | |
(string/join "\n\n" decls))) | |
;; Produces output like: | |
(object-scaffold []) | |
;; Interface | |
clojure.lang.Associative | |
(assoc [this java.lang.Object java.lang.Object]) | |
(containsKey [this java.lang.Object]) | |
(entryAt [this java.lang.Object]) | |
;; Interface | |
clojure.lang.Counted | |
(count [this]) | |
;; Interface | |
clojure.lang.IEditableCollection | |
(asTransient [this]) | |
;; Interface | |
clojure.lang.IFn | |
(applyTo [this clojure.lang.ISeq]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object[]]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
;; Interface | |
clojure.lang.IHashEq | |
(hasheq [this]) | |
;; Interface | |
clojure.lang.ILookup | |
(valAt [this java.lang.Object]) | |
(valAt [this java.lang.Object java.lang.Object]) | |
;; Interface | |
clojure.lang.IMeta | |
(meta [this]) | |
;; Interface | |
clojure.lang.IObj | |
(withMeta [this clojure.lang.IPersistentMap]) | |
;; Interface | |
clojure.lang.IPersistentCollection | |
(count [this]) | |
(empty [this]) | |
(cons [this java.lang.Object]) | |
;; Interface | |
clojure.lang.IPersistentCollection | |
(equiv [this java.lang.Object]) | |
(count [this]) | |
(empty [this]) | |
(cons [this java.lang.Object]) | |
;; Interface | |
clojure.lang.IPersistentStack | |
(pop [this]) | |
;; Interface | |
clojure.lang.IPersistentStack | |
(pop [this]) | |
(peek [this]) | |
;; Interface | |
clojure.lang.IPersistentVector | |
(assocN [this int java.lang.Object]) | |
(cons [this java.lang.Object]) | |
;; Interface | |
clojure.lang.IPersistentVector | |
(assocN [this int java.lang.Object]) | |
(length [this]) | |
(cons [this java.lang.Object]) | |
;; Interface | |
clojure.lang.Indexed | |
(nth [this int]) | |
;; Interface | |
clojure.lang.Indexed | |
(nth [this int]) | |
(nth [this int java.lang.Object]) | |
;; Interface | |
clojure.lang.Reversible | |
(rseq [this]) | |
;; Interface | |
clojure.lang.Seqable | |
(seq [this]) | |
;; Interface | |
java.lang.Comparable | |
(compareTo [this java.lang.Object]) | |
;; Interface | |
java.lang.Iterable | |
(iterator [this]) | |
;; Interface | |
java.lang.Runnable | |
(run [this]) | |
;; Interface | |
java.util.Collection | |
(add [this java.lang.Object]) | |
(remove [this java.lang.Object]) | |
(equals [this java.lang.Object]) | |
(hashCode [this]) | |
(clear [this]) | |
(isEmpty [this]) | |
(contains [this java.lang.Object]) | |
(size [this]) | |
(toArray [this]) | |
(toArray [this java.lang.Object[]]) | |
(addAll [this java.util.Collection]) | |
(iterator [this]) | |
(containsAll [this java.util.Collection]) | |
(removeAll [this java.util.Collection]) | |
(retainAll [this java.util.Collection]) | |
;; Interface | |
java.util.List | |
(add [this java.lang.Object]) | |
(add [this int java.lang.Object]) | |
(remove [this java.lang.Object]) | |
(remove [this int]) | |
(get [this int]) | |
(equals [this java.lang.Object]) | |
(hashCode [this]) | |
(indexOf [this java.lang.Object]) | |
(clear [this]) | |
(isEmpty [this]) | |
(lastIndexOf [this java.lang.Object]) | |
(contains [this java.lang.Object]) | |
(size [this]) | |
(subList [this int int]) | |
(toArray [this]) | |
(toArray [this java.lang.Object[]]) | |
(addAll [this java.util.Collection]) | |
(addAll [this int java.util.Collection]) | |
(iterator [this]) | |
(set [this int java.lang.Object]) | |
(containsAll [this java.util.Collection]) | |
(removeAll [this java.util.Collection]) | |
(retainAll [this java.util.Collection]) | |
(listIterator [this]) | |
(listIterator [this int]) | |
;; Interface | |
java.util.concurrent.Callable | |
(call [this]) | |
;; Superclass | |
clojure.lang.AFn | |
(call [this]) | |
(applyTo [this clojure.lang.ISeq]) | |
(applyToHelper [this clojure.lang.IFn clojure.lang.ISeq]) | |
(throwArity [this int]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object[]]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object]) | |
(invoke [this]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(run [this]) | |
;; Superclass | |
clojure.lang.AFn | |
(call [this]) | |
(applyTo [this clojure.lang.ISeq]) | |
(applyToHelper [this clojure.lang.IFn clojure.lang.ISeq]) | |
(throwArity [this int]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object[]]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object]) | |
(invoke [this]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(invoke [this java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object java.lang.Object]) | |
(run [this]) | |
;; Superclass | |
clojure.lang.APersistentVector | |
(hasheq [this]) | |
(assoc [this java.lang.Object java.lang.Object]) | |
(assoc [this java.lang.Object java.lang.Object]) | |
(nth [this int java.lang.Object]) | |
(valAt [this java.lang.Object]) | |
(valAt [this java.lang.Object java.lang.Object]) | |
(equiv [this java.lang.Object]) | |
(rseq [this]) | |
(invoke [this java.lang.Object]) | |
(add [this int java.lang.Object]) | |
(add [this java.lang.Object]) | |
(remove [this int]) | |
(remove [this java.lang.Object]) | |
(get [this int]) | |
(equals [this java.lang.Object]) | |
(toString [this]) | |
(hashCode [this]) | |
(compareTo [this java.lang.Object]) | |
(indexOf [this java.lang.Object]) | |
(clear [this]) | |
(length [this]) | |
(isEmpty [this]) | |
(lastIndexOf [this java.lang.Object]) | |
(contains [this java.lang.Object]) | |
(size [this]) | |
(subList [this int int]) | |
(toArray [this]) | |
(toArray [this java.lang.Object[]]) | |
(addAll [this int java.util.Collection]) | |
(addAll [this java.util.Collection]) | |
(iterator [this]) | |
(containsKey [this java.lang.Object]) | |
(set [this int java.lang.Object]) | |
(seq [this]) | |
(containsAll [this java.util.Collection]) | |
(removeAll [this java.util.Collection]) | |
(retainAll [this java.util.Collection]) | |
(listIterator [this int]) | |
(listIterator [this]) | |
(peek [this]) | |
(entryAt [this java.lang.Object]) | |
;; Superclass | |
java.lang.Object | |
(wait [this long int]) | |
(wait [this long]) | |
(wait [this]) | |
(equals [this java.lang.Object]) | |
(toString [this]) | |
(hashCode [this]) | |
(getClass [this]) | |
(notify [this]) | |
(notifyAll [this]) | |
;; Superclass | |
java.lang.Object | |
(wait [this long int]) | |
(wait [this long]) | |
(wait [this]) | |
(getClass [this]) | |
(notify [this]) | |
(notifyAll [this]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment