java2dot.clj |
||
| whoCreated: chouser | whenCreated: 2008-03-13 14:54:25 | mimetype: text/clojure |
| download paste more | ||
(def srcpath "/home/chouser/build/clojure/src/jvm/clojure/lang/")
(defn system [cmd writedata]
(let [proc (.. java.lang.Runtime (getRuntime) (exec (into-array cmd)))
isr (new java.io.InputStreamReader
(. proc (getInputStream)) "ISO-8859-1")
osr (new java.io.OutputStreamWriter (. proc (getOutputStream)))
baos (new java.io.ByteArrayOutputStream)]
(. osr (write writedata))
(. osr (close))
(loop [c (. isr (read))]
(if (neg? c)
(do (. proc (waitFor))
(. baos (toByteArray)))
(do (. baos (write c))
(recur (. isr (read))))))))
(defmacro str-for [& for-stuff]
`(apply str (for ~@for-stuff)))
(def dotstr (str
"digraph {\n"
" rankdir=LR;\n"
" dpi=55;\n"
" nodesep=0.10;\n"
" node[ fontname=Helvetica ];\n"
(str-for [file (. (new java.io.File srcpath) (listFiles))]
(when-not (. file (isDirectory))
(with-open rdr (new java.io.BufferedReader (new java.io.FileReader file))
(str-for [line (line-seq rdr)]
(let [[line name subs]
(re-matches #"public.* (?:class|interface) (\\w+) (.*)" line)]
(when name
(str-for [[subline sub] (re-seq #"(\\w+)(?:<[^>]*>)?" subs)]
(when-not (#{"extends" "implements"} sub)
(str " " name " -> " sub ";\n")))))))))
"}\n"))
;(print dotstr)
(def png (system ["dot" "-Tpng"] dotstr))
(doto (new javax.swing.JFrame "Clojure Classes")
(add (new javax.swing.JLabel (new javax.swing.ImageIcon png)))
(setVisible true))