|
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