From 4a87c3b290e38d67a72ac02eefdfcb8a7ca60558 Mon Sep 17 00:00:00 2001 From: Brandon Bloom Date: Wed, 28 Nov 2012 16:00:38 -0800 Subject: [PATCH] CLJS-432: Include file/line in error messages --- src/clj/cljs/analyzer.clj | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/clj/cljs/analyzer.clj b/src/clj/cljs/analyzer.clj index 50cce63..718a5fb 100644 --- a/src/clj/cljs/analyzer.clj +++ b/src/clj/cljs/analyzer.clj @@ -87,11 +87,25 @@ [& args] `(.println System/err (str ~@args))) +(defn message [env s] + (str s (when (:line env) + (str " at line " (:line env) " " *cljs-file*)))) + (defn warning [env s] (binding [*out* *err*] - (println - (str s (when (:line env) - (str " at line " (:line env) " " *cljs-file*)))))) + (println (message env s)))) + +(defn error + ([env s] (error env s nil)) + ([env s cause] (ex-info (message env s) {:env env} cause))) + +(defmacro wrapping-errors [env & body] + `(try + ~@body + (catch Throwable err# + (if (:env (ex-data err#)) + (throw err#) + (throw (error ~env (.getMessage err#) err#)))))) (defn confirm-var-exists [env prefix suffix] (when *cljs-warn-on-undeclared* @@ -867,9 +881,10 @@ (assert (not (nil? op)) "Can't call nil") (let [mform (macroexpand-1 env form)] (if (identical? form mform) - (if (specials op) - (parse op env form name) - (parse-invoke env form)) + (wrapping-errors env + (if (specials op) + (parse op env form name) + (parse-invoke env form))) (analyze env mform name)))))) (declare analyze-wrap-meta) @@ -917,6 +932,7 @@ facilitate code walking without knowing the details of the op set." ([env form] (analyze env form nil)) ([env form name] + (wrapping-errors env (let [form (if (instance? clojure.lang.LazySeq form) (or (seq form) ()) form)] @@ -928,7 +944,7 @@ (vector? form) (analyze-vector env form name) (set? form) (analyze-set env form name) (keyword? form) (analyze-keyword env form) - :else {:op :constant :env env :form form})))) + :else {:op :constant :env env :form form}))))) (defn analyze-file [^String f] -- 1.8.0