vfmt: []xxx; mut args

pull/3866/head
Alexander Medvednikov 2020-02-27 21:00:33 +01:00
parent 4f0d505c65
commit d619944cf5
4 changed files with 46 additions and 24 deletions

View File

@ -153,6 +153,7 @@ mut:
name string name string
args []Expr args []Expr
is_c bool is_c bool
muts []bool
} }
pub struct MethodCallExpr { pub struct MethodCallExpr {
@ -162,6 +163,7 @@ pub:
expr Expr expr Expr
name string name string
args []Expr args []Expr
muts []bool
} }
pub struct Return { pub struct Return {

View File

@ -252,18 +252,25 @@ fn (f &Fmt) type_to_str(t table.Type) string {
fn (f mut Fmt) expr(node ast.Expr) { fn (f mut Fmt) expr(node ast.Expr) {
match node { match node {
ast.ArrayInit { ast.ArrayInit {
// type_sym := f.table.get_type_symbol(it.typ) // `x := []string`
f.write('[') if it.exprs.len == 0 && it.typ != 0 {
for i, expr in it.exprs { f.write(f.table.type_to_str(it.typ))
if i > 0 && it.exprs.len > 1 { }
f.wrap_long_line() // `[1,2,3]`
} else {
f.expr(expr) // type_sym := f.table.get_type_symbol(it.typ)
if i < it.exprs.len - 1 { f.write('[')
f.write(', ') for i, expr in it.exprs {
} if i > 0 && it.exprs.len > 1 {
f.wrap_long_line()
}
f.expr(expr)
if i < it.exprs.len - 1 {
f.write(', ')
}
}
f.write(']')
} }
f.write(']')
} }
ast.AssignExpr { ast.AssignExpr {
f.expr(it.left) f.expr(it.left)
@ -294,6 +301,9 @@ fn (f mut Fmt) expr(node ast.Expr) {
ast.CallExpr { ast.CallExpr {
f.write('${it.name}(') f.write('${it.name}(')
for i, expr in it.args { for i, expr in it.args {
if it.muts[i] {
f.write('mut ')
}
f.expr(expr) f.expr(expr)
if i != it.args.len - 1 { if i != it.args.len - 1 {
f.write(', ') f.write(', ')
@ -383,6 +393,9 @@ fn (f mut Fmt) expr(node ast.Expr) {
f.expr(it.expr) f.expr(it.expr)
f.write('.' + it.name + '(') f.write('.' + it.name + '(')
for i, arg in it.args { for i, arg in it.args {
if it.muts[i] {
f.write('mut ')
}
if i > 0 { if i > 0 {
f.wrap_long_line() f.wrap_long_line()
} }

View File

@ -13,12 +13,13 @@ pub fn (p mut Parser) call_expr(is_c bool, mod string) ast.CallExpr {
name := p.check_name() name := p.check_name()
fn_name := if mod.len > 0 { '${mod}.$name' } else { name } fn_name := if mod.len > 0 { '${mod}.$name' } else { name }
p.check(.lpar) p.check(.lpar)
args := p.call_args() args, muts := p.call_args()
node := ast.CallExpr{ node := ast.CallExpr{
name: fn_name name: fn_name
args: args args: args
muts: muts
// tok: tok // tok: tok
pos: tok.position() pos: tok.position()
is_c: is_c is_c: is_c
} }
@ -29,11 +30,16 @@ pub fn (p mut Parser) call_expr(is_c bool, mod string) ast.CallExpr {
return node return node
} }
pub fn (p mut Parser) call_args() []ast.Expr { pub fn (p mut Parser) call_args() ([]ast.Expr, []bool) {
mut args := []ast.Expr mut args := []ast.Expr
mut muts := []bool
for p.tok.kind != .rpar { for p.tok.kind != .rpar {
if p.tok.kind == .key_mut { if p.tok.kind == .key_mut {
p.check(.key_mut) p.check(.key_mut)
muts << true
}
else {
muts << false
} }
e,_ := p.expr(0) e,_ := p.expr(0)
args << e args << e
@ -42,7 +48,7 @@ pub fn (p mut Parser) call_args() []ast.Expr {
} }
} }
p.check(.rpar) p.check(.rpar)
return args // ,table.void_ti return args, muts
} }
fn (p mut Parser) fn_decl() ast.FnDecl { fn (p mut Parser) fn_decl() ast.FnDecl {

View File

@ -57,7 +57,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt {
pref: &pref.Preferences{} pref: &pref.Preferences{}
scope: scope scope: scope
// scope: &ast.Scope{start_pos: 0, parent: 0} // scope: &ast.Scope{start_pos: 0, parent: 0}
} }
p.init_parse_fns() p.init_parse_fns()
p.read_first_token() p.read_first_token()
@ -333,7 +333,7 @@ pub fn (p mut Parser) stmt() ast.Stmt {
return ast.ExprStmt{ return ast.ExprStmt{
expr: expr expr: expr
// typ: typ // typ: typ
} }
} }
} }
@ -632,7 +632,7 @@ pub fn (p mut Parser) name_expr() ast.Expr {
p.expr_mod = '' p.expr_mod = ''
return ast.EnumVal{ return ast.EnumVal{
enum_name: enum_name // lp.prepend_mod(enum_name) enum_name: enum_name // lp.prepend_mod(enum_name)
val: val val: val
pos: p.tok.position() pos: p.tok.position()
} }
@ -894,7 +894,7 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
// Method call // Method call
if p.tok.kind == .lpar { if p.tok.kind == .lpar {
p.next() p.next()
args := p.call_args() args,muts := p.call_args()
if p.tok.kind == .key_orelse { if p.tok.kind == .key_orelse {
p.next() p.next()
p.parse_block() p.parse_block()
@ -903,6 +903,7 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
expr: left expr: left
name: field_name name: field_name
args: args args: args
muts:muts
pos: p.tok.position() pos: p.tok.position()
} }
mut node := ast.Expr{} mut node := ast.Expr{}
@ -1178,11 +1179,11 @@ fn (p mut Parser) if_expr() ast.Expr {
stmts: stmts stmts: stmts
else_stmts: else_stmts else_stmts: else_stmts
// typ: typ // typ: typ
pos: pos pos: pos
has_else: has_else has_else: has_else
// left: left // left: left
} }
return node return node
} }
@ -1603,10 +1604,10 @@ fn (p mut Parser) var_decl() ast.VarDecl {
node := ast.VarDecl{ node := ast.VarDecl{
name: name name: name
expr: expr // p.expr(token.lowest_prec) expr: expr // p.expr(token.lowest_prec)
is_mut: is_mut is_mut: is_mut
// typ: typ // typ: typ
pos: p.tok.position() pos: p.tok.position()
} }
p.scope.register_var(node) p.scope.register_var(node)
@ -1725,7 +1726,7 @@ fn (p mut Parser) match_expr() ast.Expr {
blocks: blocks blocks: blocks
match_exprs: match_exprs match_exprs: match_exprs
// typ: typ // typ: typ
cond: cond cond: cond
} }
return node return node