fmt: use the new match syntax
							parent
							
								
									3b6e66db0d
								
							
						
					
					
						commit
						d4b17fb0c3
					
				
							
								
								
									
										195
									
								
								vlib/v/fmt/fmt.v
								
								
								
								
							
							
						
						
									
										195
									
								
								vlib/v/fmt/fmt.v
								
								
								
								
							|  | @ -35,6 +35,7 @@ pub mut: | |||
| 	is_debug          bool | ||||
| 	mod2alias         map[string]string // for `import time as t`, will contain: 'time'=>'t'
 | ||||
| 	use_short_fn_args bool | ||||
| 	it_name           string // the name to replace `it` with
 | ||||
| } | ||||
| 
 | ||||
| pub fn fmt(file ast.File, table &table.Table, is_debug bool) string { | ||||
|  | @ -143,8 +144,8 @@ pub fn (mut f Fmt) imports(imports []ast.Import) { | |||
| 
 | ||||
| pub fn (f Fmt) imp_stmt_str(imp ast.Import) string { | ||||
| 	is_diff := imp.alias != imp.mod && !imp.mod.ends_with('.' + imp.alias) | ||||
| 	imp_alias_suffix := if is_diff { ' as ${imp.alias}' } else { '' } | ||||
| 	return '${imp.mod}${imp_alias_suffix}' | ||||
| 	imp_alias_suffix := if is_diff { ' as $imp.alias' } else { '' } | ||||
| 	return '$imp.mod$imp_alias_suffix' | ||||
| } | ||||
| 
 | ||||
| pub fn (mut f Fmt) stmts(stmts []ast.Stmt) { | ||||
|  | @ -161,7 +162,7 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { | |||
| 	} | ||||
| 	match node { | ||||
| 		ast.AssignStmt { | ||||
| 			for i, left in it.left { | ||||
| 			for i, left in node.left { | ||||
| 				if left is ast.Ident { | ||||
| 					ident := left as ast.Ident | ||||
| 					var_info := ident.var_info() | ||||
|  | @ -169,19 +170,18 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { | |||
| 						f.write('mut ') | ||||
| 					} | ||||
| 					f.expr(left) | ||||
| 					if i < it.left.len - 1 { | ||||
| 					if i < node.left.len - 1 { | ||||
| 						f.write(', ') | ||||
| 					} | ||||
| 				} | ||||
| 				else { | ||||
| 				} else { | ||||
| 					f.expr(left) | ||||
| 				} | ||||
| 			} | ||||
| 			f.is_assign = true | ||||
| 			f.write(' $it.op.str() ') | ||||
| 			for i, val in it.right { | ||||
| 			f.write(' $node.op.str() ') | ||||
| 			for i, val in node.right { | ||||
| 				f.expr(val) | ||||
| 				if i < it.right.len - 1 { | ||||
| 				if i < node.right.len - 1 { | ||||
| 					f.write(', ') | ||||
| 				} | ||||
| 			} | ||||
|  | @ -192,19 +192,19 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { | |||
| 		} | ||||
| 		ast.AssertStmt { | ||||
| 			f.write('assert ') | ||||
| 			f.expr(it.expr) | ||||
| 			f.expr(node.expr) | ||||
| 			f.writeln('') | ||||
| 		} | ||||
| 		ast.Attr { | ||||
| 			f.writeln('[$it.name]') | ||||
| 			f.writeln('[$node.name]') | ||||
| 		} | ||||
| 		ast.Block { | ||||
| 			f.writeln('{') | ||||
| 			f.stmts(it.stmts) | ||||
| 			f.stmts(node.stmts) | ||||
| 			f.writeln('}') | ||||
| 		} | ||||
| 		ast.BranchStmt { | ||||
| 			match it.tok.kind { | ||||
| 			match node.tok.kind { | ||||
| 				.key_break { f.writeln('break') } | ||||
| 				.key_continue { f.writeln('continue') } | ||||
| 				else {} | ||||
|  | @ -216,7 +216,7 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { | |||
| 		ast.CompIf { | ||||
| 			inversion := if it.is_not { '!' } else { '' } | ||||
| 			is_opt := if it.is_opt { ' ?' } else { '' } | ||||
| 			f.writeln('\$if ${inversion}${it.val}${is_opt} {') | ||||
| 			f.writeln('\$if $inversion$it.val$is_opt {') | ||||
| 			f.stmts(it.stmts) | ||||
| 			if it.has_else { | ||||
| 				f.writeln('} \$else {') | ||||
|  | @ -378,20 +378,20 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { | |||
| pub fn (mut f Fmt) type_decl(node ast.TypeDecl) { | ||||
| 	match node { | ||||
| 		ast.AliasTypeDecl { | ||||
| 			if it.is_pub { | ||||
| 			if node.is_pub { | ||||
| 				f.write('pub ') | ||||
| 			} | ||||
| 			ptype := f.type_to_str(it.parent_type) | ||||
| 			f.write('type $it.name $ptype') | ||||
| 			ptype := f.type_to_str(node.parent_type) | ||||
| 			f.write('type $node.name $ptype') | ||||
| 		} | ||||
| 		ast.FnTypeDecl { | ||||
| 			if it.is_pub { | ||||
| 			if node.is_pub { | ||||
| 				f.write('pub ') | ||||
| 			} | ||||
| 			typ_sym := f.table.get_type_symbol(it.typ) | ||||
| 			typ_sym := f.table.get_type_symbol(node.typ) | ||||
| 			fn_typ_info := typ_sym.info as table.FnType | ||||
| 			fn_info := fn_typ_info.func | ||||
| 			fn_name := it.name.replace(f.cur_mod + '.', '') | ||||
| 			fn_name := node.name.replace(f.cur_mod + '.', '') | ||||
| 			f.write('type $fn_name = fn (') | ||||
| 			for i, arg in fn_info.args { | ||||
| 				f.write(arg.name) | ||||
|  | @ -424,12 +424,12 @@ pub fn (mut f Fmt) type_decl(node ast.TypeDecl) { | |||
| 			} | ||||
| 		} | ||||
| 		ast.SumTypeDecl { | ||||
| 			if it.is_pub { | ||||
| 			if node.is_pub { | ||||
| 				f.write('pub ') | ||||
| 			} | ||||
| 			f.write('type $it.name = ') | ||||
| 			f.write('type $node.name = ') | ||||
| 			mut sum_type_names := []string{} | ||||
| 			for t in it.sub_types { | ||||
| 			for t in node.sub_types { | ||||
| 				sum_type_names << f.type_to_str(t) | ||||
| 			} | ||||
| 			sum_type_names.sort() | ||||
|  | @ -536,54 +536,54 @@ fn (f &Fmt) type_to_str(t table.Type) string { | |||
| 
 | ||||
| pub fn (mut f Fmt) expr(node ast.Expr) { | ||||
| 	if f.is_debug { | ||||
| 		eprintln('expr: ${node.position():-42} | node: ${typeof(node):-20} | ${node.str()}') | ||||
| 		eprintln('expr: ${node.position():-42} | node: ${typeof(node):-20} | $node.str()') | ||||
| 	} | ||||
| 	match node { | ||||
| 		ast.AnonFn { | ||||
| 			f.fn_decl(it.decl) | ||||
| 			f.fn_decl(node.decl) | ||||
| 		} | ||||
| 		ast.ArrayInit { | ||||
| 			f.array_init(it) | ||||
| 			f.array_init(node) | ||||
| 		} | ||||
| 		ast.AsCast { | ||||
| 			type_str := f.type_to_str(it.typ) | ||||
| 			f.expr(it.expr) | ||||
| 			type_str := f.type_to_str(node.typ) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(' as $type_str') | ||||
| 		} | ||||
| 		ast.Assoc { | ||||
| 			f.writeln('{') | ||||
| 			// f.indent++
 | ||||
| 			f.writeln('\t$it.var_name |') | ||||
| 			f.writeln('\t$node.var_name |') | ||||
| 			// TODO StructInit copy pasta
 | ||||
| 			for i, field in it.fields { | ||||
| 			for i, field in node.fields { | ||||
| 				f.write('\t$field: ') | ||||
| 				f.expr(it.exprs[i]) | ||||
| 				f.expr(node.exprs[i]) | ||||
| 				f.writeln('') | ||||
| 			} | ||||
| 			// f.indent--
 | ||||
| 			f.write('}') | ||||
| 		} | ||||
| 		ast.BoolLiteral { | ||||
| 			f.write(it.val.str()) | ||||
| 			f.write(node.val.str()) | ||||
| 		} | ||||
| 		ast.CastExpr { | ||||
| 			f.write(f.type_to_str(it.typ) + '(') | ||||
| 			f.expr(it.expr) | ||||
| 			f.write(f.type_to_str(node.typ) + '(') | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(')') | ||||
| 		} | ||||
| 		ast.CallExpr { | ||||
| 			f.call_expr(it) | ||||
| 			f.call_expr(node) | ||||
| 		} | ||||
| 		ast.CharLiteral { | ||||
| 			f.write('`$it.val`') | ||||
| 			f.write('`$node.val`') | ||||
| 		} | ||||
| 		ast.ComptimeCall { | ||||
| 			if it.is_vweb { | ||||
| 			if node.is_vweb { | ||||
| 				f.write('$' + 'vweb.html()') | ||||
| 			} | ||||
| 		} | ||||
| 		ast.ConcatExpr { | ||||
| 			for i, val in it.vals { | ||||
| 			for i, val in node.vals { | ||||
| 				if i != 0 { | ||||
| 					f.write(' + ') | ||||
| 				} | ||||
|  | @ -591,21 +591,26 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 			} | ||||
| 		} | ||||
| 		ast.EnumVal { | ||||
| 			name := f.short_module(it.enum_name) | ||||
| 			f.write(name + '.' + it.val) | ||||
| 			name := f.short_module(node.enum_name) | ||||
| 			f.write(name + '.' + node.val) | ||||
| 		} | ||||
| 		ast.FloatLiteral { | ||||
| 			f.write(it.val) | ||||
| 			f.write(node.val) | ||||
| 		} | ||||
| 		ast.IfExpr { | ||||
| 			f.if_expr(it) | ||||
| 			f.if_expr(node) | ||||
| 		} | ||||
| 		ast.Ident { | ||||
| 			f.write_language_prefix(it.language) | ||||
| 			if it.kind == .blank_ident { | ||||
| 			f.write_language_prefix(node.language) | ||||
| 			if true { | ||||
| 			} else { | ||||
| 			} | ||||
| 			if node.name == 'it' && f.it_name != '' { | ||||
| 				f.write(f.it_name) | ||||
| 			} else if node.kind == .blank_ident { | ||||
| 				f.write('_') | ||||
| 			} else { | ||||
| 				name := f.short_module(it.name) | ||||
| 				name := f.short_module(node.name) | ||||
| 				// f.write('<$it.name => $name>')
 | ||||
| 				f.write(name) | ||||
| 				if name.contains('.') { | ||||
|  | @ -614,34 +619,34 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 			} | ||||
| 		} | ||||
| 		ast.IfGuardExpr { | ||||
| 			f.write(it.var_name + ' := ') | ||||
| 			f.expr(it.expr) | ||||
| 			f.write(node.var_name + ' := ') | ||||
| 			f.expr(node.expr) | ||||
| 		} | ||||
| 		ast.InfixExpr { | ||||
| 			f.expr(it.left) | ||||
| 			f.expr(node.left) | ||||
| 			if f.is_inside_interp { | ||||
| 				f.write('$it.op.str()') | ||||
| 				f.write('$node.op.str()') | ||||
| 			} else { | ||||
| 				f.write(' $it.op.str() ') | ||||
| 				f.write(' $node.op.str() ') | ||||
| 				f.wrap_long_line() | ||||
| 			} | ||||
| 			f.expr(it.right) | ||||
| 			f.expr(node.right) | ||||
| 		} | ||||
| 		ast.IndexExpr { | ||||
| 			f.expr(it.left) | ||||
| 			f.expr(node.left) | ||||
| 			f.write('[') | ||||
| 			f.expr(it.index) | ||||
| 			f.expr(node.index) | ||||
| 			f.write(']') | ||||
| 		} | ||||
| 		ast.IntegerLiteral { | ||||
| 			f.write(it.val) | ||||
| 			f.write(node.val) | ||||
| 		} | ||||
| 		ast.MapInit { | ||||
| 			if it.keys.len == 0 { | ||||
| 				mut ktyp := it.key_type | ||||
| 				mut vtyp := it.value_type | ||||
| 			if node.keys.len == 0 { | ||||
| 				mut ktyp := node.key_type | ||||
| 				mut vtyp := node.value_type | ||||
| 				if vtyp == 0 { | ||||
| 					typ_sym := f.table.get_type_symbol(it.typ) | ||||
| 					typ_sym := f.table.get_type_symbol(node.typ) | ||||
| 					minfo := typ_sym.info as table.Map | ||||
| 					ktyp = minfo.key_type | ||||
| 					vtyp = minfo.value_type | ||||
|  | @ -655,18 +660,18 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 			} | ||||
| 			f.writeln('{') | ||||
| 			f.indent++ | ||||
| 			for i, key in it.keys { | ||||
| 			for i, key in node.keys { | ||||
| 				f.expr(key) | ||||
| 				// f.write(strings.repeat(` `, max - field.name.len))
 | ||||
| 				f.write(': ') | ||||
| 				f.expr(it.vals[i]) | ||||
| 				f.expr(node.vals[i]) | ||||
| 				f.writeln('') | ||||
| 			} | ||||
| 			f.indent-- | ||||
| 			f.write('}') | ||||
| 		} | ||||
| 		ast.MatchExpr { | ||||
| 			f.match_expr(it) | ||||
| 			f.match_expr(node) | ||||
| 		} | ||||
| 		ast.None { | ||||
| 			f.write('none') | ||||
|  | @ -678,51 +683,51 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 		} | ||||
| 		ast.ParExpr { | ||||
| 			f.write('(') | ||||
| 			f.expr(it.expr) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(')') | ||||
| 		} | ||||
| 		ast.PostfixExpr { | ||||
| 			f.expr(it.expr) | ||||
| 			f.write(it.op.str()) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(node.op.str()) | ||||
| 		} | ||||
| 		ast.PrefixExpr { | ||||
| 			f.write(it.op.str()) | ||||
| 			f.expr(it.right) | ||||
| 			f.write(node.op.str()) | ||||
| 			f.expr(node.right) | ||||
| 		} | ||||
| 		ast.RangeExpr { | ||||
| 			f.expr(it.low) | ||||
| 			f.expr(node.low) | ||||
| 			f.write('..') | ||||
| 			f.expr(it.high) | ||||
| 			f.expr(node.high) | ||||
| 		} | ||||
| 		ast.SelectorExpr { | ||||
| 			f.expr(it.expr) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write('.') | ||||
| 			f.write(it.field_name) | ||||
| 			f.write(node.field_name) | ||||
| 		} | ||||
| 		ast.SizeOf { | ||||
| 			f.write('sizeof(') | ||||
| 			if it.type_name != '' { | ||||
| 				f.write(it.type_name) | ||||
| 			if node.type_name != '' { | ||||
| 				f.write(node.type_name) | ||||
| 			} else { | ||||
| 				f.write(f.type_to_str(it.typ)) | ||||
| 				f.write(f.type_to_str(node.typ)) | ||||
| 			} | ||||
| 			f.write(')') | ||||
| 		} | ||||
| 		ast.SqlExpr {} | ||||
| 		ast.StringLiteral { | ||||
| 			if it.is_raw { | ||||
| 			if node.is_raw { | ||||
| 				f.write('r') | ||||
| 			} | ||||
| 			if it.val.contains("'") && !it.val.contains('"') { | ||||
| 				f.write('"$it.val"') | ||||
| 			if node.val.contains("'") && !node.val.contains('"') { | ||||
| 				f.write('"$node.val"') | ||||
| 			} else { | ||||
| 				f.write("'$it.val'") | ||||
| 				f.write("'$node.val'") | ||||
| 			} | ||||
| 		} | ||||
| 		ast.StringInterLiteral { | ||||
| 			// TODO: this code is very similar to ast.Expr.str()
 | ||||
| 			mut contains_single_quote := false | ||||
| 			for val in it.vals { | ||||
| 			for val in node.vals { | ||||
| 				if val.contains("'") { | ||||
| 					contains_single_quote = true | ||||
| 					break | ||||
|  | @ -734,20 +739,20 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 				f.write("'") | ||||
| 			} | ||||
| 			f.is_inside_interp = true | ||||
| 			for i, val in it.vals { | ||||
| 			for i, val in node.vals { | ||||
| 				f.write(val) | ||||
| 				if i >= it.exprs.len { | ||||
| 				if i >= node.exprs.len { | ||||
| 					break | ||||
| 				} | ||||
| 				f.write('$') | ||||
| 				fspec_str, needs_braces := it.get_fspec_braces(i) | ||||
| 				fspec_str, needs_braces := node.get_fspec_braces(i) | ||||
| 				if needs_braces { | ||||
| 					f.write('{') | ||||
| 					f.expr(it.exprs[i]) | ||||
| 					f.expr(node.exprs[i]) | ||||
| 					f.write(fspec_str) | ||||
| 					f.write('}') | ||||
| 				} else { | ||||
| 					f.expr(it.exprs[i]) | ||||
| 					f.expr(node.exprs[i]) | ||||
| 				} | ||||
| 			} | ||||
| 			f.is_inside_interp = false | ||||
|  | @ -758,24 +763,24 @@ pub fn (mut f Fmt) expr(node ast.Expr) { | |||
| 			} | ||||
| 		} | ||||
| 		ast.StructInit { | ||||
| 			f.struct_init(it) | ||||
| 			f.struct_init(node) | ||||
| 		} | ||||
| 		ast.Type { | ||||
| 			f.write(f.type_to_str(it.typ)) | ||||
| 			f.write(f.type_to_str(node.typ)) | ||||
| 		} | ||||
| 		ast.TypeOf { | ||||
| 			f.write('typeof(') | ||||
| 			f.expr(it.expr) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(')') | ||||
| 		} | ||||
| 		ast.Likely { | ||||
| 			if it.is_likely { | ||||
| 			if node.is_likely { | ||||
| 				f.write('_likely_') | ||||
| 			} else { | ||||
| 				f.write('_unlikely_') | ||||
| 			} | ||||
| 			f.write('(') | ||||
| 			f.expr(it.expr) | ||||
| 			f.expr(node.expr) | ||||
| 			f.write(')') | ||||
| 		} | ||||
| 	} | ||||
|  | @ -889,7 +894,7 @@ pub fn (mut f Fmt) short_module(name string) string { | |||
| 	if aname == '' { | ||||
| 		return symname | ||||
| 	} | ||||
| 	return '${aname}.${symname}' | ||||
| 	return '${aname}.$symname' | ||||
| } | ||||
| 
 | ||||
| pub fn (mut f Fmt) if_expr(it ast.IfExpr) { | ||||
|  | @ -984,7 +989,7 @@ pub fn (mut f Fmt) call_expr(node ast.CallExpr) { | |||
| 		f.write_language_prefix(node.language) | ||||
| 		name := f.short_module(node.name) | ||||
| 		f.mark_module_as_used(name) | ||||
| 		f.write('${name}') | ||||
| 		f.write('$name') | ||||
| 		if node.generic_type != 0 && node.generic_type != table.void_type { | ||||
| 			f.write('<') | ||||
| 			f.write(f.type_to_str(node.generic_type)) | ||||
|  | @ -1004,6 +1009,10 @@ pub fn (mut f Fmt) match_expr(it ast.MatchExpr) { | |||
| 		f.write('mut ') | ||||
| 	} | ||||
| 	f.expr(it.cond) | ||||
| 	if it.cond is ast.Ident { | ||||
| 		ident := it.cond as ast.Ident | ||||
| 		f.it_name = ident.name | ||||
| 	} | ||||
| 	f.writeln(' {') | ||||
| 	f.indent++ | ||||
| 	mut single_line := true | ||||
|  | @ -1063,11 +1072,13 @@ pub fn (mut f Fmt) match_expr(it ast.MatchExpr) { | |||
| 	} | ||||
| 	f.indent-- | ||||
| 	f.write('}') | ||||
| 	f.it_name = '' | ||||
| } | ||||
| 
 | ||||
| pub fn (mut f Fmt) remove_new_line() { | ||||
| 	mut i := 0 | ||||
| 	for i = f.out.len - 1; i >= 0; i-- { | ||||
| 	for i = f.out.len - 1; i >= 0; i-- | ||||
| 	 { | ||||
| 		if !f.out.buf[i].is_space() { // != `\n` {
 | ||||
| 			break | ||||
| 		} | ||||
|  | @ -1127,7 +1138,7 @@ pub fn (mut f Fmt) array_init(it ast.ArrayInit) { | |||
| 			for _ in 0 .. ainfo.nr_dims { | ||||
| 				f.write('[]') | ||||
| 			} | ||||
| 			f.write('map[${mk}]${mv}') | ||||
| 			f.write('map[$mk]$mv') | ||||
| 			f.write('{') | ||||
| 			if it.has_len { | ||||
| 				f.write('len: ') | ||||
|  |  | |||
|  | @ -599,10 +599,10 @@ fn (mut g Gen) stmt(node ast.Stmt) { | |||
| 			g.gen_assert_stmt(it) | ||||
| 		} | ||||
| 		ast.AssignStmt { | ||||
| 			g.gen_assign_stmt(it) | ||||
| 			g.gen_assign_stmt(node) | ||||
| 		} | ||||
| 		ast.Attr { | ||||
| 			g.attrs << it.name | ||||
| 			g.attrs << node.name | ||||
| 			g.writeln('// Attr: [$it.name]') | ||||
| 		} | ||||
| 		ast.Block { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue