|
273 | 273 |
|
274 | 274 | (defmethod parse 'if |
275 | 275 | [op env [_ test then else :as form] name] |
276 | | - (assert (>= (count form) 3) "Too few arguments to if") |
| 276 | + (when (< (count form) 3) |
| 277 | + (throw (error env "Too few arguments to if"))) |
277 | 278 | (let [test-expr (disallowing-recur (analyze (assoc env :context :expr) test)) |
278 | 279 | then-expr (analyze env then) |
279 | 280 | else-expr (analyze env else)] |
|
315 | 316 | (analyze (assoc catchenv :locals locals) `(do ~@(rest cblock)))) |
316 | 317 | body (if name (pop body) body) |
317 | 318 | try (analyze (if (or name finally) catchenv env) `(do ~@body))] |
318 | | - (when name (assert (not (namespace name)) "Can't qualify symbol in catch")) |
| 319 | + (when (and name (namespace name)) |
| 320 | + (throw (error env "Can't qualify symbol in catch"))) |
319 | 321 | {:env env :op :try* :form form |
320 | 322 | :try try |
321 | 323 | :finally finally |
|
336 | 338 | protocol (-> sym meta :protocol) |
337 | 339 | dynamic (-> sym meta :dynamic) |
338 | 340 | ns-name (-> env :ns :name)] |
339 | | - (assert (not (namespace sym)) "Can't def ns-qualified name") |
| 341 | + (when (namespace sym) |
| 342 | + (throw (error env "Can't def ns-qualified name"))) |
340 | 343 | (let [env (if (or (and (not= ns-name 'cljs.core) |
341 | 344 | (core-name? env sym)) |
342 | 345 | (get-in @namespaces [ns-name :uses sym])) |
|
486 | 489 |
|
487 | 490 | (defmethod parse 'letfn* |
488 | 491 | [op env [_ bindings & exprs :as form] name] |
489 | | - (assert (and (vector? bindings) (even? (count bindings))) "bindings must be vector of even number of elements") |
| 492 | + (when-not (and (vector? bindings) (even? (count bindings))) |
| 493 | + (throw (error env "bindings must be vector of even number of elements"))) |
490 | 494 | (let [n->fexpr (into {} (map (juxt first second) (partition 2 bindings))) |
491 | 495 | names (keys n->fexpr) |
492 | 496 | context (:context env) |
|
523 | 527 |
|
524 | 528 | (defn analyze-let |
525 | 529 | [encl-env [_ bindings & exprs :as form] is-loop] |
526 | | - (assert (and (vector? bindings) (even? (count bindings))) "bindings must be vector of even number of elements") |
| 530 | + (when-not (and (vector? bindings) (even? (count bindings))) |
| 531 | + (throw (error encl-env "bindings must be vector of even number of elements"))) |
527 | 532 | (let [context (:context encl-env) |
528 | 533 | [bes env] |
529 | 534 | (disallowing-recur |
|
532 | 537 | bindings (seq (partition 2 bindings))] |
533 | 538 | (if-let [[name init] (first bindings)] |
534 | 539 | (do |
535 | | - (assert (not (or (namespace name) (.contains (str name) "."))) (str "Invalid local name: " name)) |
| 540 | + (when (or (namespace name) (.contains (str name) ".")) |
| 541 | + (throw (error encl-env (str "Invalid local name: " name)))) |
536 | 542 | (let [init-expr (binding [*loop-lets* (cons {:params bes} (or *loop-lets* ()))] |
537 | 543 | (analyze env init)) |
538 | 544 | be {:name name |
|
587 | 593 | (let [context (:context env) |
588 | 594 | frame (first *recur-frames*) |
589 | 595 | exprs (disallowing-recur (vec (map #(analyze (assoc env :context :expr) %) exprs)))] |
590 | | - (assert frame "Can't recur here") |
591 | | - (assert (= (count exprs) (count (:params frame))) "recur argument count mismatch") |
| 596 | + (when-not frame |
| 597 | + (throw (error env "Can't recur here"))) |
| 598 | + (when-not (= (count exprs) (count (:params frame))) |
| 599 | + (throw (error env "recur argument count mismatch"))) |
592 | 600 | (reset! (:flag frame) true) |
593 | 601 | (assoc {:env env :op :recur :form form} |
594 | 602 | :frame frame |
|
601 | 609 |
|
602 | 610 | (defmethod parse 'new |
603 | 611 | [_ env [_ ctor & args :as form] _] |
604 | | - (assert (symbol? ctor) "First arg to new must be a symbol") |
| 612 | + (when-not (symbol? ctor) |
| 613 | + (throw (error env "First arg to new must be a symbol"))) |
605 | 614 | (disallowing-recur |
606 | 615 | (let [enve (assoc env :context :expr) |
607 | 616 | ctorexpr (analyze enve ctor) |
|
633 | 642 | (symbol? target) |
634 | 643 | (do |
635 | 644 | (let [local (-> env :locals target)] |
636 | | - (assert (or (nil? local) |
637 | | - (and (:field local) |
638 | | - (or (:mutable local) |
639 | | - (:unsynchronized-mutable local) |
640 | | - (:volatile-mutable local)))) |
641 | | - "Can't set! local var or non-mutable field")) |
| 645 | + (when-not (or (nil? local) |
| 646 | + (and (:field local) |
| 647 | + (or (:mutable local) |
| 648 | + (:unsynchronized-mutable local) |
| 649 | + (:volatile-mutable local)))) |
| 650 | + (throw (error env "Can't set! local var or non-mutable field")))) |
642 | 651 | (analyze-symbol enve target)) |
643 | 652 |
|
644 | 653 | :else |
|
647 | 656 | (when (:field targetexpr) |
648 | 657 | targetexpr)))) |
649 | 658 | valexpr (analyze enve val)] |
650 | | - (assert targetexpr "set! target must be a field or a symbol naming a var") |
| 659 | + (when-not targetexpr |
| 660 | + (throw (error env "set! target must be a field or a symbol naming a var"))) |
651 | 661 | (cond |
652 | 662 | (= targetexpr ::set-unchecked-if) {:env env :op :no-op} |
653 | 663 | :else {:env env :op :set! :form form :target targetexpr :val valexpr |
|
685 | 695 |
|
686 | 696 | (defmethod parse 'ns |
687 | 697 | [_ env [_ name & args :as form] _] |
688 | | - (assert (symbol? name) "Namespaces must be named by a symbol.") |
| 698 | + (when-not (symbol? name) |
| 699 | + (throw (error env "Namespaces must be named by a symbol."))) |
689 | 700 | (let [docstring (if (string? (first args)) (first args)) |
690 | 701 | args (if docstring (next args) args) |
691 | 702 | metadata (if (map? (first args)) (first args)) |
|
694 | 705 | (reduce (fn [s [k exclude xs]] |
695 | 706 | (if (= k :refer-clojure) |
696 | 707 | (do |
697 | | - (assert (= exclude :exclude) "Only [:refer-clojure :exclude (names)] form supported") |
698 | | - (assert (not (seq s)) "Only one :refer-clojure form is allowed per namespace definition") |
| 708 | + (when-not (= exclude :exclude) |
| 709 | + (throw (error env "Only [:refer-clojure :exclude (names)] form supported"))) |
| 710 | + (when (seq s) |
| 711 | + (throw (error env "Only one :refer-clojure form is allowed per namespace definition"))) |
699 | 712 | (into s xs)) |
700 | 713 | s)) |
701 | 714 | #{} args) |
|
704 | 717 | valid-forms (atom #{:use :use-macros :require :require-macros :import}) |
705 | 718 | error-msg (fn [spec msg] (str msg "; offending spec: " (pr-str spec))) |
706 | 719 | parse-require-spec (fn parse-require-spec [macros? spec] |
707 | | - (assert (or (symbol? spec) (vector? spec)) |
708 | | - (error-msg spec "Only [lib.ns & options] and lib.ns specs supported in :require / :require-macros")) |
| 720 | + (when-not (or (symbol? spec) (vector? spec)) |
| 721 | + (throw (error env (error-msg spec "Only [lib.ns & options] and lib.ns specs supported in :require / :require-macros")))) |
709 | 722 | (when (vector? spec) |
710 | | - (assert (symbol? (first spec)) |
711 | | - (error-msg spec "Library name must be specified as a symbol in :require / :require-macros")) |
712 | | - (assert (odd? (count spec)) |
713 | | - (error-msg spec "Only :as alias and :refer (names) options supported in :require")) |
714 | | - (assert (every? #{:as :refer} (map first (partition 2 (next spec)))) |
715 | | - (error-msg spec "Only :as and :refer options supported in :require / :require-macros")) |
716 | | - (assert (let [fs (frequencies (next spec))] |
717 | | - (and (<= (fs :as 0) 1) |
718 | | - (<= (fs :refer 0) 1))) |
719 | | - (error-msg spec "Each of :as and :refer options may only be specified once in :require / :require-macros"))) |
| 723 | + (when-not (symbol? (first spec)) |
| 724 | + (throw (error env (error-msg spec "Library name must be specified as a symbol in :require / :require-macros")))) |
| 725 | + (when-not (odd? (count spec)) |
| 726 | + (throw (error env (error-msg spec "Only :as alias and :refer (names) options supported in :require")))) |
| 727 | + (when-not (every? #{:as :refer} (map first (partition 2 (next spec)))) |
| 728 | + (throw (error env (error-msg spec "Only :as and :refer options supported in :require / :require-macros")))) |
| 729 | + (when-not (let [fs (frequencies (next spec))] |
| 730 | + (and (<= (fs :as 0) 1) |
| 731 | + (<= (fs :refer 0) 1))) |
| 732 | + (throw (error env (error-msg spec "Each of :as and :refer options may only be specified once in :require / :require-macros"))))) |
720 | 733 | (if (symbol? spec) |
721 | 734 | (recur macros? [spec]) |
722 | 735 | (let [[lib & opts] spec |
|
730 | 743 | (ns-unalias *ns* alias) |
731 | 744 | (clojure.core/alias alias (.name ns)))) |
732 | 745 | (let [alias-type (if macros? :macros :fns)] |
733 | | - (assert (not (contains? (alias-type @aliases) |
734 | | - alias)) |
735 | | - (error-msg spec ":as alias must be unique")) |
| 746 | + (when (contains? (alias-type @aliases) alias) |
| 747 | + (throw (error env (error-msg spec ":as alias must be unique")))) |
736 | 748 | (swap! aliases |
737 | 749 | update-in [alias-type] |
738 | 750 | conj alias))) |
739 | | - (assert (or (symbol? alias) (nil? alias)) |
740 | | - (error-msg spec ":as must be followed by a symbol in :require / :require-macros")) |
741 | | - (assert (or (and (sequential? referred) (every? symbol? referred)) |
742 | | - (nil? referred)) |
743 | | - (error-msg spec ":refer must be followed by a sequence of symbols in :require / :require-macros")) |
| 751 | + (when-not (or (symbol? alias) (nil? alias)) |
| 752 | + (throw (error env (error-msg spec ":as must be followed by a symbol in :require / :require-macros")))) |
| 753 | + (when-not (or (and (sequential? referred) (every? symbol? referred)) |
| 754 | + (nil? referred)) |
| 755 | + (throw (error env (error-msg spec ":refer must be followed by a sequence of symbols in :require / :require-macros")))) |
744 | 756 | (when-not macros? |
745 | 757 | (swap! deps conj lib)) |
746 | 758 | (merge |
747 | 759 | (when alias |
748 | 760 | {rk (merge {alias lib} {lib lib})}) |
749 | 761 | (when referred {uk (apply hash-map (interleave referred (repeat lib)))}))))) |
750 | 762 | use->require (fn use->require [[lib kw referred :as spec]] |
751 | | - (assert (and (symbol? lib) (= :only kw) (sequential? referred) (every? symbol? referred)) |
752 | | - (error-msg spec "Only [lib.ns :only (names)] specs supported in :use / :use-macros")) |
| 763 | + (when-not (and (symbol? lib) (= :only kw) (sequential? referred) (every? symbol? referred)) |
| 764 | + (throw (error env (error-msg spec "Only [lib.ns :only (names)] specs supported in :use / :use-macros")))) |
753 | 765 | [lib :refer referred]) |
754 | 766 | parse-import-spec (fn parse-import-spec [spec] |
755 | | - (assert (and (symbol? spec) (nil? (namespace spec))) |
756 | | - (error-msg spec "Only lib.Ctor specs supported in :import")) |
| 767 | + (when-not (and (symbol? spec) (nil? (namespace spec))) |
| 768 | + (throw (error env (error-msg spec "Only lib.Ctor specs supported in :import")))) |
757 | 769 | (swap! deps conj spec) |
758 | 770 | (let [ctor-sym (symbol (last (string/split (str spec) #"\.")))] |
759 | 771 | {:import {ctor-sym spec} |
|
765 | 777 | :import parse-import-spec} |
766 | 778 | {uses :use requires :require uses-macros :use-macros requires-macros :require-macros imports :import :as params} |
767 | 779 | (reduce (fn [m [k & libs]] |
768 | | - (assert (#{:use :use-macros :require :require-macros :import} k) |
769 | | - "Only :refer-clojure, :require, :require-macros, :use and :use-macros libspecs supported") |
770 | | - (assert (@valid-forms k) |
771 | | - (str "Only one " k " form is allowed per namespace definition")) |
| 780 | + (when-not (#{:use :use-macros :require :require-macros :import} k) |
| 781 | + (throw (error env "Only :refer-clojure, :require, :require-macros, :use and :use-macros libspecs supported"))) |
| 782 | + (when-not (@valid-forms k) |
| 783 | + (throw (error env (str "Only one " k " form is allowed per namespace definition")))) |
772 | 784 | (swap! valid-forms disj k) |
773 | 785 | (apply merge-with merge m (map (spec-parsers k) libs))) |
774 | 786 | {} (remove (fn [[r]] (= r :refer-clojure)) args))] |
|
900 | 912 |
|
901 | 913 | (defmethod parse 'js* |
902 | 914 | [op env [_ jsform & args :as form] _] |
903 | | - (assert (string? jsform)) |
| 915 | + (when-not (string? jsform) |
| 916 | + (throw (error env "Invalid js* form"))) |
904 | 917 | (if args |
905 | 918 | (disallowing-recur |
906 | 919 | (let [seg (fn seg [^String s] |
|
1017 | 1030 | :column (or (-> form meta :column) |
1018 | 1031 | (:column env)))] |
1019 | 1032 | (let [op (first form)] |
1020 | | - (assert (not (nil? op)) "Can't call nil") |
| 1033 | + (when (nil? op) |
| 1034 | + (throw (error env "Can't call nil"))) |
1021 | 1035 | (let [mform (macroexpand-1 env form)] |
1022 | 1036 | (if (identical? form mform) |
1023 | 1037 | (wrapping-errors env |
|
0 commit comments