diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2024-01-24 11:23:49 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-24 11:23:49 +0000 |
| commit | 5f41741e8c3544efca28058c56db22cf51cba2f2 (patch) | |
| tree | d475f8611947d39bcc3413811fa84a3b234125d9 | |
| parent | 8a067bc1fceee9ffe6fa4017513b3a9a95437b9b (diff) | |
| parent | f63f28302e5d493183fb77ceedcda759dcc1c3c6 (diff) | |
Merge pull request #3126 from DanielGavin/parser-fix-paran
Improve recovery from faulty parameters 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 |