aboutsummaryrefslogtreecommitdiff
path: root/cljcc-compiler/src/cljcc/core
diff options
context:
space:
mode:
Diffstat (limited to 'cljcc-compiler/src/cljcc/core')
-rw-r--r--cljcc-compiler/src/cljcc/core/exception.cljc34
-rw-r--r--cljcc-compiler/src/cljcc/core/format.cljc10
-rw-r--r--cljcc-compiler/src/cljcc/core/log.cljc28
3 files changed, 72 insertions, 0 deletions
diff --git a/cljcc-compiler/src/cljcc/core/exception.cljc b/cljcc-compiler/src/cljcc/core/exception.cljc
new file mode 100644
index 0000000..19245aa
--- /dev/null
+++ b/cljcc-compiler/src/cljcc/core/exception.cljc
@@ -0,0 +1,34 @@
+(ns cljcc.core.exception
+ (:require [cljcc.core.format :refer [safe-format]]))
+
+(defn try-catch-ex
+ ([f]
+ (try
+ (f)
+ (catch #?(:clj Throwable :cljs :default) e
+ [:error e])))
+ ([f default]
+ (try
+ (f)
+ (catch #?(:clj Throwable :cljs :default) e
+ default))))
+
+(defn lex-error [{line :line col :col :as data}]
+ (throw (ex-info
+ (safe-format "Invalid token at line: %s, col: %s." line col)
+ (merge {:error/type :lexer} data))))
+
+(defn parser-error [msg data]
+ (throw (ex-info msg (merge {:error/type :parser} data))))
+
+(defn analyzer-error [msg data]
+ (throw (ex-info msg (merge {:error/type :analyzer} data))))
+
+(defn tacky-error [msg data]
+ (throw (ex-info msg (merge {:error/type :tacky} data))))
+
+(defn compiler-error [msg data]
+ (throw (ex-info msg (merge {:error/type :compiler} data))))
+
+(defn emit-error [msg data]
+ (throw (ex-info msg (merge {:error/type :emit} data))))
diff --git a/cljcc-compiler/src/cljcc/core/format.cljc b/cljcc-compiler/src/cljcc/core/format.cljc
new file mode 100644
index 0000000..851b6a1
--- /dev/null
+++ b/cljcc-compiler/src/cljcc/core/format.cljc
@@ -0,0 +1,10 @@
+(ns cljcc.core.format
+ #?(:clj (:require [clojure.core :refer [format]])
+ :cljs (:require [goog.string :as gstring]
+ [goog.string.format])))
+
+(defn safe-format
+ "Cross platform format."
+ [fmt & args]
+ #?(:clj (apply format fmt args)
+ :cljs (apply gstring/format fmt args)))
diff --git a/cljcc-compiler/src/cljcc/core/log.cljc b/cljcc-compiler/src/cljcc/core/log.cljc
new file mode 100644
index 0000000..bb92b02
--- /dev/null
+++ b/cljcc-compiler/src/cljcc/core/log.cljc
@@ -0,0 +1,28 @@
+(ns cljcc.core.log
+ (:require [clojure.string :as str]))
+
+(def ^:private log-colors
+ {:debug "\u001b[36m" ; Cyan
+ :info "\u001b[32m" ; Green
+ :warn "\u001b[33m" ; Yellow
+ :error "\u001b[31m" ; Red
+ :reset "\u001b[0m"}) ; Reset color
+
+(def reset-color (get log-colors :reset))
+
+(defn- log-message [level message]
+ (let [color (get log-colors level)
+ formatted-message (str color "[" (str/upper-case (name level)) "] " message reset-color)]
+ (println formatted-message)))
+
+(defn debug [msg]
+ (log-message :debug msg))
+
+(defn info [msg]
+ (log-message :info msg))
+
+(defn warn [msg]
+ (log-message :warn msg))
+
+(defn error [msg]
+ (log-message :error msg))