41 lines
		
	
	
		
			829 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			829 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)
 | 
						|
	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.gen(' ==')
 | 
						|
			}	
 | 
						|
		}	
 | 
						|
		p.check_types(p.bool_expression(), typ)
 | 
						|
		if is_str {
 | 
						|
			p.gen(')')
 | 
						|
		}	
 | 
						|
		if p.tok != .rsbr {
 | 
						|
			p.check(.comma)
 | 
						|
		}
 | 
						|
		i++
 | 
						|
	}	
 | 
						|
	p.check(.rsbr)
 | 
						|
}
 |