diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-01-22 20:35:26 +0100 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2024-01-22 20:35:26 +0100 |
| commit | f63f28302e5d493183fb77ceedcda759dcc1c3c6 (patch) | |
| tree | ae7e177d112f83b0c728802d8dce63129f215d2b | |
| parent | b8bfc715bf64363c31f12c483d50f3f014586acc (diff) | |
Recover from faulty parameter in parse_proc_type
| -rw-r--r-- | core/odin/parser/parser.odin | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index f11d0eb73..3383f3514 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -436,6 +436,24 @@ expect_closing_brace_of_field_list :: proc(p: ^Parser) -> tokenizer.Token { return expect_brace } +expect_closing_parentheses_of_field_list :: proc(p: ^Parser) -> tokenizer.Token { + token := p.curr_tok + if allow_token(p, .Close_Paren) { + return token + } + + if allow_token(p, .Semicolon) && !tokenizer.is_newline(token) { + str := tokenizer.token_to_string(token) + error(p, end_of_line_pos(p, p.prev_tok), "expected a comma, got %s", str) + } + + for p.curr_tok.kind != .Close_Paren && p.curr_tok.kind != .EOF && !is_non_inserted_semicolon(p.curr_tok) { + advance_token(p) + } + + return expect_token(p, .Close_Paren) +} + is_non_inserted_semicolon :: proc(tok: tokenizer.Token) -> bool { return tok.kind == .Semicolon && tok.text != "\n" } @@ -2095,7 +2113,7 @@ parse_proc_type :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Proc_Type { expect_token(p, .Open_Paren) params, _ := parse_field_list(p, .Close_Paren, ast.Field_Flags_Signature_Params) - expect_token(p, .Close_Paren) + expect_closing_parentheses_of_field_list(p) results, diverging := parse_results(p) is_generic := false |