Skip to content

Instantly share code, notes, and snippets.

@guns
Created May 1, 2014 17:10
Show Gist options
  • Save guns/621b622738baec56c4b9 to your computer and use it in GitHub Desktop.
Save guns/621b622738baec56c4b9 to your computer and use it in GitHub Desktop.
Type scaffolding of Clojure objects
(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