Quellcode durchsuchen

Recover from faulty parameter in parse_proc_type

DanielGavin vor 1 Jahr
Ursprung
Commit
f63f28302e
1 geänderte Dateien mit 19 neuen und 1 gelöschten Zeilen
  1. 19 1
      core/odin/parser/parser.odin

+ 19 - 1
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