diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index 48c20f51b1..c4f1fc591d 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -67,7 +67,7 @@ fn (f mut Fmt) find_comment(line_nr int) { } } */ -pub fn (f mut Fmt) write(s string) { +pub fn (var f Fmt) write(s string) { if f.indent > 0 && f.empty_line { f.out.write(tabs[f.indent]) f.line_len += f.indent * 4 @@ -77,7 +77,7 @@ pub fn (f mut Fmt) write(s string) { f.empty_line = false } -pub fn (f mut Fmt) writeln(s string) { +pub fn (var f Fmt) writeln(s string) { if f.indent > 0 && f.empty_line { // println(f.indent.str() + s) f.out.write(tabs[f.indent]) @@ -87,7 +87,7 @@ pub fn (f mut Fmt) writeln(s string) { f.line_len = 0 } -fn (f mut Fmt) mod(mod ast.Module) { +fn (var f Fmt) mod(mod ast.Module) { f.cur_mod = mod.name if mod.is_skipped { return @@ -95,7 +95,7 @@ fn (f mut Fmt) mod(mod ast.Module) { f.writeln('module $mod.name\n') } -fn (f mut Fmt) imports(imports []ast.Import) { +fn (var f Fmt) imports(imports []ast.Import) { if f.did_imports || imports.len == 0 { return } @@ -129,7 +129,7 @@ fn (f Fmt) imp_stmt_str(imp ast.Import) string { return '${imp.mod}${imp_alias_suffix}' } -fn (f mut Fmt) stmts(stmts []ast.Stmt) { +fn (var f Fmt) stmts(stmts []ast.Stmt) { f.indent++ for stmt in stmts { f.stmt(stmt) @@ -137,7 +137,7 @@ fn (f mut Fmt) stmts(stmts []ast.Stmt) { f.indent-- } -fn (f mut Fmt) stmt(node ast.Stmt) { +fn (var f Fmt) stmt(node ast.Stmt) { match node { ast.AssignStmt { for i, ident in it.left { @@ -178,12 +178,8 @@ fn (f mut Fmt) stmt(node ast.Stmt) { } ast.BranchStmt { match it.tok.kind { - .key_break { - f.writeln('break') - } - .key_continue { - f.writeln('continue') - } + .key_break { f.writeln('break') } + .key_continue { f.writeln('continue') } else {} } } @@ -379,7 +375,7 @@ fn (f mut Fmt) stmt(node ast.Stmt) { } } -fn (f mut Fmt) type_decl(node ast.TypeDecl) { +fn (var f Fmt) type_decl(node ast.TypeDecl) { match node { ast.AliasTypeDecl { if it.is_pub { @@ -406,7 +402,7 @@ fn (f mut Fmt) type_decl(node ast.TypeDecl) { f.writeln('\n') } -fn (f mut Fmt) struct_decl(node ast.StructDecl) { +fn (var f Fmt) struct_decl(node ast.StructDecl) { if node.is_pub { f.write('pub ') } @@ -453,17 +449,17 @@ fn (f mut Fmt) struct_decl(node ast.StructDecl) { } fn (f &Fmt) type_to_str(t table.Type) string { - mut res := f.table.type_to_str(t) + var res := f.table.type_to_str(t) // type_ptr => &type if res.ends_with('_ptr') { - res = res[0 .. res.len-4] + res = res[0..res.len - 4] start_pos := 2 * res.count('[]') - res = res[0 .. start_pos] + '&' + res[start_pos .. res.len] + res = res[0..start_pos] + '&' + res[start_pos..res.len] } return res.replace(f.cur_mod + '.', '') } -fn (f mut Fmt) expr(node ast.Expr) { +fn (var f Fmt) expr(node ast.Expr) { match node { ast.ArrayInit { if it.exprs.len == 0 && it.typ != 0 && it.typ != table.void_type { @@ -582,46 +578,7 @@ fn (f mut Fmt) expr(node ast.Expr) { f.write('}') } ast.MatchExpr { - f.write('match ') - if it.is_mut { - f.write('var ') - } - f.expr(it.cond) - f.writeln(' {') - f.indent++ - for i, branch in it.branches { - if branch.comment.text != '' { - f.comment(branch.comment) - } - if !branch.is_else { - // normal branch - for j, expr in branch.exprs { - f.expr(expr) - if j < branch.exprs.len - 1 { - f.write(', ') - } - } - } else { - // else branch - f.write('else') - } - if branch.stmts.len == 0 { - f.writeln(' {}') - } else { - // TODO single line branches - // if branch.stmts.len < 2 { - // f.write(' { ') - // } else { - f.writeln(' {') - // f.single_line_if = true - // } - f.stmts(branch.stmts) - // f.single_line_if = false - f.writeln('}') - } - } - f.indent-- - f.write('}') + f.match_expr(it) } ast.None { f.write('none') @@ -737,7 +694,7 @@ fn (f mut Fmt) expr(node ast.Expr) { } } -fn (f mut Fmt) wrap_long_line() { +fn (var f Fmt) wrap_long_line() { if f.line_len > max_len { if f.out.buf[f.out.buf.len - 1] == ` ` { f.out.go_back(1) @@ -747,7 +704,7 @@ fn (f mut Fmt) wrap_long_line() { } } -fn (f mut Fmt) call_args(args []ast.CallArg) { +fn (var f Fmt) call_args(args []ast.CallArg) { for i, arg in args { if arg.is_mut { f.write('mut ') @@ -762,7 +719,7 @@ fn (f mut Fmt) call_args(args []ast.CallArg) { } } -fn (f mut Fmt) or_expr(or_block ast.OrExpr) { +fn (var f Fmt) or_expr(or_block ast.OrExpr) { if or_block.stmts.len > 0 { f.writeln(' or {') f.stmts(or_block.stmts) @@ -770,7 +727,7 @@ fn (f mut Fmt) or_expr(or_block ast.OrExpr) { } } -fn (f mut Fmt) comment(node ast.Comment) { +fn (var f Fmt) comment(node ast.Comment) { if !node.text.contains('\n') { is_separate_line := node.text.starts_with('|') var s := if is_separate_line { node.text[1..] } else { node.text } @@ -806,7 +763,7 @@ fn short_module(name string) string { return vals[vals.len - 2] + '.' + vals[vals.len - 1] } -fn (f mut Fmt) if_expr(it ast.IfExpr) { +fn (var f Fmt) if_expr(it ast.IfExpr) { single_line := it.branches.len == 2 && it.has_else && it.branches[0].stmts.len == 1 && it.branches[1].stmts.len == 1 && (it.is_expr || f.is_assign) f.single_line_if = single_line @@ -839,7 +796,7 @@ fn (f mut Fmt) if_expr(it ast.IfExpr) { f.single_line_if = false } -fn (f mut Fmt) call_expr(node ast.CallExpr) { +fn (var f Fmt) call_expr(node ast.CallExpr) { if node.is_method { match node.left { ast.Ident { @@ -876,13 +833,77 @@ fn (f mut Fmt) call_expr(node ast.CallExpr) { } } -fn (f mut Fmt) mark_types_module_as_used(typ table.Type) { +fn (var f Fmt) match_expr(it ast.MatchExpr) { + f.write('match ') + if it.is_mut { + f.write('var ') + } + f.expr(it.cond) + f.writeln(' {') + f.indent++ + var single_line := true + for i, branch in it.branches { + if branch.stmts.len > 1 { + single_line = false + break + } + } + for i, branch in it.branches { + if branch.comment.text != '' { + f.comment(branch.comment) + } + if !branch.is_else { + // normal branch + for j, expr in branch.exprs { + f.expr(expr) + if j < branch.exprs.len - 1 { + f.write(', ') + } + } + } else { + // else branch + f.write('else') + } + if branch.stmts.len == 0 { + f.writeln(' {}') + } else { + if single_line { + f.write(' { ') + } else { + f.writeln(' {') + } + f.stmts(branch.stmts) + if single_line { + f.remove_new_line() + f.writeln(' }') + } else { + f.writeln('}') + } + } + } + f.indent-- + f.write('}') +} + +fn (var f Fmt) remove_new_line() { + var i := 0 + for i = f.out.len - 1; i >= 0; i-- { + if !f.out.buf[i].is_space() { // != `\n` { + break + } + } + f.out.go_back(f.out.len - i - 1) + f.empty_line = false + // f.writeln('sdf') +} + +fn (var f Fmt) mark_types_module_as_used(typ table.Type) { sym := f.table.get_type_symbol(typ) f.mark_module_as_used(sym.name) } // `name` is a function (`foo.bar()`) or type (`foo.Bar{}`) -fn (f mut Fmt) mark_module_as_used(name string) { +fn (var f Fmt) mark_module_as_used(name string) { if !name.contains('.') { return } diff --git a/vlib/v/fmt/tests/match_expected.vv b/vlib/v/fmt/tests/match_expected.vv index b7b1ebe1bf..9a842cc274 100644 --- a/vlib/v/fmt/tests/match_expected.vv +++ b/vlib/v/fmt/tests/match_expected.vv @@ -1,12 +1,8 @@ fn match_expr() { a := 10 match a { - 10 { - println('10') - } - 20 { - println('20') - } + 10 { println('10') } + 20 { println('20') } else {} } } @@ -14,14 +10,8 @@ fn match_expr() { fn match_expr_assignment() { a := 20 b := match a { - 10 { - 10 - } - 5 { - 5 - } - else { - 2 - } + 10 { 10 } + 5 { 5 } + else { 2 } } } diff --git a/vlib/v/tests/match_test.v b/vlib/v/tests/match_test.v index d71797e140..370ed20caa 100644 --- a/vlib/v/tests/match_test.v +++ b/vlib/v/tests/match_test.v @@ -9,59 +9,35 @@ pub fn (c Color) str() string { } fn test_match_integers() { - mut a := 3 - mut b := 0 + var a := 3 + var b := 0 match a { - 2 { - println('two') - } + 2 { println('two') } 3 { println('three') b = 3 } - 4 { - println('four') - } - else { - println('???') - } + 4 { println('four') } + else { println('???') } } assert b == 3 assert match 2 { - 1 { - 2 - } - 2 { - 3 - } - else { - 5 - } + 1 { 2 } + 2 { 3 } + else { 5 } } == 3 assert match 0 { - 1 { - 2 - } - 2 { - 3 - } - else { - 5 - } + 1 { 2 } + 2 { 3 } + else { 5 } } == 5 assert match 1 { - else { - 5 - } + else { 5 } } == 5 a = 0 match 2 { - 0 { - a = 1 - } - 1 { - a = 2 - } + 0 { a = 1 } + 1 { a = 2 } else { a = 3 println('a is $a') @@ -70,9 +46,7 @@ fn test_match_integers() { assert a == 3 a = 0 match 1 { - 0 { - a = 1 - } + 0 { a = 1 } 1 { a = 2 a = a + 2 @@ -83,22 +57,16 @@ fn test_match_integers() { assert a == 6 a = 0 match 1 { - else { - a = -2 - } + else { a = -2 } } assert a == -2 } fn test_match_enums() { - mut b := Color.red + var b := Color.red match b { - .red { - b = .green - } - .green { - b = .blue - } + .red { b = .green } + .green { b = .blue } else { println('b is ${b.str()}') b = .red @@ -106,9 +74,7 @@ fn test_match_enums() { } assert b == .green match b { - .red { - b = .green - } + .red { b = .green } else { println('b is ${b.str()}') b = .blue