quick fix for compound assignment operators
a better fix would be to change lot of things inside parserpull/1049/head
parent
218a46611e
commit
663cbadf60
|
@ -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()
|
||||||
|
|
|
@ -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] == `/` {
|
||||||
|
|
Loading…
Reference in New Issue