49 lines
958 B
V
49 lines
958 B
V
module compiler
|
|
// `a in [1,2,3]` => `a == 1 || a == 2 || a == 3`
|
|
// avoid allocation
|
|
// `typ` is the type of `a`
|
|
// `ph` is for string_eq()
|
|
fn (p mut Parser) in_optimization(typ string, ph int) {
|
|
p.check(.lsbr)
|
|
if p.tok == .rsbr {
|
|
p.error('`x in []` is always false')
|
|
}
|
|
mut i := 0
|
|
// Get `a` expr value (can be a string literal, not a variable)
|
|
expr := p.cgen.cur_line[ph..]
|
|
is_str := typ == 'string'
|
|
// println('!! $p.expr_var.name => $name ($typ)')
|
|
for p.tok != .rsbr && p.tok != .eof {
|
|
if i > 0 {
|
|
if is_str {
|
|
p.gen(' || string_eq($expr, ')
|
|
}
|
|
else {
|
|
p.gen(' || $expr == ')
|
|
}
|
|
}
|
|
if i == 0 {
|
|
if is_str {
|
|
p.cgen.set_placeholder(ph, ' (string_eq(')
|
|
p.gen(', ')
|
|
}
|
|
else {
|
|
p.cgen.set_placeholder(ph, ' (')
|
|
p.gen(' ==')
|
|
}
|
|
}
|
|
p.check_types(p.bool_expression(), typ)
|
|
if is_str {
|
|
p.gen(')')
|
|
}
|
|
if p.tok != .rsbr {
|
|
p.check(.comma)
|
|
p.fspace()
|
|
}
|
|
i++
|
|
}
|
|
p.gen(')')
|
|
p.check(.rsbr)
|
|
}
|
|
|