aboutsummaryrefslogtreecommitdiff
path: root/src/fmt.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-18 17:39:25 +0200
committerlemon <lsof@mailbox.org>2022-08-18 17:39:25 +0200
commit9c485da5e1d955031fa2a3654bfc2ef814898167 (patch)
tree44e841ced0479d5ec82cca28733413784eedf52c /src/fmt.cff
parentf0214ff61b5a94b9629db6f43d7a5b010bd4ffbc (diff)
lots of goodnes
Diffstat (limited to 'src/fmt.cff')
-rw-r--r--src/fmt.cff24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/fmt.cff b/src/fmt.cff
index 0dce9d3..111809f 100644
--- a/src/fmt.cff
+++ b/src/fmt.cff
@@ -150,7 +150,11 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list)
case Ptr child;
pfmt(proc, parg, "*%t", child);
case Arr arr;
- pfmt(proc, parg, "[%I]%t", arr.length, arr.child);
+ if arr.length < 0 {
+ pfmt(proc, parg, "[]%t", arr.child);
+ } else {
+ pfmt(proc, parg, "[%I]%t", arr.length, arr.child);
+ }
case Slice child;
pfmt(proc, parg, "[#]%t", child);
case Fn f;
@@ -169,6 +173,13 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list)
if agg.name {
ps(agg.name);
} else {
+ ps("(anonymous)");
+ }
+ case Enum e;
+ if e.name {
+ ps(e.name);
+ } else {
+ ps("(anonymous)");
}
}
}
@@ -326,6 +337,17 @@ extern fn vdiag(P *Parser, loc Loc, kind *const u8, fmt *const u8, ap va_list) v
vefmt(fmt, ap);
efmt("\n");
eprifileline(loc);
+ let i = 0;
+ for let ep = P.curexpan; ep; ep = ep.prev {
+ if ep.name != #null and (i++ < 8 or ep.prev == #null or ep.prev.prev == #null) {
+ efmt("* while expanding %s `%s' at %l\n",
+ "macro", ep.name, ep.loc);
+ eprifileline(ep.loc);
+ } else if ep.name != #null and i == 8 {
+ efmt(" ... (some expansions omitted)\n");
+ }
+
+ }
}
extern fn warn(P *Parser, loc Loc, fmt *const u8, ...) void {