parser: remove start_tmp() entirely

pull/2728/head
Alexander Medvednikov 2019-11-11 05:22:34 +03:00
parent 91896af877
commit b3143bb559
4 changed files with 22 additions and 32 deletions

View File

@ -105,25 +105,28 @@ fn (g mut CGen) save() {
g.out.close()
}
fn (g mut CGen) start_tmp() {
if g.is_tmp {
g.prev_tmps << g.tmp_line
// returns expression's type, and entire expression's string representation)
fn (p mut Parser) tmp_expr() (string, string) {
// former start_tmp()
if p.cgen.is_tmp {
p.cgen.prev_tmps << p.cgen.tmp_line
}
// kg.tmp_lines_pos++
g.tmp_line = ''
g.is_tmp = true
}
fn (g mut CGen) end_tmp() string {
res := g.tmp_line
if g.prev_tmps.len > 0 {
g.tmp_line = g.prev_tmps.last()
g.prev_tmps = g.prev_tmps[0..g.prev_tmps.len-1]
p.cgen.tmp_line = ''
p.cgen.is_tmp = true
//
typ := p.bool_expression()
res := p.cgen.tmp_line
if p.cgen.prev_tmps.len > 0 {
p.cgen.tmp_line = p.cgen.prev_tmps.last()
p.cgen.prev_tmps = p.cgen.prev_tmps[0..p.cgen.prev_tmps.len-1]
} else {
g.tmp_line = ''
g.is_tmp = false
p.cgen.tmp_line = ''
p.cgen.is_tmp = false
}
return res
return typ, res
}
fn (g &CGen) add_placeholder() int {

View File

@ -12,13 +12,10 @@ import (
fn (p mut Parser) match_statement(is_expr bool) string {
p.check(.key_match)
p.fspace()
p.cgen.start_tmp()
typ := p.bool_expression()
typ, expr := p.tmp_expr()
if typ.starts_with('array_') {
p.error('arrays cannot be compared')
}
expr := p.cgen.end_tmp()
// is it safe to use p.cgen.insert_before ???
tmp_var := p.get_tmp()
p.cgen.insert_before('$typ $tmp_var = $expr;')

View File

@ -2450,13 +2450,6 @@ fn (p mut Parser) get_tmp_counter() int {
return p.tmp_cnt
}
// returns expression's type, and entire expression's string representation)
fn (p mut Parser) tmp_expr() (string, string) {
p.cgen.start_tmp()
typ := p.bool_expression()
val := p.cgen.end_tmp()
return typ, val
}
fn (p mut Parser) if_st(is_expr bool, elif_depth int) string {
if is_expr {

View File

@ -90,21 +90,18 @@ fn (p mut Parser) select_query(fn_ph int) string {
// `where` statement
if p.tok == .name && p.lit == 'where' {
p.next()
p.cgen.start_tmp()
_, expr := p.tmp_expr()
p.is_sql = true
p.bool_expression()
p.is_sql = false
q += ' where ' + p.cgen.end_tmp()
q += ' where ' + expr
}
// limit?
mut query_one := false
if p.tok == .name && p.lit == 'limit' {
p.next()
p.cgen.start_tmp()
_, limit := p.tmp_expr()
p.is_sql = true
p.bool_expression()
p.is_sql = false
limit := p.cgen.end_tmp()
q += ' limit ' + limit
// `limit 1` means we are getting `?User`, not `[]User`
if limit.trim_space() == '1' {