checker: improve naming for `.stmts()` and `c.stmts_ending_with_expression()`, add a better explanation for their purpose
							parent
							
								
									deaeffc4db
								
							
						
					
					
						commit
						8315e82188
					
				| 
						 | 
					@ -1498,7 +1498,7 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
 | 
				
			||||||
					c.error('cannot push non-reference `$right_sym.name` on `$left_sym.name`',
 | 
										c.error('cannot push non-reference `$right_sym.name` on `$left_sym.name`',
 | 
				
			||||||
						right_pos)
 | 
											right_pos)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				c.stmts(node.or_block.stmts)
 | 
									c.stmts_ending_with_expression(node.or_block.stmts)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				c.error('cannot push on non-channel `$left_sym.name`', left_pos)
 | 
									c.error('cannot push on non-channel `$left_sym.name`', left_pos)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1854,7 +1854,7 @@ pub fn (mut c Checker) call_expr(mut node ast.CallExpr) ast.Type {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.expected_or_type = node.return_type.clear_flag(.optional)
 | 
						c.expected_or_type = node.return_type.clear_flag(.optional)
 | 
				
			||||||
	c.stmts(node.or_block.stmts)
 | 
						c.stmts_ending_with_expression(node.or_block.stmts)
 | 
				
			||||||
	c.expected_or_type = ast.void_type
 | 
						c.expected_or_type = ast.void_type
 | 
				
			||||||
	if node.or_block.kind == .propagate && !c.table.cur_fn.return_type.has_flag(.optional)
 | 
						if node.or_block.kind == .propagate && !c.table.cur_fn.return_type.has_flag(.optional)
 | 
				
			||||||
		&& !c.inside_const {
 | 
							&& !c.inside_const {
 | 
				
			||||||
| 
						 | 
					@ -4698,7 +4698,7 @@ fn (mut c Checker) stmt(node ast.Stmt) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			c.inside_defer = true
 | 
								c.inside_defer = true
 | 
				
			||||||
			c.stmts_list(node.stmts)
 | 
								c.stmts(node.stmts)
 | 
				
			||||||
			c.inside_defer = false
 | 
								c.inside_defer = false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ast.EnumDecl {
 | 
							ast.EnumDecl {
 | 
				
			||||||
| 
						 | 
					@ -4811,10 +4811,10 @@ fn (mut c Checker) assert_stmt(node ast.AssertStmt) {
 | 
				
			||||||
fn (mut c Checker) block(node ast.Block) {
 | 
					fn (mut c Checker) block(node ast.Block) {
 | 
				
			||||||
	if node.is_unsafe {
 | 
						if node.is_unsafe {
 | 
				
			||||||
		c.inside_unsafe = true
 | 
							c.inside_unsafe = true
 | 
				
			||||||
		c.stmts_list(node.stmts)
 | 
							c.stmts(node.stmts)
 | 
				
			||||||
		c.inside_unsafe = false
 | 
							c.inside_unsafe = false
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		c.stmts_list(node.stmts)
 | 
							c.stmts(node.stmts)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4843,7 +4843,7 @@ fn (mut c Checker) for_c_stmt(node ast.ForCStmt) {
 | 
				
			||||||
		c.stmt(node.inc)
 | 
							c.stmt(node.inc)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.check_loop_label(node.label, node.pos)
 | 
						c.check_loop_label(node.label, node.pos)
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
	c.loop_label = prev_loop_label
 | 
						c.loop_label = prev_loop_label
 | 
				
			||||||
	c.in_for_count--
 | 
						c.in_for_count--
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -4857,7 +4857,7 @@ fn (mut c Checker) comptime_for(node ast.ComptimeFor) {
 | 
				
			||||||
	if node.kind == .fields {
 | 
						if node.kind == .fields {
 | 
				
			||||||
		c.comptime_fields_type[node.val_var] = node.typ
 | 
							c.comptime_fields_type[node.val_var] = node.typ
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
 | 
					fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
 | 
				
			||||||
| 
						 | 
					@ -4967,7 +4967,7 @@ fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.check_loop_label(node.label, node.pos)
 | 
						c.check_loop_label(node.label, node.pos)
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
	c.loop_label = prev_loop_label
 | 
						c.loop_label = prev_loop_label
 | 
				
			||||||
	c.in_for_count--
 | 
						c.in_for_count--
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -5003,7 +5003,7 @@ fn (mut c Checker) for_stmt(mut node ast.ForStmt) {
 | 
				
			||||||
	// TODO: update loop var type
 | 
						// TODO: update loop var type
 | 
				
			||||||
	// how does this work currenly?
 | 
						// how does this work currenly?
 | 
				
			||||||
	c.check_loop_label(node.label, node.pos)
 | 
						c.check_loop_label(node.label, node.pos)
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
	c.loop_label = prev_loop_label
 | 
						c.loop_label = prev_loop_label
 | 
				
			||||||
	c.in_for_count--
 | 
						c.in_for_count--
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -5306,17 +5306,20 @@ fn (mut c Checker) import_stmt(node ast.Import) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// stmts_list is the same as .stmts(), but it should be called for top level statements in the inner scope
 | 
					// stmts should be used for processing normal statement lists (fn bodies, for loop bodies etc).
 | 
				
			||||||
fn (mut c Checker) stmts_list(stmts []ast.Stmt) {
 | 
					fn (mut c Checker) stmts(stmts []ast.Stmt) {
 | 
				
			||||||
	old_stmt_level := c.stmt_level
 | 
						old_stmt_level := c.stmt_level
 | 
				
			||||||
	c.stmt_level = 0
 | 
						c.stmt_level = 0
 | 
				
			||||||
	c.stmts(stmts)
 | 
						c.stmts_ending_with_expression(stmts)
 | 
				
			||||||
	c.stmt_level = old_stmt_level
 | 
						c.stmt_level = old_stmt_level
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// stmts processes a list of statements. It can be called even for a list of statements that end with an expression,
 | 
					// stmts_ending_with_expression, should be used for processing list of statements, that can end with an expression.
 | 
				
			||||||
// For example for the or block in `x := opt() or { stmt1 stmt2 ExprStmt }`
 | 
					// Examples for such lists are the bodies of `or` blocks, `if` expressions and `match` expressions:
 | 
				
			||||||
fn (mut c Checker) stmts(stmts []ast.Stmt) {
 | 
					//    `x := opt() or { stmt1 stmt2 ExprStmt }`,
 | 
				
			||||||
 | 
					//    `x := if cond { stmt1 stmt2 ExprStmt } else { stmt2 stmt3 ExprStmt }`,
 | 
				
			||||||
 | 
					//    `x := match expr { Type1 { stmt1 stmt2 ExprStmt } else { stmt2 stmt3 ExprStmt }`.
 | 
				
			||||||
 | 
					fn (mut c Checker) stmts_ending_with_expression(stmts []ast.Stmt) {
 | 
				
			||||||
	mut unreachable := token.Position{
 | 
						mut unreachable := token.Position{
 | 
				
			||||||
		line_nr: -1
 | 
							line_nr: -1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -6239,9 +6242,9 @@ pub fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
 | 
				
			||||||
	mut nbranches_without_return := 0
 | 
						mut nbranches_without_return := 0
 | 
				
			||||||
	for branch in node.branches {
 | 
						for branch in node.branches {
 | 
				
			||||||
		if node.is_expr {
 | 
							if node.is_expr {
 | 
				
			||||||
			c.stmts(branch.stmts)
 | 
								c.stmts_ending_with_expression(branch.stmts)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			c.stmts_list(branch.stmts)
 | 
								c.stmts(branch.stmts)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if node.is_expr {
 | 
							if node.is_expr {
 | 
				
			||||||
			if branch.stmts.len > 0 {
 | 
								if branch.stmts.len > 0 {
 | 
				
			||||||
| 
						 | 
					@ -6687,7 +6690,7 @@ pub fn (mut c Checker) select_expr(mut node ast.SelectExpr) ast.Type {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		c.stmts_list(branch.stmts)
 | 
							c.stmts(branch.stmts)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ast.bool_type
 | 
						return ast.bool_type
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -6715,7 +6718,7 @@ pub fn (mut c Checker) lock_expr(mut node ast.LockExpr) ast.Type {
 | 
				
			||||||
			c.locked_names << id_name
 | 
								c.locked_names << id_name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
	c.rlocked_names = []
 | 
						c.rlocked_names = []
 | 
				
			||||||
	c.locked_names = []
 | 
						c.locked_names = []
 | 
				
			||||||
	// handle `x := rlock a { a.getval() }`
 | 
						// handle `x := rlock a { a.getval() }`
 | 
				
			||||||
| 
						 | 
					@ -6889,9 +6892,9 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if !c.skip_flags {
 | 
								if !c.skip_flags {
 | 
				
			||||||
				if node_is_expr {
 | 
									if node_is_expr {
 | 
				
			||||||
					c.stmts(branch.stmts)
 | 
										c.stmts_ending_with_expression(branch.stmts)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					c.stmts_list(branch.stmts)
 | 
										c.stmts(branch.stmts)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else if c.pref.output_cross_c {
 | 
								} else if c.pref.output_cross_c {
 | 
				
			||||||
				mut is_freestanding_block := false
 | 
									mut is_freestanding_block := false
 | 
				
			||||||
| 
						 | 
					@ -6905,9 +6908,9 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
 | 
				
			||||||
					node.branches[i].stmts = []
 | 
										node.branches[i].stmts = []
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if node_is_expr {
 | 
									if node_is_expr {
 | 
				
			||||||
					c.stmts(branch.stmts)
 | 
										c.stmts_ending_with_expression(branch.stmts)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					c.stmts_list(branch.stmts)
 | 
										c.stmts(branch.stmts)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else if !is_comptime_type_is_expr {
 | 
								} else if !is_comptime_type_is_expr {
 | 
				
			||||||
				node.branches[i].stmts = []
 | 
									node.branches[i].stmts = []
 | 
				
			||||||
| 
						 | 
					@ -6923,9 +6926,9 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
 | 
				
			||||||
			// smartcast sumtypes and interfaces when using `is`
 | 
								// smartcast sumtypes and interfaces when using `is`
 | 
				
			||||||
			c.smartcast_if_conds(branch.cond, mut branch.scope)
 | 
								c.smartcast_if_conds(branch.cond, mut branch.scope)
 | 
				
			||||||
			if node_is_expr {
 | 
								if node_is_expr {
 | 
				
			||||||
				c.stmts(branch.stmts)
 | 
									c.stmts_ending_with_expression(branch.stmts)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				c.stmts_list(branch.stmts)
 | 
									c.stmts(branch.stmts)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if expr_required {
 | 
							if expr_required {
 | 
				
			||||||
| 
						 | 
					@ -7429,7 +7432,7 @@ pub fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if node.op == .arrow {
 | 
						if node.op == .arrow {
 | 
				
			||||||
		if right_sym.kind == .chan {
 | 
							if right_sym.kind == .chan {
 | 
				
			||||||
			c.stmts(node.or_block.stmts)
 | 
								c.stmts_ending_with_expression(node.or_block.stmts)
 | 
				
			||||||
			return right_sym.chan_info().elem_type
 | 
								return right_sym.chan_info().elem_type
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		c.error('<- operator can only be used with `chan` types', node.pos)
 | 
							c.error('<- operator can only be used with `chan` types', node.pos)
 | 
				
			||||||
| 
						 | 
					@ -7573,7 +7576,7 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
 | 
				
			||||||
			typ = value_type
 | 
								typ = value_type
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.stmts(node.or_expr.stmts)
 | 
						c.stmts_ending_with_expression(node.or_expr.stmts)
 | 
				
			||||||
	c.check_expr_opt_call(node, typ)
 | 
						c.check_expr_opt_call(node, typ)
 | 
				
			||||||
	return typ
 | 
						return typ
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -8457,7 +8460,7 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.fn_scope = node.scope
 | 
						c.fn_scope = node.scope
 | 
				
			||||||
	c.stmts_list(node.stmts)
 | 
						c.stmts(node.stmts)
 | 
				
			||||||
	node_has_top_return := has_top_return(node.stmts)
 | 
						node_has_top_return := has_top_return(node.stmts)
 | 
				
			||||||
	node.has_return = c.returns || node_has_top_return
 | 
						node.has_return = c.returns || node_has_top_return
 | 
				
			||||||
	c.check_noreturn_fn_decl(mut node)
 | 
						c.check_noreturn_fn_decl(mut node)
 | 
				
			||||||
| 
						 | 
					@ -8491,7 +8494,7 @@ fn (mut c Checker) anon_fn(mut node ast.AnonFn) ast.Type {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		var.typ = parent_var.typ
 | 
							var.typ = parent_var.typ
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.stmts_list(node.decl.stmts)
 | 
						c.stmts(node.decl.stmts)
 | 
				
			||||||
	c.fn_decl(mut node.decl)
 | 
						c.fn_decl(mut node.decl)
 | 
				
			||||||
	return node.typ
 | 
						return node.typ
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue