diff options
| author | Your Name <agrawalshagun07@gmail.com> | 2025-03-16 14:53:45 +0530 |
|---|---|---|
| committer | Your Name <agrawalshagun07@gmail.com> | 2025-03-16 14:53:45 +0530 |
| commit | 277319fa392f5ee9f21eedf2c4d224739f045690 (patch) | |
| tree | f2e3a89de7946647d7560db242e7ce22fda25a5c /cljcc-compiler/src/cljcc/core | |
| parent | 39b6930e14cfda58fd066805f5da447c685ab67f (diff) | |
Add common functions for handling cljcc compiler
Diffstat (limited to 'cljcc-compiler/src/cljcc/core')
| -rw-r--r-- | cljcc-compiler/src/cljcc/core/exception.cljc | 34 | ||||
| -rw-r--r-- | cljcc-compiler/src/cljcc/core/format.cljc | 10 | ||||
| -rw-r--r-- | cljcc-compiler/src/cljcc/core/log.cljc | 28 |
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)) |
