Utility functions for printing errors. Used in both parse errors and static semantics errors. | (ns mini-java.errors (:require [mini-java.util :refer [parser-filename]])) |
Given a line with an error at the given index, returns a string of whitespace ending with the ^ character, which points to the error. Tabs are handled correctly. For example, given the Java line: int[] foo ;= 2; returns ^ | (defn underline-str [error-line index] (let [whitespace (filter #(Character/isWhitespace %) (take index error-line)) remaining (- index (count whitespace))] (str (clojure.string/join whitespace) (clojure.string/join (repeat remaining " ")) "^"))) |
Prints the line on which the current error occurred, and underlines the error with a ^ | (defn underline-error [parser line column] (let [tokens (.getInputStream parser) lines (-> tokens .getTokenSource .getInputStream .toString clojure.string/split-lines)] (if (> line (count lines)) ; reached EOF, underline that (println "<EOF>\n^") ; did not reach EOF, do a more descriptive underline (let [error-line (nth lines (dec line)) underline (underline-str error-line column)] (println error-line) (println underline))))) |
Prints the given error msg along with the file, line, and column in which it occurred. This is used for all errors. | (defn print-error [parser msg line column] (let [filename (parser-filename parser)] (binding [*out* *err*] (println (str filename ":" line ": error: " msg)) (underline-error parser line column)))) |
Prints a type mismatch error | (defn print-type-error [parser msg line column found required] (print-error parser msg line column) (binding [*out* *err*] (println " required:" required) (println " found: " found))) |
Prints a missing symbol error | (defn print-symbol-error [parser msg line column symbol location] (print-error parser msg line column) (binding [*out* *err*] (println " symbol: variable" symbol) (println " location: class" location))) |