aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/repl_utils.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/clojure/contrib/repl_utils.clj')
-rw-r--r--src/clojure/contrib/repl_utils.clj63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/clojure/contrib/repl_utils.clj b/src/clojure/contrib/repl_utils.clj
new file mode 100644
index 00000000..a61ee7f2
--- /dev/null
+++ b/src/clojure/contrib/repl_utils.clj
@@ -0,0 +1,63 @@
+; Copyright (c) Chris Houser, Dec 2008. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+; which can be found in the file CPL.TXT at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+; Utilities meant to be used interactively at the REPL
+
+(ns clojure.contrib.repl-utils
+ (:import (java.io LineNumberReader InputStreamReader PushbackReader)
+ (java.lang.reflect Modifier Method Constructor)
+ (clojure.lang RT))
+ (:use [clojure.contrib.str-utils :only (str-join)]))
+
+(defn show
+ ([x] (show x nil))
+ ([x i]
+ (let [c (if (class? x) x (class x))
+ items (sort
+ (for [m (concat (.getFields c)
+ (.getMethods c)
+ (.getConstructors c))]
+ (let [static? (bit-and Modifier/STATIC
+ (.getModifiers m))
+ method? (instance? Method m)
+ ctor? (instance? Constructor m)
+ text (if ctor?
+ (str "(" (str-join
+ ", " (.getParameterTypes m)) ")")
+ (str
+ (if (pos? static?) "static ")
+ (.getName m) " : "
+ (if method?
+ (str (.getReturnType m) " ("
+ (count (.getParameterTypes m)) ")")
+ (str (.getType m)))))]
+ [(- static?) method? text (str m) m])))]
+ (if i
+ (last (nth items i))
+ (do (println "=== " c " ===")
+ (doseq [[e i] (map list items (iterate inc 0))]
+ (printf "[%2d] %s\n" i (nth e 2))))))))
+
+(defn get-source [x]
+ (when-let [v (resolve x)]
+ (let [ns-name (str (.name (.ns v)))
+ path (first (re-seq #"^.*(?=/[^/]*$)" (.replace ns-name "." "/")))
+ fname (str path "/" (:file ^v))]
+ (when-let [strm (.getResourceAsStream RT/ROOT_CLASSLOADER fname)]
+ (with-open [rdr (LineNumberReader. (InputStreamReader. strm))]
+ (dotimes [_ (dec (:line ^v))] (.readLine rdr))
+ (let [text (StringBuilder.)
+ pbr (proxy [PushbackReader] [rdr]
+ (read [] (let [i (proxy-super read)]
+ (.append text (char i))
+ i)))]
+ (read (PushbackReader. pbr))
+ (str text)))))))
+
+(defmacro source [n]
+ `(println (or (get-source '~n) (str "Source not found"))))