From 79eeff5b5720a4e8325619d7018db1e5319624b0 Mon Sep 17 00:00:00 2001
From: Chouser <chouser@n01se.net>
Date: Sun, 21 Oct 2012 10:54:47 -0400
Subject: [PATCH] Add support for protocol fns to repl/source. CLJ-1088

---
 src/clj/clojure/repl.clj |   23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/clj/clojure/repl.clj b/src/clj/clojure/repl.clj
index 6c7cfde..eff4f75 100644
--- a/src/clj/clojure/repl.clj
+++ b/src/clj/clojure/repl.clj
@@ -141,17 +141,18 @@ itself (not its value) is returned. The reader macro #'x expands to (var x)."}})
   Example: (source-fn 'filter)"
   [x]
   (when-let [v (resolve x)]
-    (when-let [filepath (:file (meta v))]
-      (when-let [strm (.getResourceAsStream (RT/baseLoader) filepath)]
-        (with-open [rdr (LineNumberReader. (InputStreamReader. strm))]
-          (dotimes [_ (dec (:line (meta 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)))))))
+    (let [v (or (:protocol (meta v)) v)]
+      (when-let [filepath (:file (meta v))]
+        (when-let [strm (.getResourceAsStream (RT/baseLoader) filepath)]
+          (with-open [rdr (LineNumberReader. (InputStreamReader. strm))]
+            (dotimes [_ (dec (:line (meta 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
   "Prints the source code for the given symbol, if it can find it.
-- 
1.7.9.5

