quick fix for compound assignment operators

a better fix would be to change lot of things inside parser
pull/1049/head
Henrixounez 2019-06-25 15:26:26 +02:00 committed by Alex Medvednikov
parent 218a46611e
commit 663cbadf60
2 changed files with 29 additions and 2 deletions

View File

@ -1018,10 +1018,15 @@ fn (p mut Parser) assign_statement(v Var, ph int, is_map bool) {
if is_str { if is_str {
p.gen('= string_add($v.name, ')// TODO can't do `foo.bar += '!'` p.gen('= string_add($v.name, ')// TODO can't do `foo.bar += '!'`
} }
else { else if !is_map {
p.gen(' += ') p.gen(' += ')
} }
default: p.gen(' ' + p.tok.str() + ' ') default:
if tok != MINUS_ASSIGN && tok != MULT_ASSIGN && tok != XOR_ASSIGN
&& tok != MOD_ASSIGN && tok != AND_ASSIGN && tok != OR_ASSIGN
&& tok != RIGHT_SHIFT_ASSIGN && tok != LEFT_SHIFT_ASSIGN && tok != DIV_ASSIGN {
p.gen(' ' + p.tok.str() + ' ')
}
} }
p.fgen(' ' + p.tok.str() + ' ') p.fgen(' ' + p.tok.str() + ' ')
p.next() p.next()

View File

@ -125,6 +125,18 @@ fn (s mut Scanner) skip_whitespace() {
// } // }
} }
fn (s mut Scanner) get_until_start(pos int) string {
mut pos_start = pos
for ; pos_start >= 0 && s.text[pos_start] != `\n`; pos_start-- {}
for ; pos_start < pos && (s.text[pos_start] == ` ` || s.text[pos_start] == `\n`); pos_start++ {}
return s.text.substr(pos_start, pos)
}
// CAO stands for Compound Assignment Operators (e.g '+=' )
fn (s mut Scanner) cao_change(operator string) {
s.text = s.text.substr(0, s.pos - 2) + ' = ' + s.get_until_start(s.pos - 2) + ' ' + operator + s.text.substr(s.pos + 1, s.text.len)
}
fn (s mut Scanner) scan() ScanRes { fn (s mut Scanner) scan() ScanRes {
// if s.file_path == 'd.v' { // if s.file_path == 'd.v' {
// println('\nscan()') // println('\nscan()')
@ -213,6 +225,7 @@ fn (s mut Scanner) scan() ScanRes {
} }
else if nextc == `=` { else if nextc == `=` {
s.pos++ s.pos++
s.cao_change('+')
return scan_res(PLUS_ASSIGN, '') return scan_res(PLUS_ASSIGN, '')
} }
return scan_res(PLUS, '') return scan_res(PLUS, '')
@ -223,24 +236,28 @@ fn (s mut Scanner) scan() ScanRes {
} }
else if nextc == `=` { else if nextc == `=` {
s.pos++ s.pos++
s.cao_change('-')
return scan_res(MINUS_ASSIGN, '') return scan_res(MINUS_ASSIGN, '')
} }
return scan_res(MINUS, '') return scan_res(MINUS, '')
case `*`: case `*`:
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('*')
return scan_res(MULT_ASSIGN, '') return scan_res(MULT_ASSIGN, '')
} }
return scan_res(MUL, '') return scan_res(MUL, '')
case `^`: case `^`:
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('^')
return scan_res(XOR_ASSIGN, '') return scan_res(XOR_ASSIGN, '')
} }
return scan_res(XOR, '') return scan_res(XOR, '')
case `%`: case `%`:
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('%')
return scan_res(MOD_ASSIGN, '') return scan_res(MOD_ASSIGN, '')
} }
return scan_res(MOD, '') return scan_res(MOD, '')
@ -287,6 +304,7 @@ fn (s mut Scanner) scan() ScanRes {
case `&`: case `&`:
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('&')
return scan_res(AND_ASSIGN, '') return scan_res(AND_ASSIGN, '')
} }
if s.text[s.pos + 1] == `&` { if s.text[s.pos + 1] == `&` {
@ -301,6 +319,7 @@ fn (s mut Scanner) scan() ScanRes {
} }
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('|')
return scan_res(OR_ASSIGN, '') return scan_res(OR_ASSIGN, '')
} }
return scan_res(PIPE, '') return scan_res(PIPE, '')
@ -347,6 +366,7 @@ fn (s mut Scanner) scan() ScanRes {
else if s.text[s.pos + 1] == `>` { else if s.text[s.pos + 1] == `>` {
if s.text[s.pos + 2] == `=` { if s.text[s.pos + 2] == `=` {
s.pos += 2 s.pos += 2
s.cao_change('>>')
return scan_res(RIGHT_SHIFT_ASSIGN, '') return scan_res(RIGHT_SHIFT_ASSIGN, '')
} }
s.pos++ s.pos++
@ -363,6 +383,7 @@ fn (s mut Scanner) scan() ScanRes {
else if s.text[s.pos + 1] == `<` { else if s.text[s.pos + 1] == `<` {
if s.text[s.pos + 2] == `=` { if s.text[s.pos + 2] == `=` {
s.pos += 2 s.pos += 2
s.cao_change('<<')
return scan_res(LEFT_SHIFT_ASSIGN, '') return scan_res(LEFT_SHIFT_ASSIGN, '')
} }
s.pos++ s.pos++
@ -402,6 +423,7 @@ fn (s mut Scanner) scan() ScanRes {
case `/`: case `/`:
if nextc == `=` { if nextc == `=` {
s.pos++ s.pos++
s.cao_change('/')
return scan_res(DIV_ASSIGN, '') return scan_res(DIV_ASSIGN, '')
} }
if s.text[s.pos + 1] == `/` { if s.text[s.pos + 1] == `/` {