compiler: text keys' follow-up (Master's rulings) - a Key in a template literal's hole is an error (the parser marks each hole's string(), TPL_HOLE; write trf(k"...", ...)), trn takes only a plural key kn"..." and tr / trf refuse one (with or without en.po), and a program with no lang line (a package test) uses key literals unchecked and silently - the warning stays for a lang line whose en.po is missing; rejected/i18n_keys gains key_hole (2) and key_rules (3), key_missing's plural moves to trn; LANGUAGE.md and the changeset say so; reseeded, bootstrap-cfree fixpoint holds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-29 23:46:48 +03:00
parent 66b8e51026
commit 9f9ac4a7ce
13 changed files with 72839 additions and 72164 deletions

View file

@ -100,6 +100,7 @@ function ck_builtin(e: Node, name: pointer) -> pointer {
ck_walk_args(e)
return "string"
}
if (name == "string") and ck_tpl_hole(e) { return ck_hole(e) }
if (name == "string") or (name == "int") or (name == "float") or (name == "fixed") or (name == "long") or (name == "double") {
ck_walk_args(e)
return name
@ -313,3 +314,12 @@ function ck_emit(s: Node) -> void {
i += 1
}
}
# a template literal's {hole}: text, never a key - a Key there would draw its marked name untranslated
function ck_tpl_hole(e: Node) -> bool {
return e.a != null and (e.a.uns == TPL_HOLE or e.a.uns == TPL_COPY) and len(e.kids) == 1
}
function ck_hole(e: Node) -> pointer {
let t = ck_expr(e.kids[0])
if ck_is_key(t) { ck_err("key", e.kids[0], "a Key in a template's {hole}: a key names a text, it is not one - translate it with trf(k\"...\", ...) (tr(key) for no values), or say string(key) outside the template if the marked name is really wanted") }
return "string"
}