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:
Vendored
BIN
Binary file not shown.
@@ -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)
|
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" {
|
if k == "Type" {
|
||||||
let p = pos + 1
|
let p = pos + 1
|
||||||
let name = tok_value(tokens, p)
|
let name = tok_value(tokens, p)
|
||||||
let p = p + 1
|
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 p = expect(tokens, p, "LBrace")
|
||||||
let fields: [Map<String, Any>] = native_list_empty()
|
let fields: [Map<String, Any>] = native_list_empty()
|
||||||
let running = true
|
let running = true
|
||||||
|
|||||||
Reference in New Issue
Block a user