|
1 | 1 | (ns cider.nrepl.middleware.pprint
|
2 | 2 | (:require
|
3 | 3 | [cider.nrepl.middleware.util.cljs :as cljs]
|
4 |
| - [clojure.pprint :refer [pprint *print-right-margin*]] |
| 4 | + cider.nrepl.pprint |
| 5 | + [clojure.walk :as walk] |
5 | 6 | [nrepl.middleware.interruptible-eval :refer [*msg*]]
|
6 | 7 | [nrepl.middleware.pr-values :refer [pr-values]]
|
7 | 8 | [nrepl.middleware.session :as session]
|
|
17 | 18 |
|
18 | 19 | ;; TODO: Remove this middleware (or make it a no-op).
|
19 | 20 |
|
20 |
| -;; fipp-printer and puget-printer are not loaded in the main `(ns)` form |
21 |
| -;; because they are optional features that take hundreds of milliseconds |
22 |
| -;; to load. Therefore, we delay the require/resolve process of the alternate |
23 |
| -;; pprint features until the user tries to use it. |
24 |
| - |
25 |
| -(def ^:private fipp-printer |
26 |
| - (delay |
27 |
| - (do |
28 |
| - (require 'fipp.edn) |
29 |
| - (resolve 'fipp.edn/pprint)))) |
30 |
| - |
31 |
| -(defn fipp-pprint [object] |
32 |
| - (@fipp-printer object {:width (or *print-right-margin* 72)})) |
33 |
| - |
34 |
| -(def ^:private puget-printer |
35 |
| - (delay |
36 |
| - (do |
37 |
| - (require 'puget.printer) |
38 |
| - (resolve 'puget.printer/pprint)))) |
39 |
| - |
40 |
| -(defn puget-pprint [object] |
41 |
| - (@puget-printer object {:width (or *print-right-margin* 72) |
42 |
| - :seq-limit *print-length*})) |
43 |
| - |
44 | 21 | (defn- resolve-pprint-fn
|
45 | 22 | [sym]
|
46 | 23 | (if-let [pp-fn (-> sym u/as-sym find-var)]
|
|
49 | 26 |
|
50 | 27 | (defn handle-pprint-fn
|
51 | 28 | [handler msg]
|
52 |
| - (let [{:keys [pprint-fn print-length print-level print-meta print-right-margin session] |
53 |
| - :or {pprint-fn 'clojure.pprint/pprint}} |
| 29 | + (let [{:keys [pprint-fn print-options session] |
| 30 | + :or {pprint-fn 'cider.nrepl.pprint/pprint}} |
54 | 31 | msg]
|
55 |
| - (handler (assoc msg :pprint-fn (fn [object] |
56 |
| - (binding [*print-length* (or print-length (get @session #'*print-length*)) |
57 |
| - *print-level* (or print-level (get @session #'*print-level*)) |
58 |
| - *print-meta* (or print-meta (get @session #'*print-meta*)) |
59 |
| - ;; pprint/*print-right-margin* is not bound by session middleware |
60 |
| - *print-right-margin* (or print-right-margin *print-right-margin*)] |
61 |
| - ((resolve-pprint-fn pprint-fn) object))))))) |
62 |
| - |
63 |
| -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
64 |
| - |
65 |
| -(defn- pprint-writer |
66 |
| - [{:keys [session transport] :as msg}] |
67 |
| - (#'session/session-out :pprint-out (:id (meta session)) transport)) |
68 |
| - |
69 |
| -(defn pprint-reply |
70 |
| - [{:keys [pprint-fn session transport] :as msg} response] |
71 |
| - (with-open [writer (pprint-writer msg)] |
72 |
| - ;; Binding `*msg*` sets the `:id` slot when printing to an nREPL session |
73 |
| - ;; PrintWriter (as created by `pprint-writer`), which the client requires to |
74 |
| - ;; handle the response correctly. |
75 |
| - (binding [*msg* msg |
76 |
| - *out* writer] |
77 |
| - (let [value (cljs/response-value msg response) |
78 |
| - print-fn (if (string? value) println pprint-fn)] |
79 |
| - (print-fn value)))) |
80 |
| - (transport/send transport (response-for msg :pprint-sentinel {}))) |
81 |
| - |
82 |
| -(defn pprint-transport |
83 |
| - [{:keys [right-margin ^Transport transport] :as msg}] |
84 |
| - (reify Transport |
85 |
| - (recv [this] (.recv transport)) |
86 |
| - (recv [this timeout] (.recv transport timeout)) |
87 |
| - (send [this response] |
88 |
| - (when (contains? response :value) |
89 |
| - (pprint-reply msg response)) |
90 |
| - (.send transport (dissoc response :value))))) |
91 |
| - |
92 |
| -(defn handle-pprint |
93 |
| - [handler msg] |
94 |
| - (let [{:keys [op pprint]} msg] |
95 |
| - (handler (if (and pprint (#{"eval" "load-file"} op)) |
96 |
| - (assoc msg :transport (pprint-transport msg)) |
97 |
| - msg)))) |
| 32 | + (handler (assoc msg |
| 33 | + :pprint-fn (resolve-pprint-fn pprint-fn) |
| 34 | + :print-options (walk/keywordize-keys print-options))))) |
0 commit comments