Browse Source

Improve -insert-semicolon rules

gingerBill 4 years ago
parent
commit
f64584b92a
2 changed files with 6 additions and 12 deletions
  1. 3 6
      core/odin/parser/parser.odin
  2. 3 6
      src/parser.cpp

+ 3 - 6
core/odin/parser/parser.odin

@@ -521,6 +521,7 @@ parse_stmt_list :: proc(p: ^Parser) -> []^ast.Stmt {
 }
 
 parse_block_stmt :: proc(p: ^Parser, is_when: bool) -> ^ast.Stmt {
+	skip_possible_newline_for_literal(p);
 	if !is_when && p.curr_proc == nil {
 		error(p, p.curr_tok.pos, "you cannot use a block statement in the file scope");
 	}
@@ -545,10 +546,10 @@ parse_when_stmt :: proc(p: ^Parser) -> ^ast.When_Stmt {
 	if allow_token(p, .Do) {
 		body = convert_stmt_to_body(p, parse_stmt(p));
 	} else {
-		skip_possible_newline_for_literal(p);
 		body = parse_block_stmt(p, true);
 	}
 
+	skip_possible_newline_for_literal(p);
 	if allow_token(p, .Else) {
 		#partial switch p.curr_tok.kind {
 		case .When:
@@ -621,18 +622,17 @@ parse_if_stmt :: proc(p: ^Parser) -> ^ast.If_Stmt {
 	if allow_token(p, .Do) {
 		body = convert_stmt_to_body(p, parse_stmt(p));
 	} else {
-		skip_possible_newline_for_literal(p);
 		body = parse_block_stmt(p, false);
 	}
 
 	else_tok := p.curr_tok.pos;
 
+	skip_possible_newline_for_literal(p);
 	if allow_token(p, .Else) {
 		#partial switch p.curr_tok.kind {
 		case .If:
 			else_stmt = parse_if_stmt(p);
 		case .Open_Brace:
-			skip_possible_newline_for_literal(p);
 			else_stmt = parse_block_stmt(p, false);
 		case .Do:
 			expect_token(p, .Do);
@@ -687,7 +687,6 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
 			if allow_token(p, .Do) {
 				body = convert_stmt_to_body(p, parse_stmt(p));
 			} else {
-				skip_possible_newline_for_literal(p);
 				body = parse_body(p);
 			}
 
@@ -722,7 +721,6 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
 	if allow_token(p, .Do) {
 		body = convert_stmt_to_body(p, parse_stmt(p));
 	} else {
-		skip_possible_newline_for_literal(p);
 		body = parse_body(p);
 	}
 
@@ -1094,7 +1092,6 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
 	    	if allow_token(p, .Do) {
 	    		body = convert_stmt_to_body(p, parse_stmt(p));
 	    	} else {
-			skip_possible_newline_for_literal(p);
 	    		body = parse_block_stmt(p, false);
 	    	}
 

+ 3 - 6
src/parser.cpp

@@ -3181,6 +3181,7 @@ Ast *parse_simple_stmt(AstFile *f, u32 flags) {
 
 
 Ast *parse_block_stmt(AstFile *f, b32 is_when) {
+	skip_possible_newline_for_literal(f);
 	if (!is_when && f->curr_proc == nullptr) {
 		syntax_error(f->curr_token, "You cannot use a block statement in the file scope");
 		return ast_bad_stmt(f, f->curr_token, f->curr_token);
@@ -3794,17 +3795,16 @@ Ast *parse_if_stmt(AstFile *f) {
 			syntax_error(body, "The body of a 'do' be on the same line as if condition");
 		}
 	} else {
-		skip_possible_newline_for_literal(f);
 		body = parse_block_stmt(f, false);
 	}
 
+	skip_possible_newline_for_literal(f);
 	if (allow_token(f, Token_else)) {
 		switch (f->curr_token.kind) {
 		case Token_if:
 			else_stmt = parse_if_stmt(f);
 			break;
 		case Token_OpenBrace:
-			skip_possible_newline_for_literal(f);
 			else_stmt = parse_block_stmt(f, false);
 			break;
 		case Token_do: {
@@ -3851,10 +3851,10 @@ Ast *parse_when_stmt(AstFile *f) {
 			syntax_error(body, "The body of a 'do' be on the same line as when statement");
 		}
 	} else {
-		skip_possible_newline_for_literal(f);
 		body = parse_block_stmt(f, true);
 	}
 
+	skip_possible_newline_for_literal(f);
 	if (allow_token(f, Token_else)) {
 		switch (f->curr_token.kind) {
 		case Token_when:
@@ -3957,7 +3957,6 @@ Ast *parse_for_stmt(AstFile *f) {
 					syntax_error(body, "The body of a 'do' be on the same line as the 'for' token");
 				}
 			} else {
-				skip_possible_newline_for_literal(f);
 				body = parse_block_stmt(f, false);
 			}
 			return ast_range_stmt(f, token, nullptr, nullptr, in_token, rhs, body);
@@ -3993,7 +3992,6 @@ Ast *parse_for_stmt(AstFile *f) {
 			syntax_error(body, "The body of a 'do' be on the same line as the 'for' token");
 		}
 	} else {
-		skip_possible_newline_for_literal(f);
 		body = parse_block_stmt(f, false);
 	}
 
@@ -4345,7 +4343,6 @@ Ast *parse_stmt(AstFile *f) {
 					syntax_error(body, "The body of a 'do' be on the same line as the 'for' token");
 				}
 			} else {
-				skip_possible_newline_for_literal(f);
 				body = parse_block_stmt(f, false);
 			}
 			if (bad_stmt) {