aboutsummaryrefslogtreecommitdiff
path: root/src/fmt.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-19 10:41:25 +0200
committerlemon <lsof@mailbox.org>2022-08-19 10:41:25 +0200
commite9543de5ab1de08a452de4b9df705c43aa9ff6ac (patch)
tree0bfbb8c2794a1181c4e52d29b351239c447f42c8 /src/fmt.cff
parentb6c31ebc4a33831c8f59e43984f3af950d418b88 (diff)
templates
Diffstat (limited to 'src/fmt.cff')
-rw-r--r--src/fmt.cff27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/fmt.cff b/src/fmt.cff
index 111809f..91f13d8 100644
--- a/src/fmt.cff
+++ b/src/fmt.cff
@@ -67,8 +67,8 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list)
p('$');
ps(tok.u.ident);
if quote { p('\''); }
- case :type;
- pfmt(proc, parg, "%t", tok.ty);
+ case :typearg;
+ pfmt(proc, parg, "type parameter `%s' (%t)", tok.u.ident, tok.ty);
case :eof;
ps("<end of file>");
case else
@@ -110,8 +110,10 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list)
ps("label");
case :gensym;
ps("gensym");
- case :type;
- ps("type argument");
+ case :typearg;
+ ps("type parameter");
+ case :eof;
+ ps("<end of file>");
case else
if t >= 0 and t < NUM_KEYWORDS {
p('`');
@@ -175,6 +177,21 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list)
} else {
ps("(anonymous)");
}
+ if agg.tpargs.#ptr {
+ p('<');
+ for let i = 0z; i < agg.tpargs.#len; ++i {
+ switch agg.tpargs[i] {
+ case Ty ty;
+ pfmt(proc, parg, "%t", ty);
+ case Val tok;
+ pfmt(proc, parg, "%T", tok);
+ }
+ if i < agg.tpargs.#len - 1 {
+ ps(", ");
+ }
+ }
+ ps("\e[1m>");
+ }
case Enum e;
if e.name {
ps(e.name);
@@ -341,7 +358,7 @@ extern fn vdiag(P *Parser, loc Loc, kind *const u8, fmt *const u8, ap va_list) v
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);
+ ep.tepl ? "template" : "macro", ep.name, ep.loc);
eprifileline(ep.loc);
} else if ep.name != #null and i == 8 {
efmt(" ... (some expansions omitted)\n");