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`',
|
||||
right_pos)
|
||||
}
|
||||
c.stmts(node.or_block.stmts)
|
||||
c.stmts_ending_with_expression(node.or_block.stmts)
|
||||
} else {
|
||||
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.stmts(node.or_block.stmts)
|
||||
c.stmts_ending_with_expression(node.or_block.stmts)
|
||||
c.expected_or_type = ast.void_type
|
||||
if node.or_block.kind == .propagate && !c.table.cur_fn.return_type.has_flag(.optional)
|
||||
&& !c.inside_const {
|
||||
|
@ -4698,7 +4698,7 @@ fn (mut c Checker) stmt(node ast.Stmt) {
|
|||
}
|
||||
}
|
||||
c.inside_defer = true
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.inside_defer = false
|
||||
}
|
||||
ast.EnumDecl {
|
||||
|
@ -4811,10 +4811,10 @@ fn (mut c Checker) assert_stmt(node ast.AssertStmt) {
|
|||
fn (mut c Checker) block(node ast.Block) {
|
||||
if node.is_unsafe {
|
||||
c.inside_unsafe = true
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.inside_unsafe = false
|
||||
} 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.check_loop_label(node.label, node.pos)
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.loop_label = prev_loop_label
|
||||
c.in_for_count--
|
||||
}
|
||||
|
@ -4857,7 +4857,7 @@ fn (mut c Checker) comptime_for(node ast.ComptimeFor) {
|
|||
if node.kind == .fields {
|
||||
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) {
|
||||
|
@ -4967,7 +4967,7 @@ fn (mut c Checker) for_in_stmt(mut node ast.ForInStmt) {
|
|||
}
|
||||
}
|
||||
c.check_loop_label(node.label, node.pos)
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.loop_label = prev_loop_label
|
||||
c.in_for_count--
|
||||
}
|
||||
|
@ -5003,7 +5003,7 @@ fn (mut c Checker) for_stmt(mut node ast.ForStmt) {
|
|||
// TODO: update loop var type
|
||||
// how does this work currenly?
|
||||
c.check_loop_label(node.label, node.pos)
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.loop_label = prev_loop_label
|
||||
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
|
||||
fn (mut c Checker) stmts_list(stmts []ast.Stmt) {
|
||||
// stmts should be used for processing normal statement lists (fn bodies, for loop bodies etc).
|
||||
fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
||||
old_stmt_level := c.stmt_level
|
||||
c.stmt_level = 0
|
||||
c.stmts(stmts)
|
||||
c.stmts_ending_with_expression(stmts)
|
||||
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,
|
||||
// For example for the or block in `x := opt() or { stmt1 stmt2 ExprStmt }`
|
||||
fn (mut c Checker) stmts(stmts []ast.Stmt) {
|
||||
// stmts_ending_with_expression, should be used for processing list of statements, that can end with an expression.
|
||||
// Examples for such lists are the bodies of `or` blocks, `if` expressions and `match` expressions:
|
||||
// `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{
|
||||
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
|
||||
for branch in node.branches {
|
||||
if node.is_expr {
|
||||
c.stmts(branch.stmts)
|
||||
c.stmts_ending_with_expression(branch.stmts)
|
||||
} else {
|
||||
c.stmts_list(branch.stmts)
|
||||
c.stmts(branch.stmts)
|
||||
}
|
||||
if node.is_expr {
|
||||
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
|
||||
}
|
||||
|
@ -6715,7 +6718,7 @@ pub fn (mut c Checker) lock_expr(mut node ast.LockExpr) ast.Type {
|
|||
c.locked_names << id_name
|
||||
}
|
||||
}
|
||||
c.stmts_list(node.stmts)
|
||||
c.stmts(node.stmts)
|
||||
c.rlocked_names = []
|
||||
c.locked_names = []
|
||||
// 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 node_is_expr {
|
||||
c.stmts(branch.stmts)
|
||||
c.stmts_ending_with_expression(branch.stmts)
|
||||
} else {
|
||||
c.stmts_list(branch.stmts)
|
||||
c.stmts(branch.stmts)
|
||||
}
|
||||
} else if c.pref.output_cross_c {
|
||||
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 = []
|
||||
}
|
||||
if node_is_expr {
|
||||
c.stmts(branch.stmts)
|
||||
c.stmts_ending_with_expression(branch.stmts)
|
||||
} else {
|
||||
c.stmts_list(branch.stmts)
|
||||
c.stmts(branch.stmts)
|
||||
}
|
||||
} else if !is_comptime_type_is_expr {
|
||||
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`
|
||||
c.smartcast_if_conds(branch.cond, mut branch.scope)
|
||||
if node_is_expr {
|
||||
c.stmts(branch.stmts)
|
||||
c.stmts_ending_with_expression(branch.stmts)
|
||||
} else {
|
||||
c.stmts_list(branch.stmts)
|
||||
c.stmts(branch.stmts)
|
||||
}
|
||||
}
|
||||
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 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
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
c.stmts(node.or_expr.stmts)
|
||||
c.stmts_ending_with_expression(node.or_expr.stmts)
|
||||
c.check_expr_opt_call(node, typ)
|
||||
return typ
|
||||
}
|
||||
|
@ -8457,7 +8460,7 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
|||
}
|
||||
}
|
||||
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_return = c.returns || node_has_top_return
|
||||
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
|
||||
}
|
||||
c.stmts_list(node.decl.stmts)
|
||||
c.stmts(node.decl.stmts)
|
||||
c.fn_decl(mut node.decl)
|
||||
return node.typ
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue