aboutsummaryrefslogtreecommitdiff
path: root/nomnom/pretty_errors.nom
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2018-10-01 15:25:27 -0700
committerBruce Hill <bruce@bruce-hill.com>2018-10-01 15:25:27 -0700
commit331b22b3a3b61313a65ea6c49e2930b67f7ce82b (patch)
treef106bc55ea3cbd4aa3a5f4b4e5cd6fe3894ffb9e /nomnom/pretty_errors.nom
parent1a3137a210f7886677c6672c26081152318252a3 (diff)
Got compiler errors actually working.
Diffstat (limited to 'nomnom/pretty_errors.nom')
-rw-r--r--nomnom/pretty_errors.nom57
1 files changed, 33 insertions, 24 deletions
diff --git a/nomnom/pretty_errors.nom b/nomnom/pretty_errors.nom
index ffc6fd1..f32b849 100644
--- a/nomnom/pretty_errors.nom
+++ b/nomnom/pretty_errors.nom
@@ -4,7 +4,7 @@
local action [visible size of %text]:
return (size of (%text::with "\027%[[0-9;]*m" -> ""))
-local action [boxed %text]:
+local action [%text boxed]:
%max_line = (..)
max of ((visible size of %line) for %line in (%text::lines))
%ret = (..)
@@ -13,31 +13,35 @@ local action [boxed %text]:
"\n\%\(" "::* (%max_line - (visible size of %))) \027[0m"
return %ret.[2,-1]
-action [%err as a pretty error]:
- %context = 2
- %err_code = (%err::get source code)
- %err_line = (%err_code::line at %err.source.start)
- %err_linenum = (%err_code::line number at %err.source.start)
- %err_linepos = (%err_code::line position at %err.source.start)
+%CONTEXT = 2
+action [pretty %title error at %tree %err hint %hint]:
+ %source_code = (%tree::get source code)
+ %start = %tree.source.start
+ %stop = %tree.source.stop
+ %filename = (%tree.source.filename or "???")
+
+ %err_line = (%source_code::line at %start)
+ %err_linenum = (%source_code::line number at %start)
+ %err_linepos = (%source_code::line position at %start)
# TODO: better handle multi-line errors
%err_size = (..)
min of [..]
- %err.source.stop - %err.source.start
+ %stop - %start
(size of %err_line) - %err_linepos + 1
%nl_indicator = (" " if (%err_linepos > (size of %err_line)) else "")
- %fmt_str = " %\(size of "\(%err_linenum + %context)")d|"
- local action [num %i] (%fmt_str::formatted with 0)
+ %fmt_str = " %\(size of "\(%err_linenum + %CONTEXT)")d|"
+ local action [num %i] (%fmt_str::formatted with %i)
%linenum_size = (size of (num 0))
%pointer = "\(" "::* (%err_linepos + %linenum_size - 1))"
if (%err_size >= 2):
- %pointer += "\(%pointer)╚\("═"::* (%err_size - 2))╝"
+ %pointer += "╚\("═"::* (%err_size - 2))╝"
..else:
- %pointer += "\(%pointer)⬆"
+ %pointer += "⬆"
- %err_msg = "\027[33;41;1m\(%err.title or "Error") at \(%err.source.filename or "???"):\(%err_linenum)\027[0m"
- for %i in (%err_linenum - %context) to (%err_linenum - 1):
- %line = (%err_code::line %i)
+ %err_msg = "\027[33;41;1m\(%title or "Error") at \(%filename):\(%err_linenum)\027[0m"
+ for %i in (%err_linenum - %CONTEXT) to (%err_linenum - 1):
+ %line = (%source_code::line %i)
if %line:
%err_msg += "\n\027[2m\(num %i)\027[0m\(%line)\027[0m"
if %err_line:
@@ -45,15 +49,15 @@ action [%err as a pretty error]:
%during = %err_line.[%err_linepos, %err_linepos + %err_size - 1]
%after = %err_line.[%err_linepos + %err_size, -1]
%err_line = "\027[0m\(%before)\027[41;30m\(%during)\(%nl_indicator)\027[0m\(%after)"
- %err_msg += "\n\027[2m\(%fmt_str::formated with %err_linenum)\(%err_line)\027[0m"
- %err_linenum_end = (%err_code::line number at %err.source.stop)
- %err_linepos_end = (%err_code::line position at %err.source.stop)
+ %err_msg += "\n\027[2m\(num %err_linenum)\(%err_line)\027[0m"
+ %err_linenum_end = (%source_code::line number at %stop)
+ %err_linepos_end = (%source_code::line position at %stop)
%err_linenum_end or= %err_linenum
if (%err_linenum_end == %err_linenum):
%err_msg += "\n\(%pointer)"
..else:
for %i in (%err_linenum + 1) to %err_linenum_end:
- %line = (%err_code::line %i)
+ %line = (%source_code::line %i)
if %line:
if (%i == %err_linenum_end):
%during = %line.[1, %err_linepos_end - 1]
@@ -64,13 +68,18 @@ action [%err as a pretty error]:
%box_width = 70
%err_text = "\
- ..\027[47;31;1m\((" \(%err.error)"::wrapped to %box_width)::with "\n" -> "\n\027[47;31;1m ")"
- if %err.hint:
- err_text += "\n\027[47;30m\((" Suggestion: \(%err.hint)"::wrapped to %box_width)::with "\n" -> "\n\027[47;30m ")"
+ ..\027[47;31;1m\((" \(%err)"::wrapped to %box_width)::with "\n" -> "\n\027[47;31;1m ")"
+ if %hint:
+ %err_text += "\n\027[47;30m\((" Suggestion: \(%hint)"::wrapped to %box_width)::with "\n" -> "\n\027[47;30m ")"
%err_msg += "\n\027[33;1m \((%err_text boxed)::with "\n" -> "\n ")"
- for %i in (%err_linenum_end + 1) to (%err_linenum_end + %context):
- %line = (%err_code::line %i)
+ for %i in (%err_linenum_end + 1) to (%err_linenum_end + %CONTEXT):
+ %line = (%source_code::line %i)
if %line:
%err_msg += "\n\027[2m\(num %i)\027[0m\(%line)\027[0m"
return %err_msg
+
+action [pretty %title error at %tree %err] (pretty %title error at %tree %err (nil))
+
+action [%err_tree as a pretty error] (..)
+ pretty %err_tree.title error at %err_tree %err_tree.error hint %err_tree.hint