|
452 | 452 | {:source-type :fragment
|
453 | 453 | :source-form form})
|
454 | 454 | def-emits-var (:def-emits-var opts)
|
| 455 | + ast (ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var) |
| 456 | + (wrap form) nil opts) |
455 | 457 | wrap-js
|
456 | 458 | ;; TODO: check opts as well - David
|
457 | 459 | (if (:source-map repl-env)
|
458 | 460 | (binding [comp/*source-map-data*
|
459 | 461 | (atom {:source-map (sorted-map)
|
460 | 462 | :gen-col 0
|
461 | 463 | :gen-line 0})]
|
462 |
| - (let [js (comp/emit-str |
463 |
| - (ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var) |
464 |
| - (wrap form) nil opts)) |
| 464 | + (let [js (comp/emit-str ast) |
465 | 465 | t (System/currentTimeMillis)]
|
466 | 466 | (str js
|
467 | 467 | "\n//# sourceURL=repl-" t ".js"
|
|
478 | 478 | ;; handle strings / primitives without metadata
|
479 | 479 | (with-out-str (pr form)))]})
|
480 | 480 | "UTF-8")))))
|
481 |
| - (comp/emit-str |
482 |
| - (ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var) |
483 |
| - (wrap form) nil opts)))] |
| 481 | + (comp/emit-str ast))] |
484 | 482 | ;; NOTE: means macros which expand to ns aren't supported for now
|
485 | 483 | ;; when eval'ing individual forms at the REPL - David
|
486 |
| - (when (and (sequential? form) (= 'ns (first form))) |
| 484 | + (when (#{:ns :ns*} (:op ast)) |
487 | 485 | (let [ast (ana/no-warn (ana/analyze env form nil opts))]
|
488 | 486 | (load-dependencies repl-env
|
489 | 487 | (into (vals (:requires ast))
|
|
548 | 546 |
|
549 | 547 | (defn- wrap-fn [form]
|
550 | 548 | (cond
|
551 |
| - (and (seq? form) (= 'ns (first form))) identity |
| 549 | + (and (seq? form) |
| 550 | + (#{'ns 'require 'require-macros |
| 551 | + 'use 'use-macros 'import 'refer-clojure} (first form))) |
| 552 | + identity |
| 553 | + |
552 | 554 | ('#{*1 *2 *3 *e} form) (fn [x] `(cljs.core.pr-str ~x))
|
553 | 555 | :else
|
554 | 556 | (fn [x]
|
|
612 | 614 | ;; form - complete form entered at the repl
|
613 | 615 | ;; opts - REPL options, essentially augmented cljs.closure/build options
|
614 | 616 |
|
615 |
| -(defn self-require? [specs] |
616 |
| - (some |
617 |
| - (fn [quoted-spec-or-kw] |
618 |
| - (and (not (keyword? quoted-spec-or-kw)) |
619 |
| - (let [spec (second quoted-spec-or-kw) |
620 |
| - ns (if (sequential? spec) |
621 |
| - (first spec) |
622 |
| - spec)] |
623 |
| - (= ns ana/*cljs-ns*)))) |
624 |
| - specs)) |
625 |
| - |
626 | 617 | (defn- wrap-self
|
627 | 618 | "Takes a self-ish fn and returns it wrapped with exception handling.
|
628 | 619 | Compiler state is restored if self-ish fn fails."
|
|
666 | 657 | (wrap-special-fns wrap-self
|
667 | 658 | {'in-ns in-ns-fn
|
668 | 659 | 'clojure.core/in-ns in-ns-fn
|
669 |
| - 'require |
670 |
| - (fn self |
671 |
| - ([repl-env env form] |
672 |
| - (self repl-env env form nil)) |
673 |
| - ([repl-env env [_ & specs :as form] opts] |
674 |
| - (let [is-self-require? (self-require? specs) |
675 |
| - [target-ns restore-ns] |
676 |
| - (if-not is-self-require? |
677 |
| - [ana/*cljs-ns* nil] |
678 |
| - ['cljs.user ana/*cljs-ns*])] |
679 |
| - (evaluate-form repl-env env "<cljs repl>" |
680 |
| - (with-meta |
681 |
| - `(~'ns ~target-ns |
682 |
| - (:require ~@(-> specs ana/canonicalize-specs decorate-specs))) |
683 |
| - {:merge true :line 1 :column 1}) |
684 |
| - identity opts) |
685 |
| - (when is-self-require? |
686 |
| - (set! ana/*cljs-ns* restore-ns))))) |
687 |
| - 'require-macros |
688 |
| - (fn self |
689 |
| - ([repl-env env form] |
690 |
| - (self repl-env env form nil)) |
691 |
| - ([repl-env env [_ & specs :as form] opts] |
692 |
| - (evaluate-form repl-env env "<cljs repl>" |
693 |
| - (with-meta |
694 |
| - `(~'ns ~ana/*cljs-ns* |
695 |
| - (:require-macros ~@(-> specs ana/canonicalize-specs decorate-specs))) |
696 |
| - {:merge true :line 1 :column 1}) |
697 |
| - identity opts))) |
698 |
| - 'use |
699 |
| - (fn self |
700 |
| - ([repl-env env form] |
701 |
| - (self repl-env env form nil)) |
702 |
| - ([repl-env env [_ & specs :as form] opts] |
703 |
| - (let [is-self-require? (self-require? specs) |
704 |
| - [target-ns restore-ns] |
705 |
| - (if-not is-self-require? |
706 |
| - [ana/*cljs-ns* nil] |
707 |
| - ['cljs.user ana/*cljs-ns*])] |
708 |
| - (evaluate-form repl-env env "<cljs repl>" |
709 |
| - (with-meta |
710 |
| - `(~'ns ~target-ns |
711 |
| - (:use ~@(-> specs ana/canonicalize-specs decorate-specs))) |
712 |
| - {:merge true :line 1 :column 1}) |
713 |
| - identity opts) |
714 |
| - (when is-self-require? |
715 |
| - (set! ana/*cljs-ns* restore-ns))))) |
716 |
| - 'use-macros |
717 |
| - (fn self |
718 |
| - ([repl-env env form] |
719 |
| - (self repl-env env form nil)) |
720 |
| - ([repl-env env [_ & specs :as form] opts] |
721 |
| - (evaluate-form repl-env env "<cljs repl>" |
722 |
| - (with-meta |
723 |
| - `(~'ns ~ana/*cljs-ns* |
724 |
| - (:use-macros ~@(-> specs ana/canonicalize-specs decorate-specs))) |
725 |
| - {:merge true :line 1 :column 1}) |
726 |
| - identity opts))) |
727 |
| - 'import |
728 |
| - (fn self |
729 |
| - ([repl-env env form] |
730 |
| - (self repl-env env form nil)) |
731 |
| - ([repl-env env [_ & specs :as form] opts] |
732 |
| - (evaluate-form repl-env env "<cljs repl>" |
733 |
| - (with-meta |
734 |
| - `(~'ns ~ana/*cljs-ns* |
735 |
| - (:import |
736 |
| - ~@(map |
737 |
| - (fn [quoted-spec-or-kw] |
738 |
| - (if (keyword? quoted-spec-or-kw) |
739 |
| - quoted-spec-or-kw |
740 |
| - (second quoted-spec-or-kw))) |
741 |
| - specs))) |
742 |
| - {:merge true :line 1 :column 1}) |
743 |
| - identity opts))) |
744 |
| - 'refer-clojure |
745 |
| - (fn self |
746 |
| - ([repl-env env form] |
747 |
| - (self repl-env env form nil)) |
748 |
| - ([repl-env env [_ & specs :as form] opts] |
749 |
| - (evaluate-form repl-env env "<cljs repl>" |
750 |
| - (with-meta |
751 |
| - `(~'ns ~ana/*cljs-ns* |
752 |
| - (:refer-clojure ~@specs)) |
753 |
| - {:merge true :line 1 :column 1}) |
754 |
| - identity opts))) |
755 | 660 | 'load-file load-file-fn
|
756 | 661 | 'clojure.core/load-file load-file-fn
|
757 | 662 | 'load-namespace
|
|
0 commit comments