From 016ec5562a1f596af07157e6c69bd5bedb8ee057 Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Tue, 23 Jun 2015 15:39:01 +1200 Subject: [PATCH 1/6] added cljs-devtools https://github.com/binaryage/cljs-devtools support --- src/clairvoyant/core.cljs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/clairvoyant/core.cljs b/src/clairvoyant/core.cljs index f3ae1a6..04b4ba9 100644 --- a/src/clairvoyant/core.cljs +++ b/src/clairvoyant/core.cljs @@ -60,25 +60,27 @@ (list 'fn (symbol name) arglist) (list 'fn arglist)))) - -(def default-tracer +(defn make-tracer + [str-fn log-to-console shorten-fns] (let [pr-val* (fn pr-val* [x] - (cond - (fn? x) - (fn-signature x) - (coll? x) - (walk pr-val* identity x) - :else x)) - pr-val (fn [x] (pr-str (pr-val* x))) + (cond + (fn? x) + (if shorten-fns + (fn-signature x) + x) + (coll? x) + (walk pr-val* identity x) + :else x)) + pr-val (fn [x] (str-fn (pr-val* x))) log-binding (fn [form init] - (.groupCollapsed js/console "%c%s %c%s" + (.groupCollapsed js/console "%c%s" "font-weight:bold;" (pr-str form) - "font-weight:normal;" (pr-val init))) log-exit (fn [exit] (.groupCollapsed js/console "=>" (pr-val exit)) - (.log js/console exit) + (when log-to-console + (.log js/console exit)) (.groupEnd js/console)) has-bindings? #{'fn* `fn @@ -161,3 +163,9 @@ (.groupEnd js/console) (.groupEnd js/console))) (.groupEnd js/console))))))) + +(def default-tracer + (make-tracer prn-str true true)) + +(def cljs-devtools-tracer + (make-tracer identity false false)) From a6f4f285f273808c3f537ccd66667dee29ef08a7 Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Wed, 24 Jun 2015 11:31:16 +1200 Subject: [PATCH 2/6] removed logging to console --- src/clairvoyant/core.cljs | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/clairvoyant/core.cljs b/src/clairvoyant/core.cljs index 04b4ba9..017927d 100644 --- a/src/clairvoyant/core.cljs +++ b/src/clairvoyant/core.cljs @@ -60,7 +60,11 @@ (list 'fn (symbol name) arglist) (list 'fn arglist)))) -(defn make-tracer +(defn make-tracer + "makes a tracer given parameters + - str-fn if true uses pr-str to format values + - log-to-console if true also logs values directly to console + - shorten-fns if true functions are found and shortened for printing" [str-fn log-to-console shorten-fns] (let [pr-val* (fn pr-val* [x] (cond @@ -71,17 +75,27 @@ (coll? x) (walk pr-val* identity x) :else x)) - pr-val (fn [x] (str-fn (pr-val* x))) + pr-val (fn [x] (if str-fn + (pr-str (pr-val* x)) + (pr-val* x))) log-binding (fn [form init] - (.groupCollapsed js/console "%c%s" - "font-weight:bold;" - (pr-str form) - (pr-val init))) + (if str-fn + (.groupCollapsed js/console "%c%s %c%s" + "font-weight:bold;" + (pr-str form) + "font-weight:normal;" + (pr-val init)) + (.groupCollapsed js/console "%c%s" + "font-weight:bold;" + (pr-str form) + (pr-val init)))) log-exit (fn [exit] - (.groupCollapsed js/console "=>" (pr-val exit)) - (when log-to-console - (.log js/console exit)) - (.groupEnd js/console)) + (if log-to-console + (do + (.groupCollapsed js/console "=>" (pr-val exit)) + (.log js/console exit) + (.groupEnd js/console)) + (.log js/console "=>" (pr-val exit)))) has-bindings? #{'fn* `fn 'fn @@ -165,7 +179,7 @@ (.groupEnd js/console))))))) (def default-tracer - (make-tracer prn-str true true)) + (make-tracer true true true)) (def cljs-devtools-tracer - (make-tracer identity false false)) + (make-tracer false false false)) From 7c7638224438d31f0c932561caa602995c0f722e Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Wed, 24 Jun 2015 16:57:52 +1200 Subject: [PATCH 3/6] removed make-tracer --- src/clairvoyant/core.cljs | 121 +++++++++++++++++++++++++++++--------- 1 file changed, 92 insertions(+), 29 deletions(-) diff --git a/src/clairvoyant/core.cljs b/src/clairvoyant/core.cljs index 017927d..eb553bc 100644 --- a/src/clairvoyant/core.cljs +++ b/src/clairvoyant/core.cljs @@ -60,42 +60,23 @@ (list 'fn (symbol name) arglist) (list 'fn arglist)))) -(defn make-tracer - "makes a tracer given parameters - - str-fn if true uses pr-str to format values - - log-to-console if true also logs values directly to console - - shorten-fns if true functions are found and shortened for printing" - [str-fn log-to-console shorten-fns] +(def default-tracer (let [pr-val* (fn pr-val* [x] (cond (fn? x) - (if shorten-fns - (fn-signature x) - x) + (fn-signature x) (coll? x) (walk pr-val* identity x) :else x)) - pr-val (fn [x] (if str-fn - (pr-str (pr-val* x)) - (pr-val* x))) + pr-val (fn [x] (pr-str (pr-val* x))) log-binding (fn [form init] - (if str-fn - (.groupCollapsed js/console "%c%s %c%s" - "font-weight:bold;" - (pr-str form) - "font-weight:normal;" - (pr-val init)) - (.groupCollapsed js/console "%c%s" - "font-weight:bold;" - (pr-str form) - (pr-val init)))) + (.groupCollapsed js/console "%c%s %c%s" + "font-weight:bold;" (pr-str form) + "font-weight:normal;" (pr-val init))) log-exit (fn [exit] - (if log-to-console - (do (.groupCollapsed js/console "=>" (pr-val exit)) (.log js/console exit) (.groupEnd js/console)) - (.log js/console "=>" (pr-val exit)))) has-bindings? #{'fn* `fn 'fn @@ -178,8 +159,90 @@ (.groupEnd js/console))) (.groupEnd js/console))))))) -(def default-tracer - (make-tracer true true true)) - (def cljs-devtools-tracer - (make-tracer false false false)) + (let [pr-val (fn pr-val [x] x) + log-binding (fn [form init] + (.groupCollapsed js/console "%c%s" + "font-weight:bold;" (pr-str form) + (pr-val init))) + log-exit (fn [exit] + (.log js/console "=>" (pr-val exit))) + has-bindings? #{'fn* + `fn + 'fn + 'defn + `defn + 'defmethod + `defmethod + 'deftype + `deftype + 'defrecord + `defrecord + 'reify + `reify + 'let + `let + 'extend-type + `extend-type + 'extend-protocol + `extend-protocol} + fn-like? (disj has-bindings? 'let `let)] + (reify + ITraceEnter + (-trace-enter + [_ {:keys [anonymous? arglist args dispatch-val form init name ns op protocol]}] + (cond + (fn-like? op) + (let [title (if protocol + (str protocol " " name " " arglist) + (str ns "/" name + (when dispatch-val + (str " " (pr-str dispatch-val))) + (str " " arglist) + (when anonymous? " (anonymous)"))) + arglist (remove '#{&} arglist)] + (.groupCollapsed js/console title) + (.groupCollapsed js/console "bindings")) + + (#{'let `let} op) + (let [title (str op)] + (.groupCollapsed js/console title) + (.groupCollapsed js/console "bindings")) + + (#{'binding} op) + (log-binding form init))) + + ITraceExit + (-trace-exit [_ {:keys [op exit]}] + (cond + (#{'binding} op) + (do (log-exit exit) + (.groupEnd js/console)) + + (has-bindings? op) + (do (.groupEnd js/console) + (log-exit exit) + (.groupEnd js/console)))) + + ITraceError + (-trace-error [_ {:keys [op form error ex-data]}] + (cond + (#{'binding} op) + (do + (.error js/console (.-stack error)) + (when ex-data + (.groupCollapsed js/console "ex-data") + (.groupCollapsed js/console (pr-val ex-data)) + (.groupEnd js/console) + (.groupEnd js/console))) + + (has-bindings? op) + (do (.groupEnd js/console) + (do + (.error js/console (.-stack error)) + (when ex-data + (.groupCollapsed js/console "ex-data") + (.groupCollapsed js/console (pr-val ex-data)) + (.groupEnd js/console) + (.groupEnd js/console))) + (.groupEnd js/console))))))) From e2366d5dddb5d22b24cc8beb22a314a6d8b34bde Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Wed, 24 Jun 2015 17:01:37 +1200 Subject: [PATCH 4/6] indentation fixes for PR --- src/clairvoyant/core.cljs | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/clairvoyant/core.cljs b/src/clairvoyant/core.cljs index eb553bc..0d82b4e 100644 --- a/src/clairvoyant/core.cljs +++ b/src/clairvoyant/core.cljs @@ -62,21 +62,23 @@ (def default-tracer (let [pr-val* (fn pr-val* [x] - (cond - (fn? x) - (fn-signature x) - (coll? x) - (walk pr-val* identity x) - :else x)) + (cond + (fn? x) + (fn-signature x) + (coll? x) + (walk pr-val* identity x) + :else x)) pr-val (fn [x] (pr-str (pr-val* x))) log-binding (fn [form init] - (.groupCollapsed js/console "%c%s %c%s" - "font-weight:bold;" (pr-str form) - "font-weight:normal;" (pr-val init))) + (.groupCollapsed js/console "%c%s %c%s" + "font-weight:bold;" + (pr-str form) + "font-weight:normal;" + (pr-val init))) log-exit (fn [exit] - (.groupCollapsed js/console "=>" (pr-val exit)) - (.log js/console exit) - (.groupEnd js/console)) + (.groupCollapsed js/console "=>" (pr-val exit)) + (.log js/console exit) + (.groupEnd js/console)) has-bindings? #{'fn* `fn 'fn @@ -163,8 +165,8 @@ (let [pr-val (fn pr-val [x] x) log-binding (fn [form init] (.groupCollapsed js/console "%c%s" - "font-weight:bold;" (pr-str form) - (pr-val init))) + "font-weight:bold;" (pr-str form) + (pr-val init))) log-exit (fn [exit] (.log js/console "=>" (pr-val exit))) has-bindings? #{'fn* From f916672c1bcc7d2adcf7259de390f03b13eecabe Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Wed, 24 Jun 2015 17:03:25 +1200 Subject: [PATCH 5/6] more whitespace --- src/clairvoyant/core.cljs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/clairvoyant/core.cljs b/src/clairvoyant/core.cljs index 0d82b4e..a6c7e18 100644 --- a/src/clairvoyant/core.cljs +++ b/src/clairvoyant/core.cljs @@ -60,6 +60,7 @@ (list 'fn (symbol name) arglist) (list 'fn arglist)))) + (def default-tracer (let [pr-val* (fn pr-val* [x] (cond @@ -70,10 +71,10 @@ :else x)) pr-val (fn [x] (pr-str (pr-val* x))) log-binding (fn [form init] - (.groupCollapsed js/console "%c%s %c%s" - "font-weight:bold;" + (.groupCollapsed js/console "%c%s %c%s" + "font-weight:bold;" (pr-str form) - "font-weight:normal;" + "font-weight:normal;" (pr-val init))) log-exit (fn [exit] (.groupCollapsed js/console "=>" (pr-val exit)) From 251680e7a785e331c23dc29d51bdc64aadc86416 Mon Sep 17 00:00:00 2001 From: Stuart Mitchell Date: Thu, 25 Jun 2015 10:42:34 +1200 Subject: [PATCH 6/6] changes to README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 95bc033..56eac82 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,10 @@ is not necessarily tied to logging to the console or printing to the screen. Since the trace values are just data the barrier to creativity is low. +An additional tracer that works well with [cljs-devtools] +(https://github.com/binaryage/cljs-devtools) is included as +`clairvoyant.core/cljs-devtools-tracer`. + ### Source code transformation