|
206 | 206 | (defn compilable? [input]
|
207 | 207 | (contains? input :source-file))
|
208 | 208 |
|
| 209 | +(defn- load-sources |
| 210 | + "Load the compiled `sources` into the REPL." |
| 211 | + [repl-env sources opts] |
| 212 | + (if (:output-dir opts) |
| 213 | + ;; REPLs that read from :output-dir just need to add deps, |
| 214 | + ;; environment will handle actual loading - David |
| 215 | + (let [sb (StringBuffer.)] |
| 216 | + (doseq [source sources] |
| 217 | + (with-open [rdr (io/reader (:url source))] |
| 218 | + (.append sb (cljsc/add-dep-string opts source)))) |
| 219 | + (when (:repl-verbose opts) |
| 220 | + (println (.toString sb))) |
| 221 | + (-evaluate repl-env "<cljs repl>" 1 (.toString sb))) |
| 222 | + ;; REPLs that stream must manually load each dep - David |
| 223 | + (doseq [{:keys [url provides]} sources] |
| 224 | + (-load repl-env provides url)))) |
| 225 | + |
| 226 | +(defn- load-cljs-loader |
| 227 | + "Compile and load the cljs.loader namespace if it's present in `sources`." |
| 228 | + [repl-env sources opts] |
| 229 | + (when-let [source (first (filter #(= (:ns %) 'cljs.loader) sources))] |
| 230 | + (cljsc/compile-loader sources opts) |
| 231 | + (load-sources repl-env [source] opts))) |
| 232 | + |
209 | 233 | (defn load-namespace
|
210 | 234 | "Load a namespace and all of its dependencies into the evaluation environment.
|
211 |
| - The environment is responsible for ensuring that each namespace is loaded once and |
212 |
| - only once." |
| 235 | + The environment is responsible for ensuring that each namespace is |
| 236 | + loaded once and only once. Returns the compiled sources." |
213 | 237 | ([repl-env ns] (load-namespace repl-env ns nil))
|
214 | 238 | ([repl-env ns opts]
|
215 | 239 | (let [ns (if (and (seq? ns) (= (first ns) 'quote)) (second ns) ns)
|
|
221 | 245 | (merge (env->opts repl-env) opts))
|
222 | 246 | (remove (comp #{["goog"]} :provides)))
|
223 | 247 | (map #(cljsc/source-on-disk opts %)
|
224 |
| - (cljsc/add-js-sources [input] opts))))))] |
| 248 | + (cljsc/add-js-sources [input] opts))))))] |
225 | 249 | (when (:repl-verbose opts)
|
226 | 250 | (println (str "load-namespace " ns " , compiled:") (map :provides sources)))
|
227 |
| - (if (:output-dir opts) |
228 |
| - ;; REPLs that read from :output-dir just need to add deps, |
229 |
| - ;; environment will handle actual loading - David |
230 |
| - (let [sb (StringBuffer.)] |
231 |
| - (doseq [source sources] |
232 |
| - (with-open [rdr (io/reader (:url source))] |
233 |
| - (.append sb |
234 |
| - (cljsc/add-dep-string opts source)))) |
235 |
| - (when (:repl-verbose opts) |
236 |
| - (println (.toString sb))) |
237 |
| - (-evaluate repl-env "<cljs repl>" 1 (.toString sb))) |
238 |
| - ;; REPLs that stream must manually load each dep - David |
239 |
| - (doseq [{:keys [url provides]} sources] |
240 |
| - (-load repl-env provides url)))))) |
| 251 | + (load-sources repl-env sources opts) |
| 252 | + sources))) |
241 | 253 |
|
242 | 254 | (defn- load-dependencies
|
243 |
| - ([repl-env requires] (load-dependencies repl-env requires nil)) |
| 255 | + "Compile and load the given `requires` and return the compiled sources." |
| 256 | + ([repl-env requires] |
| 257 | + (load-dependencies repl-env requires nil)) |
244 | 258 | ([repl-env requires opts]
|
245 |
| - (doseq [ns (distinct requires)] |
246 |
| - (load-namespace repl-env ns opts)))) |
| 259 | + (doall (mapcat #(load-namespace repl-env % opts) (distinct requires))))) |
247 | 260 |
|
248 | 261 | (defn ^File js-src->cljs-src
|
249 | 262 | "Map a JavaScript output file back to the original ClojureScript source
|
|
544 | 557 | (ana/no-warn (ana/analyze env form nil opts))
|
545 | 558 | (catch #?(:clj Exception :cljs js/Error) e
|
546 | 559 | (reset! env/*compiler* backup-comp)
|
547 |
| - (throw e)))] |
548 |
| - (load-dependencies repl-env |
549 |
| - (into (vals (:requires ast)) |
550 |
| - (distinct (vals (:uses ast)))) |
551 |
| - opts))) |
| 560 | + (throw e))) |
| 561 | + sources (load-dependencies repl-env |
| 562 | + (into (vals (:requires ast)) |
| 563 | + (distinct (vals (:uses ast)))) |
| 564 | + opts)] |
| 565 | + (load-cljs-loader repl-env sources opts))) |
552 | 566 | (when *cljs-verbose*
|
553 | 567 | (err-out (println wrap-js)))
|
554 | 568 | (let [ret (-evaluate repl-env filename (:line (meta form)) wrap-js)]
|
|
596 | 610 | (util/ns->relpath ns (util/ext (:source-url compiled))))
|
597 | 611 | (slurp src)))
|
598 | 612 | ;; need to load dependencies first
|
599 |
| - (load-dependencies repl-env (:requires compiled) opts) |
| 613 | + (let [sources (load-dependencies repl-env (:requires compiled) opts)] |
| 614 | + (load-cljs-loader repl-env (conj sources compiled) opts)) |
600 | 615 | (-evaluate repl-env f 1 (cljsc/add-dep-string opts compiled))
|
601 | 616 | (-evaluate repl-env f 1
|
602 | 617 | (cljsc/src-file->goog-require src
|
|
0 commit comments