fix TypeDef parser to consume optional = before field block

type User = { name: String } was silently broken: the parser consumed
the type name then called expect(LBrace) while sitting on the = token.
expect() advances unconditionally on mismatch, so it consumed = and
treated { as the first field name, producing a corrupt TypeDef node.

The FnDef following the broken TypeDef was then parsed incorrectly or
lost entirely -- causing greet() and similar functions to vanish from
JS/C output with no error.

Fix: detect and skip the optional Eq token before expecting LBrace.
Both targets benefit; rebuild elc to pick up the fix.
This commit is contained in:
Will Anderson
2026-05-04 10:36:53 -05:00
parent 0f1da43a97
commit 7376349124
2 changed files with 6 additions and 1 deletions
BIN
View File
Binary file not shown.
+6 -1
View File
@@ -744,11 +744,16 @@ fn parse_stmt(tokens: [Map<String, Any>], pos: Int) -> Map<String, Any> {
return make_result({ "stmt": "FnDef", "name": name, "params": params, "body": body, "ret_type": ret_type }, p)
}
// type definition
// type definition: `type Name = { field: Type, ... }`
// The `=` between the name and the brace is optional in the spec but
// present in practice. Skip it if present before consuming the LBrace.
if k == "Type" {
let p = pos + 1
let name = tok_value(tokens, p)
let p = p + 1
// Consume optional `=` before the opening brace
let pk = tok_kind(tokens, p)
if pk == "Eq" { let p = p + 1 }
let p = expect(tokens, p, "LBrace")
let fields: [Map<String, Any>] = native_list_empty()
let running = true