1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

ast: use const empty_expr instead of fn empty_expr (thanks to Joe Conigliaro for the idea) (#15175)

This commit is contained in:
Delyan Angelov 2022-07-22 12:14:46 +03:00 committed by GitHub
parent c6aea659e3
commit e9809572b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 64 additions and 71 deletions

View File

@ -146,30 +146,23 @@ pub fn (cty ComptimeType) str() string {
} }
} }
pub struct EmptyExpr { pub type EmptyExpr = u8
x int
}
pub fn empty_expr() Expr {
return EmptyExpr{}
}
pub struct EmptyStmt { pub struct EmptyStmt {
pub: pub:
pos token.Pos pos token.Pos
} }
pub fn empty_stmt() Stmt {
return EmptyStmt{}
}
pub struct EmptyNode { pub struct EmptyNode {
x int pub:
pos token.Pos
} }
pub fn empty_node() Node { pub const empty_expr = Expr(EmptyExpr(0))
return EmptyNode{}
} pub const empty_stmt = Stmt(EmptyStmt{})
pub const empty_node = Node(EmptyNode{})
// `{stmts}` or `unsafe {stmts}` // `{stmts}` or `unsafe {stmts}`
pub struct Block { pub struct Block {

View File

@ -15,7 +15,7 @@ pub type ComptTimeConstValue = EmptyExpr
| u8 | u8
pub fn empty_comptime_const_expr() ComptTimeConstValue { pub fn empty_comptime_const_expr() ComptTimeConstValue {
return EmptyExpr{} return EmptyExpr(0)
} }
pub fn (val ComptTimeConstValue) i8() ?i8 { pub fn (val ComptTimeConstValue) i8() ?i8 {

View File

@ -7,9 +7,9 @@ pub fn resolve_init(node StructInit, typ Type, t &Table) Expr {
mut has_len := false mut has_len := false
mut has_cap := false mut has_cap := false
mut has_default := false mut has_default := false
mut len_expr := empty_expr() mut len_expr := empty_expr
mut cap_expr := empty_expr() mut cap_expr := empty_expr
mut default_expr := empty_expr() mut default_expr := empty_expr
mut exprs := []Expr{} mut exprs := []Expr{}
for field in node.fields { for field in node.fields {
match field.name { match field.name {

View File

@ -1432,7 +1432,7 @@ pub fn (mut t Table) bitsize_to_type(bit_size int) Type {
if bit_size % 8 != 0 { // there is no way to do `i2131(32)` so this should never be reached if bit_size % 8 != 0 { // there is no way to do `i2131(32)` so this should never be reached
t.panic('compiler bug: bitsizes must be multiples of 8') t.panic('compiler bug: bitsizes must be multiples of 8')
} }
return new_type(t.find_or_register_array_fixed(u8_type, bit_size / 8, empty_expr())) return new_type(t.find_or_register_array_fixed(u8_type, bit_size / 8, empty_expr))
} }
} }
} }

View File

@ -3103,7 +3103,7 @@ fn (mut c Checker) find_obj_definition(obj ast.ScopeObject) ?ast.Expr {
match obj { match obj {
ast.Var, ast.ConstField, ast.GlobalField, ast.AsmRegister { name = obj.name } ast.Var, ast.ConstField, ast.GlobalField, ast.AsmRegister { name = obj.name }
} }
mut expr := ast.empty_expr() mut expr := ast.empty_expr
if obj is ast.Var { if obj is ast.Var {
if obj.is_mut { if obj.is_mut {
return error('`$name` is mut and may have changed since its definition') return error('`$name` is mut and may have changed since its definition')

View File

@ -177,7 +177,7 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
} }
} }
if node.is_fixed { if node.is_fixed {
idx := c.table.find_or_register_array_fixed(elem_type, node.exprs.len, ast.empty_expr()) idx := c.table.find_or_register_array_fixed(elem_type, node.exprs.len, ast.empty_expr)
if elem_type.has_flag(.generic) { if elem_type.has_flag(.generic) {
node.typ = ast.new_type(idx).set_flag(.generic) node.typ = ast.new_type(idx).set_flag(.generic)
} else { } else {

View File

@ -411,7 +411,7 @@ pub fn (mut f Fmt) node_str(node ast.Node) string {
//=== General Stmt-related methods and helpers ===// //=== General Stmt-related methods and helpers ===//
pub fn (mut f Fmt) stmts(stmts []ast.Stmt) { pub fn (mut f Fmt) stmts(stmts []ast.Stmt) {
mut prev_stmt := if stmts.len > 0 { stmts[0] } else { ast.empty_stmt() } mut prev_stmt := if stmts.len > 0 { stmts[0] } else { ast.empty_stmt }
f.indent++ f.indent++
for stmt in stmts { for stmt in stmts {
if !f.pref.building_v && f.should_insert_newline_before_node(stmt, prev_stmt) { if !f.pref.building_v && f.should_insert_newline_before_node(stmt, prev_stmt) {

View File

@ -272,7 +272,7 @@ pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string {
module_built: module_built module_built: module_built
timers_should_print: timers_should_print timers_should_print: timers_should_print
timers: util.new_timers(should_print: timers_should_print, label: 'global_cgen') timers: util.new_timers(should_print: timers_should_print, label: 'global_cgen')
inner_loop: &ast.EmptyStmt{} inner_loop: &ast.empty_stmt
field_data_type: ast.Type(table.find_type_idx('FieldData')) field_data_type: ast.Type(table.find_type_idx('FieldData'))
is_cc_msvc: pref.ccompiler == 'msvc' is_cc_msvc: pref.ccompiler == 'msvc'
use_segfault_handler: !('no_segfault_handler' in pref.compile_defines || pref.os == .wasm32) use_segfault_handler: !('no_segfault_handler' in pref.compile_defines || pref.os == .wasm32)
@ -576,7 +576,7 @@ fn cgen_process_one_file_cb(p &pool.PoolProcessor, idx int, wid int) &Gen {
should_print: global_g.timers_should_print should_print: global_g.timers_should_print
label: 'cgen_process_one_file_cb idx: $idx, wid: $wid' label: 'cgen_process_one_file_cb idx: $idx, wid: $wid'
) )
inner_loop: &ast.EmptyStmt{} inner_loop: &ast.empty_stmt
field_data_type: ast.Type(global_g.table.find_type_idx('FieldData')) field_data_type: ast.Type(global_g.table.find_type_idx('FieldData'))
array_sort_fn: global_g.array_sort_fn array_sort_fn: global_g.array_sort_fn
waiter_fns: global_g.waiter_fns waiter_fns: global_g.waiter_fns
@ -3704,7 +3704,7 @@ fn (mut g Gen) select_expr(node ast.SelectExpr) {
mut is_push := []bool{cap: n_channels} mut is_push := []bool{cap: n_channels}
mut has_else := false mut has_else := false
mut has_timeout := false mut has_timeout := false
mut timeout_expr := ast.empty_expr() mut timeout_expr := ast.empty_expr
mut exception_branch := -1 mut exception_branch := -1
for j, branch in node.branches { for j, branch in node.branches {
if branch.is_else { if branch.is_else {
@ -3727,7 +3727,7 @@ fn (mut g Gen) select_expr(node ast.SelectExpr) {
elem_types << '' elem_types << ''
} else { } else {
// must be evaluated to tmp var before real `select` is performed // must be evaluated to tmp var before real `select` is performed
objs << ast.empty_expr() objs << ast.empty_expr
tmp_obj := g.new_tmp_var() tmp_obj := g.new_tmp_var()
tmp_objs << tmp_obj tmp_objs << tmp_obj
el_stype := g.typ(ast.mktyp(expr.right_type)) el_stype := g.typ(ast.mktyp(expr.right_type))

View File

@ -419,7 +419,7 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
if elem_sym.kind == .sum_type && left.sym.kind != .sum_type { if elem_sym.kind == .sum_type && left.sym.kind != .sum_type {
if node.left_type in elem_sym.sumtype_info().variants { if node.left_type in elem_sym.sumtype_info().variants {
new_node_left := ast.CastExpr{ new_node_left := ast.CastExpr{
arg: ast.EmptyExpr{} arg: ast.empty_expr
typ: elem_type typ: elem_type
expr: node.left expr: node.left
expr_type: node.left_type expr_type: node.left_type
@ -439,7 +439,7 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
if elem_type_.sym.kind == .sum_type { if elem_type_.sym.kind == .sum_type {
if node.left_type in elem_type_.sym.sumtype_info().variants { if node.left_type in elem_type_.sym.sumtype_info().variants {
new_node_left := ast.CastExpr{ new_node_left := ast.CastExpr{
arg: ast.EmptyExpr{} arg: ast.empty_expr
typ: elem_type typ: elem_type
expr: node.left expr: node.left
expr_type: node.left_type expr_type: node.left_type
@ -509,7 +509,7 @@ fn (mut g Gen) infix_expr_in_op(node ast.InfixExpr) {
if elem_type_.sym.kind == .sum_type { if elem_type_.sym.kind == .sum_type {
if node.left_type in elem_type_.sym.sumtype_info().variants { if node.left_type in elem_type_.sym.sumtype_info().variants {
new_node_left := ast.CastExpr{ new_node_left := ast.CastExpr{
arg: ast.EmptyExpr{} arg: ast.empty_expr
typ: elem_type typ: elem_type
expr: node.left expr: node.left
expr_type: node.left_type expr_type: node.left_type

View File

@ -390,7 +390,7 @@ pub fn (mut f Gen) node_str(node ast.Node) string {
//=== General Stmt-related methods and helpers ===// //=== General Stmt-related methods and helpers ===//
pub fn (mut f Gen) stmts(stmts []ast.Stmt) { pub fn (mut f Gen) stmts(stmts []ast.Stmt) {
mut prev_stmt := if stmts.len > 0 { stmts[0] } else { ast.empty_stmt() } mut prev_stmt := if stmts.len > 0 { stmts[0] } else { ast.empty_stmt }
f.indent++ f.indent++
for stmt in stmts { for stmt in stmts {
if !f.pref.building_v && f.should_insert_newline_before_node(stmt, prev_stmt) { if !f.pref.building_v && f.should_insert_newline_before_node(stmt, prev_stmt) {

View File

@ -210,7 +210,7 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme
} }
mut v := ast.Var{ mut v := ast.Var{
name: lx.name name: lx.name
expr: if left.len == right.len { right[i] } else { ast.empty_expr() } expr: if left.len == right.len { right[i] } else { ast.empty_expr }
share: share share: share
is_mut: lx.is_mut || p.inside_for is_mut: lx.is_mut || p.inside_for
pos: lx.pos pos: lx.pos

View File

@ -21,7 +21,7 @@ fn (mut p Parser) array_init() ast.ArrayInit {
mut has_type := false mut has_type := false
mut has_default := false mut has_default := false
mut has_it := false mut has_it := false
mut default_expr := ast.empty_expr() mut default_expr := ast.empty_expr
if p.tok.kind == .rsbr { if p.tok.kind == .rsbr {
last_pos = p.tok.pos() last_pos = p.tok.pos()
// []typ => `[]` and `typ` must be on the same line // []typ => `[]` and `typ` must be on the same line
@ -125,8 +125,8 @@ fn (mut p Parser) array_init() ast.ArrayInit {
} }
mut has_len := false mut has_len := false
mut has_cap := false mut has_cap := false
mut len_expr := ast.empty_expr() mut len_expr := ast.empty_expr
mut cap_expr := ast.empty_expr() mut cap_expr := ast.empty_expr
if p.tok.kind == .lcbr && exprs.len == 0 && array_type != ast.void_type { if p.tok.kind == .lcbr && exprs.len == 0 && array_type != ast.void_type {
// `[]int{ len: 10, cap: 100}` syntax // `[]int{ len: 10, cap: 100}` syntax
p.next() p.next()

View File

@ -10,7 +10,7 @@ import v.token
pub fn (mut p Parser) expr(precedence int) ast.Expr { pub fn (mut p Parser) expr(precedence int) ast.Expr {
return p.check_expr(precedence) or { return p.check_expr(precedence) or {
if token.is_decl(p.tok.kind) && p.disallow_declarations_in_script_mode() { if token.is_decl(p.tok.kind) && p.disallow_declarations_in_script_mode() {
return ast.empty_expr() return ast.empty_expr
} }
p.error_with_pos('invalid expression: unexpected $p.tok', p.tok.pos()) p.error_with_pos('invalid expression: unexpected $p.tok', p.tok.pos())
} }
@ -18,7 +18,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
pub fn (mut p Parser) check_expr(precedence int) ?ast.Expr { pub fn (mut p Parser) check_expr(precedence int) ?ast.Expr {
p.trace_parser('expr($precedence)') p.trace_parser('expr($precedence)')
mut node := ast.empty_expr() mut node := ast.empty_expr
is_stmt_ident := p.is_stmt_ident is_stmt_ident := p.is_stmt_ident
p.is_stmt_ident = false p.is_stmt_ident = false
if !p.pref.is_fmt { if !p.pref.is_fmt {
@ -509,7 +509,7 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr {
if p.inside_if_cond { if p.inside_if_cond {
p.if_cond_comments << p.eat_comments() p.if_cond_comments << p.eat_comments()
} }
mut right := ast.empty_expr() mut right := ast.empty_expr
prev_expecting_type := p.expecting_type prev_expecting_type := p.expecting_type
if op in [.key_is, .not_is] { if op in [.key_is, .not_is] {
p.expecting_type = true p.expecting_type = true

View File

@ -120,7 +120,7 @@ pub fn (mut p Parser) call_args() []ast.CallArg {
p.next() p.next()
array_decompose = true array_decompose = true
} }
mut expr := ast.empty_expr() mut expr := ast.empty_expr
if p.tok.kind == .name && p.peek_tok.kind == .colon { if p.tok.kind == .name && p.peek_tok.kind == .colon {
// `foo(key:val, key2:val2)` // `foo(key:val, key2:val2)`
expr = p.struct_init('void_type', .short_syntax) expr = p.struct_init('void_type', .short_syntax)

View File

@ -34,9 +34,9 @@ fn (mut p Parser) for_stmt() ast.Stmt {
if p.tok.kind == .key_mut { if p.tok.kind == .key_mut {
return p.error('`mut` is not needed in `for ;;` loops: use `for i := 0; i < n; i ++ {`') return p.error('`mut` is not needed in `for ;;` loops: use `for i := 0; i < n; i ++ {`')
} }
mut init := ast.empty_stmt() mut init := ast.empty_stmt
mut cond := p.new_true_expr() mut cond := p.new_true_expr()
mut inc := ast.empty_stmt() mut inc := ast.empty_stmt
mut has_init := false mut has_init := false
mut has_cond := false mut has_cond := false
mut has_inc := false mut has_inc := false
@ -137,7 +137,7 @@ fn (mut p Parser) for_stmt() ast.Stmt {
// 0 .. 10 // 0 .. 10
// start := p.tok.lit.int() // start := p.tok.lit.int()
// TODO use RangeExpr // TODO use RangeExpr
mut high_expr := ast.empty_expr() mut high_expr := ast.empty_expr
mut is_range := false mut is_range := false
if p.tok.kind == .dotdot { if p.tok.kind == .dotdot {
is_range = true is_range = true

View File

@ -79,7 +79,7 @@ fn (mut p Parser) if_expr(is_comptime bool) ast.IfExpr {
return ast.IfExpr{} return ast.IfExpr{}
} }
comments << p.eat_comments() comments << p.eat_comments()
mut cond := ast.empty_expr() mut cond := ast.empty_expr
mut is_guard := false mut is_guard := false
// if guard `if x,y := opt() {` // if guard `if x,y := opt() {`
@ -361,7 +361,7 @@ fn (mut p Parser) select_expr() ast.SelectExpr {
// final else // final else
mut is_else := false mut is_else := false
mut is_timeout := false mut is_timeout := false
mut stmt := ast.empty_stmt() mut stmt := ast.empty_stmt
if p.tok.kind == .key_else { if p.tok.kind == .key_else {
if has_timeout { if has_timeout {
p.error_with_pos('timeout `> t` and `else` are mutually exclusive `select` keys', p.error_with_pos('timeout `> t` and `else` are mutually exclusive `select` keys',

View File

@ -698,7 +698,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
return p.comment_stmt() return p.comment_stmt()
} }
else { else {
return p.other_stmts(ast.empty_stmt()) return p.other_stmts(ast.empty_stmt)
} }
} }
if p.should_abort { if p.should_abort {
@ -707,7 +707,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
} }
// TODO remove dummy return statement // TODO remove dummy return statement
// the compiler complains if it's not there // the compiler complains if it's not there
return ast.empty_stmt() return ast.empty_stmt
} }
fn comptime_if_expr_contains_top_stmt(if_expr ast.IfExpr) bool { fn comptime_if_expr_contains_top_stmt(if_expr ast.IfExpr) bool {
@ -743,7 +743,7 @@ fn (mut p Parser) other_stmts(cur_stmt ast.Stmt) ast.Stmt {
p.open_scope() p.open_scope()
mut stmts := []ast.Stmt{} mut stmts := []ast.Stmt{}
if cur_stmt != ast.empty_stmt() { if cur_stmt != ast.empty_stmt {
stmts << cur_stmt stmts << cur_stmt
} }
for p.tok.kind != .eof { for p.tok.kind != .eof {
@ -1707,7 +1707,7 @@ fn (mut p Parser) parse_attr() ast.Attr {
mut name := '' mut name := ''
mut has_arg := false mut has_arg := false
mut arg := '' mut arg := ''
mut comptime_cond := ast.empty_expr() mut comptime_cond := ast.empty_expr
mut comptime_cond_opt := false mut comptime_cond_opt := false
if p.tok.kind == .key_if { if p.tok.kind == .key_if {
kind = .comptime_define kind = .comptime_define
@ -2191,7 +2191,7 @@ fn (mut p Parser) is_generic_cast() bool {
pub fn (mut p Parser) name_expr() ast.Expr { pub fn (mut p Parser) name_expr() ast.Expr {
prev_tok_kind := p.prev_tok.kind prev_tok_kind := p.prev_tok.kind
mut node := ast.empty_expr() mut node := ast.empty_expr
if p.expecting_type { if p.expecting_type {
if p.tok.kind == .dollar { if p.tok.kind == .dollar {
node = p.parse_comptime_type() node = p.parse_comptime_type()
@ -2249,7 +2249,7 @@ pub fn (mut p Parser) name_expr() ast.Expr {
chan_type := p.parse_chan_type() chan_type := p.parse_chan_type()
elem_type_pos = elem_type_pos.extend(p.prev_tok.pos()) elem_type_pos = elem_type_pos.extend(p.prev_tok.pos())
mut has_cap := false mut has_cap := false
mut cap_expr := ast.empty_expr() mut cap_expr := ast.empty_expr
p.check(.lcbr) p.check(.lcbr)
if p.tok.kind == .rcbr { if p.tok.kind == .rcbr {
last_pos = p.tok.pos() last_pos = p.tok.pos()
@ -2380,8 +2380,8 @@ pub fn (mut p Parser) name_expr() ast.Expr {
// without the next line int would result in int* // without the next line int would result in int*
p.is_amp = false p.is_amp = false
p.check(.lpar) p.check(.lpar)
mut expr := ast.empty_expr() mut expr := ast.empty_expr
mut arg := ast.empty_expr() mut arg := ast.empty_expr
mut has_arg := false mut has_arg := false
expr = p.expr(0) expr = p.expr(0)
// TODO, string(b, len) // TODO, string(b, len)
@ -2505,7 +2505,7 @@ pub fn (mut p Parser) name_expr() ast.Expr {
typ: to_typ typ: to_typ
typname: p.table.sym(to_typ).name typname: p.table.sym(to_typ).name
expr: expr expr: expr
arg: ast.empty_expr() arg: ast.empty_expr
has_arg: false has_arg: false
pos: start_pos.extend(end_pos) pos: start_pos.extend(end_pos)
} }
@ -2535,7 +2535,7 @@ fn (mut p Parser) index_expr(left ast.Expr, is_gated bool) ast.IndexExpr {
has_low = false has_low = false
// [..end] // [..end]
p.next() p.next()
mut high := ast.empty_expr() mut high := ast.empty_expr
mut has_high := false mut has_high := false
if p.tok.kind != .rsbr { if p.tok.kind != .rsbr {
high = p.expr(0) high = p.expr(0)
@ -2564,7 +2564,7 @@ fn (mut p Parser) index_expr(left ast.Expr, is_gated bool) ast.IndexExpr {
left: left left: left
pos: pos_high pos: pos_high
index: ast.RangeExpr{ index: ast.RangeExpr{
low: ast.empty_expr() low: ast.empty_expr
high: high high: high
has_high: has_high has_high: has_high
pos: pos_high pos: pos_high
@ -2590,7 +2590,7 @@ fn (mut p Parser) index_expr(left ast.Expr, is_gated bool) ast.IndexExpr {
left: left left: left
pos: pos_high pos: pos_high
index: ast.RangeExpr{ index: ast.RangeExpr{
low: ast.empty_expr() low: ast.empty_expr
high: high high: high
has_high: has_high has_high: has_high
pos: pos_high pos: pos_high
@ -2610,7 +2610,7 @@ fn (mut p Parser) index_expr(left ast.Expr, is_gated bool) ast.IndexExpr {
if p.tok.kind == .dotdot { if p.tok.kind == .dotdot {
// either [start..end] or [start..] // either [start..end] or [start..]
p.next() p.next()
mut high := ast.empty_expr() mut high := ast.empty_expr
if p.tok.kind != .rsbr { if p.tok.kind != .rsbr {
has_high = true has_high = true
high = p.expr(0) high = p.expr(0)
@ -2977,7 +2977,7 @@ fn (mut p Parser) string_expr() ast.Expr {
if is_raw || is_cstr { if is_raw || is_cstr {
p.next() p.next()
} }
mut node := ast.empty_expr() mut node := ast.empty_expr
val := p.tok.lit val := p.tok.lit
mut pos := p.tok.pos() mut pos := p.tok.pos()
pos.last_line = pos.line_nr + val.count('\n') pos.last_line = pos.line_nr + val.count('\n')
@ -3090,7 +3090,7 @@ fn (mut p Parser) parse_number_literal() ast.Expr {
} }
lit := p.tok.lit lit := p.tok.lit
full_lit := if is_neg { '-' + lit } else { lit } full_lit := if is_neg { '-' + lit } else { lit }
mut node := ast.empty_expr() mut node := ast.empty_expr
if lit.index_any('.eE') >= 0 && lit[..2] !in ['0x', '0X', '0o', '0O', '0b', '0B'] { if lit.index_any('.eE') >= 0 && lit[..2] !in ['0x', '0X', '0o', '0O', '0b', '0B'] {
node = ast.FloatLiteral{ node = ast.FloatLiteral{
val: full_lit val: full_lit
@ -3498,7 +3498,7 @@ fn (mut p Parser) global_decl() ast.GlobalDecl {
pos := p.tok.pos() pos := p.tok.pos()
name := p.check_name() name := p.check_name()
has_expr := p.tok.kind == .assign has_expr := p.tok.kind == .assign
mut expr := ast.empty_expr() mut expr := ast.empty_expr
mut typ := ast.void_type mut typ := ast.void_type
mut typ_pos := token.Pos{} mut typ_pos := token.Pos{}
if has_expr { if has_expr {
@ -3596,7 +3596,7 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
pos := p.tok.pos() pos := p.tok.pos()
val := p.check_name() val := p.check_name()
vals << val vals << val
mut expr := ast.empty_expr() mut expr := ast.empty_expr
mut has_expr := false mut has_expr := false
// p.warn('enum val $val') // p.warn('enum val $val')
if p.tok.kind == .assign { if p.tok.kind == .assign {

View File

@ -24,7 +24,7 @@ fn (mut p Parser) sql_expr() ast.Expr {
} }
table_pos := p.tok.pos() table_pos := p.tok.pos()
table_type := p.parse_type() // `User` table_type := p.parse_type() // `User`
mut where_expr := ast.empty_expr() mut where_expr := ast.empty_expr
has_where := p.tok.kind == .name && p.tok.lit == 'where' has_where := p.tok.kind == .name && p.tok.lit == 'where'
mut query_one := false // one object is returned, not an array mut query_one := false // one object is returned, not an array
if has_where { if has_where {
@ -47,11 +47,11 @@ fn (mut p Parser) sql_expr() ast.Expr {
} }
} }
mut has_limit := false mut has_limit := false
mut limit_expr := ast.empty_expr() mut limit_expr := ast.empty_expr
mut has_offset := false mut has_offset := false
mut offset_expr := ast.empty_expr() mut offset_expr := ast.empty_expr
mut has_order := false mut has_order := false
mut order_expr := ast.empty_expr() mut order_expr := ast.empty_expr
mut has_desc := false mut has_desc := false
if p.tok.kind == .name && p.tok.lit == 'order' { if p.tok.kind == .name && p.tok.lit == 'order' {
p.check_name() // `order` p.check_name() // `order`
@ -232,7 +232,7 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine {
} }
mut table_pos := p.tok.pos() mut table_pos := p.tok.pos()
mut where_expr := ast.empty_expr() mut where_expr := ast.empty_expr
if kind == .insert { if kind == .insert {
table_pos = p.tok.pos() table_pos = p.tok.pos()
table_type = p.parse_type() table_type = p.parse_type()

View File

@ -267,7 +267,7 @@ fn (mut p Parser) struct_decl(is_anon bool) ast.StructDecl {
} }
} }
} }
mut default_expr := ast.empty_expr() mut default_expr := ast.empty_expr
mut has_default_expr := false mut has_default_expr := false
if !is_embed { if !is_embed {
if p.tok.kind == .assign { if p.tok.kind == .assign {
@ -402,12 +402,12 @@ fn (mut p Parser) struct_init(typ_str string, kind ast.StructInitKind) ast.Struc
no_keys := p.peek_tok.kind != .colon && p.tok.kind != .rcbr && p.tok.kind != .ellipsis // `Vec{a,b,c} no_keys := p.peek_tok.kind != .colon && p.tok.kind != .rcbr && p.tok.kind != .ellipsis // `Vec{a,b,c}
saved_is_amp := p.is_amp saved_is_amp := p.is_amp
p.is_amp = false p.is_amp = false
mut update_expr := ast.empty_expr() mut update_expr := ast.empty_expr
mut update_expr_comments := []ast.Comment{} mut update_expr_comments := []ast.Comment{}
mut has_update_expr := false mut has_update_expr := false
for p.tok.kind !in [.rcbr, .rpar, .eof] { for p.tok.kind !in [.rcbr, .rpar, .eof] {
mut field_name := '' mut field_name := ''
mut expr := ast.empty_expr() mut expr := ast.empty_expr
mut field_pos := token.Pos{} mut field_pos := token.Pos{}
mut first_field_pos := token.Pos{} mut first_field_pos := token.Pos{}
mut comments := []ast.Comment{} mut comments := []ast.Comment{}

View File

@ -374,7 +374,7 @@ pub fn (mut t Transformer) expr_stmt_if_expr(mut node ast.IfExpr) ast.Expr {
/* /*
FIXME: optimization causes cgen error `g.expr(): unhandled EmptyExpr` FIXME: optimization causes cgen error `g.expr(): unhandled EmptyExpr`
if original.branches.len == 0 { // no remain branches to walk through if original.branches.len == 0 { // no remain branches to walk through
return ast.EmptyExpr{} return ast.empty_expr
}*/ }*/
if node.branches.len == 1 && node.branches[0].cond.type_name() == 'unknown v.ast.Expr' { if node.branches.len == 1 && node.branches[0].cond.type_name() == 'unknown v.ast.Expr' {
node.branches[0].cond = ast.BoolLiteral{ node.branches[0].cond = ast.BoolLiteral{
@ -484,7 +484,7 @@ pub fn (mut t Transformer) for_stmt(mut node ast.ForStmt) ast.Stmt {
match node.cond { match node.cond {
ast.BoolLiteral { ast.BoolLiteral {
if !(node.cond as ast.BoolLiteral).val { // for false { ... } should be eleminated if !(node.cond as ast.BoolLiteral).val { // for false { ... } should be eleminated
return ast.EmptyStmt{} return ast.empty_stmt
} }
} }
else { else {