|
88 | 88 | (pr-str value)))
|
89 | 89 | (pr-str value)))
|
90 | 90 |
|
| 91 | +(defn send-value [request send-fn v] |
| 92 | + (let [[v opts] v |
| 93 | + sci-ns (:ns opts)] |
| 94 | + (reset! last-ns sci-ns) |
| 95 | + (sci/alter-var-root sci/*3 (constantly @sci/*2)) |
| 96 | + (sci/alter-var-root sci/*2 (constantly @sci/*1)) |
| 97 | + (sci/alter-var-root sci/*1 (constantly v)) |
| 98 | + (let [v (format-value (:nrepl.middleware.print/print request) |
| 99 | + (:nrepl.middleware.print/options request) |
| 100 | + v)] |
| 101 | + (send-fn request {"value" v |
| 102 | + "ns" (str sci-ns)})))) |
| 103 | + |
91 | 104 | (defn do-handle-eval [{:keys [ns code file
|
92 | 105 | _load-file? _line] :as request} send-fn]
|
93 |
| - (with-async-bindings |
94 |
| - {sci/ns ns |
95 |
| - sci/file file |
96 |
| - sci/print-length @sci/print-length |
97 |
| - sci/print-newline true} |
98 |
| - ;; we alter-var-root this because the print-fn may go out of scope in case |
99 |
| - ;; of returned delays |
100 |
| - (sci/alter-var-root sci/print-fn (constantly |
101 |
| - (fn [s] |
102 |
| - (send-fn request {"out" s})))) |
103 |
| - (-> (nbb/eval-next nil (sci/reader code) {:ns ns |
104 |
| - :file file |
105 |
| - :wrap vector}) |
106 |
| - (.then (fn [v] |
107 |
| - (let [[v opts] v |
108 |
| - sci-ns (:ns opts)] |
109 |
| - (reset! last-ns sci-ns) |
110 |
| - (sci/alter-var-root sci/*3 (constantly @sci/*2)) |
111 |
| - (sci/alter-var-root sci/*2 (constantly @sci/*1)) |
112 |
| - (sci/alter-var-root sci/*1 (constantly v)) |
113 |
| - (let [v (format-value (:nrepl.middleware.print/print request) |
114 |
| - (:nrepl.middleware.print/options request) |
115 |
| - v)] |
116 |
| - (send-fn request {"value" v |
117 |
| - "ns" (str sci-ns)}))) |
118 |
| - (send-fn request {"status" ["done"]}))) |
119 |
| - (.catch (fn [e] |
120 |
| - (sci/alter-var-root sci/*e (constantly e)) |
121 |
| - (let [data (ex-data e)] |
122 |
| - (when-let [message (or (:message data) (.-message e))] |
123 |
| - (send-fn request {"err" (str message "\n")})) |
124 |
| - (send-fn request {"ex" (str e) |
125 |
| - "ns" (str @sci/ns) |
126 |
| - "status" ["done"]}))))))) |
| 106 | + (let [rdr (sci/reader code) |
| 107 | + loop-fn (fn loop-fn [prev-val] |
| 108 | + (let [ns (or (:ns (second prev-val)) @last-ns ns) |
| 109 | + next-val (nbb/read-next rdr {:ns ns |
| 110 | + :file file |
| 111 | + :wrap vector})] |
| 112 | + (if (= :sci.core/eof next-val) |
| 113 | + (js/Promise.resolve prev-val) |
| 114 | + (let [v (nbb/eval-next* next-val {:ns ns |
| 115 | + :file file |
| 116 | + :wrap vector})] |
| 117 | + (.then v |
| 118 | + (fn [v] |
| 119 | + ;; (prn :v v) |
| 120 | + (send-value request send-fn v) |
| 121 | + (loop-fn v)))))))] |
| 122 | + (with-async-bindings |
| 123 | + {sci/ns ns |
| 124 | + sci/file file |
| 125 | + sci/print-length @sci/print-length |
| 126 | + sci/print-newline true} |
| 127 | + ;; we alter-var-root this because the print-fn may go out of scope in case |
| 128 | + ;; of returned delays |
| 129 | + (sci/alter-var-root sci/print-fn (constantly |
| 130 | + (fn [s] |
| 131 | + (send-fn request {"out" s})))) |
| 132 | + (-> (loop-fn nil) |
| 133 | + (.catch (fn [e] |
| 134 | + (sci/alter-var-root sci/*e (constantly e)) |
| 135 | + (let [data (ex-data e)] |
| 136 | + (when-let [message (or (:message data) (.-message e))] |
| 137 | + (send-fn request {"err" (str message "\n")})) |
| 138 | + (send-fn request {"ex" (str e) |
| 139 | + "ns" (str @sci/ns)})))) |
| 140 | + (.finally (fn [] |
| 141 | + (send-fn request {"ns" (str last-ns) |
| 142 | + "status" ["done"]}))))))) |
127 | 143 |
|
128 | 144 | (defn handle-eval [{:keys [ns] :as request} send-fn]
|
129 | 145 | (do-handle-eval (assoc request :ns (or (when ns
|
|
0 commit comments