|
617 | 617 | (= ns ana/*cljs-ns*)))) |
618 | 618 | specs)) |
619 | 619 |
|
| 620 | +(defn- wrap-self |
| 621 | + "Takes a self-ish fn and returns it wrapped with exception handling. |
| 622 | + Compiler state is restored if self-ish fn fails." |
| 623 | + [f] |
| 624 | + (fn g |
| 625 | + ([a b c] |
| 626 | + (g a b c nil)) |
| 627 | + ([a b c d] |
| 628 | + (let [backup-comp @env/*compiler*] |
| 629 | + (try |
| 630 | + (apply f [a b c d]) |
| 631 | + (catch #?(:clj Exception :cljs js/Error) e ;;Exception |
| 632 | + (reset! env/*compiler* backup-comp) |
| 633 | + (throw e))))))) |
| 634 | + |
| 635 | +(defn- wrap-special-fns |
| 636 | + [wfn fns] |
| 637 | + "Wrap wfn around all (fn) values in fns hashmap." |
| 638 | + (into {} (for [[k v] fns] [k (wfn v)]))) |
| 639 | + |
620 | 640 | (def default-special-fns |
621 | 641 | (let [load-file-fn |
622 | 642 | (fn self |
|
637 | 657 | (-evaluate repl-env "<cljs repl>" 1 |
638 | 658 | (str "goog.provide('" (comp/munge ns-name) "');"))) |
639 | 659 | (set! ana/*cljs-ns* ns-name)))] |
640 | | - {'in-ns in-ns-fn |
641 | | - 'clojure.core/in-ns in-ns-fn |
642 | | - 'require |
643 | | - (fn self |
644 | | - ([repl-env env form] |
645 | | - (self repl-env env form nil)) |
646 | | - ([repl-env env [_ & specs :as form] opts] |
647 | | - (let [is-self-require? (self-require? specs) |
648 | | - [target-ns restore-ns] |
649 | | - (if-not is-self-require? |
650 | | - [ana/*cljs-ns* nil] |
651 | | - ['cljs.user ana/*cljs-ns*])] |
652 | | - (evaluate-form repl-env env "<cljs repl>" |
653 | | - (with-meta |
654 | | - `(~'ns ~target-ns |
655 | | - (:require ~@(-> specs canonicalize-specs decorate-specs))) |
656 | | - {:merge true :line 1 :column 1}) |
657 | | - identity opts) |
658 | | - (when is-self-require? |
659 | | - (set! ana/*cljs-ns* restore-ns))))) |
660 | | - 'require-macros |
661 | | - (fn self |
662 | | - ([repl-env env form] |
663 | | - (self repl-env env form nil)) |
664 | | - ([repl-env env [_ & specs :as form] opts] |
665 | | - (evaluate-form repl-env env "<cljs repl>" |
666 | | - (with-meta |
667 | | - `(~'ns ~ana/*cljs-ns* |
668 | | - (:require-macros ~@(-> specs canonicalize-specs decorate-specs))) |
669 | | - {:merge true :line 1 :column 1}) |
670 | | - identity opts))) |
671 | | - 'import |
672 | | - (fn self |
673 | | - ([repl-env env form] |
674 | | - (self repl-env env form nil)) |
675 | | - ([repl-env env [_ & specs :as form] opts] |
676 | | - (evaluate-form repl-env env "<cljs repl>" |
677 | | - (with-meta |
678 | | - `(~'ns ~ana/*cljs-ns* |
679 | | - (:import |
680 | | - ~@(map |
681 | | - (fn [quoted-spec-or-kw] |
682 | | - (if (keyword? quoted-spec-or-kw) |
683 | | - quoted-spec-or-kw |
684 | | - (second quoted-spec-or-kw))) |
685 | | - specs))) |
686 | | - {:merge true :line 1 :column 1}) |
687 | | - identity opts))) |
688 | | - 'load-file load-file-fn |
689 | | - 'clojure.core/load-file load-file-fn |
690 | | - 'load-namespace |
691 | | - (fn self |
692 | | - ([repl-env env form] |
693 | | - (self env repl-env form nil)) |
694 | | - ([repl-env env [_ ns :as form] opts] |
695 | | - (load-namespace repl-env ns opts)))})) |
| 660 | + (wrap-special-fns wrap-self |
| 661 | + {'in-ns in-ns-fn |
| 662 | + 'clojure.core/in-ns in-ns-fn |
| 663 | + 'require |
| 664 | + (fn self |
| 665 | + ([repl-env env form] |
| 666 | + (self repl-env env form nil)) |
| 667 | + ([repl-env env [_ & specs :as form] opts] |
| 668 | + (let [is-self-require? (self-require? specs) |
| 669 | + [target-ns restore-ns] |
| 670 | + (if-not is-self-require? |
| 671 | + [ana/*cljs-ns* nil] |
| 672 | + ['cljs.user ana/*cljs-ns*])] |
| 673 | + (evaluate-form repl-env env "<cljs repl>" |
| 674 | + (with-meta |
| 675 | + `(~'ns ~target-ns |
| 676 | + (:require ~@(-> specs canonicalize-specs decorate-specs))) |
| 677 | + {:merge true :line 1 :column 1}) |
| 678 | + identity opts) |
| 679 | + (when is-self-require? |
| 680 | + (set! ana/*cljs-ns* restore-ns))))) |
| 681 | + 'require-macros |
| 682 | + (fn self |
| 683 | + ([repl-env env form] |
| 684 | + (self repl-env env form nil)) |
| 685 | + ([repl-env env [_ & specs :as form] opts] |
| 686 | + (evaluate-form repl-env env "<cljs repl>" |
| 687 | + (with-meta |
| 688 | + `(~'ns ~ana/*cljs-ns* |
| 689 | + (:require-macros ~@(-> specs canonicalize-specs decorate-specs))) |
| 690 | + {:merge true :line 1 :column 1}) |
| 691 | + identity opts))) |
| 692 | + 'import |
| 693 | + (fn self |
| 694 | + ([repl-env env form] |
| 695 | + (self repl-env env form nil)) |
| 696 | + ([repl-env env [_ & specs :as form] opts] |
| 697 | + (evaluate-form repl-env env "<cljs repl>" |
| 698 | + (with-meta |
| 699 | + `(~'ns ~ana/*cljs-ns* |
| 700 | + (:import |
| 701 | + ~@(map |
| 702 | + (fn [quoted-spec-or-kw] |
| 703 | + (if (keyword? quoted-spec-or-kw) |
| 704 | + quoted-spec-or-kw |
| 705 | + (second quoted-spec-or-kw))) |
| 706 | + specs))) |
| 707 | + {:merge true :line 1 :column 1}) |
| 708 | + identity opts))) |
| 709 | + 'load-file load-file-fn |
| 710 | + 'clojure.core/load-file load-file-fn |
| 711 | + 'load-namespace |
| 712 | + (fn self |
| 713 | + ([repl-env env form] |
| 714 | + (self env repl-env form nil)) |
| 715 | + ([repl-env env [_ ns :as form] opts] |
| 716 | + (load-namespace repl-env ns opts)))}))) |
696 | 717 |
|
697 | 718 | (defn analyze-source |
698 | 719 | "Given a source directory, analyzes all .cljs files. Used to populate |
|
0 commit comments