aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-01-24 11:23:49 +0000
committerGitHub <noreply@github.com>2024-01-24 11:23:49 +0000
commit5f41741e8c3544efca28058c56db22cf51cba2f2 (patch)
treed475f8611947d39bcc3413811fa84a3b234125d9
parent8a067bc1fceee9ffe6fa4017513b3a9a95437b9b (diff)
parentf63f28302e5d493183fb77ceedcda759dcc1c3c6 (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.odin20
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