fmt: TypeDecl; format more files
							parent
							
								
									d86539c4f5
								
							
						
					
					
						commit
						c73d91a8fe
					
				|  | @ -6,11 +6,11 @@ module ast | ||||||
| import v.token | import v.token | ||||||
| import v.table | import v.table | ||||||
| 
 | 
 | ||||||
| pub type TypeDecl = AliasTypeDecl | SumTypeDecl | FnTypeDecl | pub type TypeDecl = AliasTypeDecl | FnTypeDecl | SumTypeDecl | ||||||
| 
 | 
 | ||||||
| pub type Expr = AnonFn | ArrayInit | AsCast | AssignExpr | Assoc | BoolLiteral | CastExpr | CallExpr | CharLiteral | ConcatExpr | EnumVal | FloatLiteral | IfExpr | Ident | IfGuardExpr | InfixExpr | IndexExpr | IntegerLiteral | MapInit | MatchExpr | None | OrExpr | ParExpr | PostfixExpr | PrefixExpr | RangeExpr | SelectorExpr | SizeOf | StringLiteral | StringInterLiteral | StructInit | Type | TypeOf | pub type Expr = AnonFn | ArrayInit | AsCast | AssignExpr | Assoc | BoolLiteral | CallExpr | CastExpr | CharLiteral | ConcatExpr | EnumVal | FloatLiteral | Ident | IfExpr | IfGuardExpr | IndexExpr | InfixExpr | IntegerLiteral | MapInit | MatchExpr | None | OrExpr | ParExpr | PostfixExpr | PrefixExpr | RangeExpr | SelectorExpr | SizeOf | StringInterLiteral | StringLiteral | StructInit | Type | TypeOf | ||||||
| 
 | 
 | ||||||
| pub type Stmt = AssignStmt | AssertStmt | Attr | Block | BranchStmt | Comment | CompIf | ConstDecl | DeferStmt | EnumDecl | ExprStmt | FnDecl | ForCStmt | ForInStmt | ForStmt | GlobalDecl | GoStmt | GotoLabel | GotoStmt | HashStmt | Import | InterfaceDecl | Module | Return | StructDecl | TypeDecl | UnsafeStmt | pub type Stmt = AssertStmt | AssignStmt | Attr | Block | BranchStmt | Comment | CompIf | ConstDecl | DeferStmt | EnumDecl | ExprStmt | FnDecl | ForCStmt | ForInStmt | ForStmt | GlobalDecl | GoStmt | GotoLabel | GotoStmt | HashStmt | Import | InterfaceDecl | Module | Return | StructDecl | TypeDecl | UnsafeStmt | ||||||
| 
 | 
 | ||||||
| pub type ScopeObject = ConstField | GlobalDecl | Var | pub type ScopeObject = ConstField | GlobalDecl | Var | ||||||
| 
 | 
 | ||||||
|  | @ -428,7 +428,6 @@ pub: | ||||||
| 	is_else bool | 	is_else bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* | /* | ||||||
| CompIf.is_opt: | CompIf.is_opt: | ||||||
| `$if xyz? {}` => this compile time `if` is optional, | `$if xyz? {}` => this compile time `if` is optional, | ||||||
|  | @ -438,7 +437,6 @@ if `xyz` is NOT defined. | ||||||
| If .is_opt is false, then when `xyz` is not defined, | If .is_opt is false, then when `xyz` is not defined, | ||||||
| the compilation will fail. | the compilation will fail. | ||||||
| */ | */ | ||||||
| 
 |  | ||||||
| pub struct CompIf { | pub struct CompIf { | ||||||
| pub: | pub: | ||||||
| 	val        string | 	val        string | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ pub fn (node &FnDecl) str(t &table.Table) string { | ||||||
| 			m = '&' | 			m = '&' | ||||||
| 		} | 		} | ||||||
| 		receiver = '($node.receiver.name $m$name) ' | 		receiver = '($node.receiver.name $m$name) ' | ||||||
| */ | 		*/ | ||||||
| 	} | 	} | ||||||
| 	mut name := if node.is_anon { '' } else { node.name.after('.') } | 	mut name := if node.is_anon { '' } else { node.name.after('.') } | ||||||
| 	if node.is_c { | 	if node.is_c { | ||||||
|  |  | ||||||
|  | @ -30,7 +30,7 @@ pub fn (mut b Builder) build_x64(v_files []string, out_file string) { | ||||||
| 
 | 
 | ||||||
| pub fn (mut b Builder) compile_x64() { | pub fn (mut b Builder) compile_x64() { | ||||||
| 	// v.files << v.v_files_from_dir(os.join_path(v.pref.vlib_path,'builtin','bare'))
 | 	// v.files << v.v_files_from_dir(os.join_path(v.pref.vlib_path,'builtin','bare'))
 | ||||||
| 	files := [ b.pref.path] | 	files := [b.pref.path] | ||||||
| 	b.set_module_lookup_paths() | 	b.set_module_lookup_paths() | ||||||
| 	b.build_x64(files, b.pref.out_name) | 	b.build_x64(files, b.pref.out_name) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ import term | ||||||
| fn test_all() { | fn test_all() { | ||||||
| 	mut total_errors := 0 | 	mut total_errors := 0 | ||||||
| 	vexe := os.getenv('VEXE') | 	vexe := os.getenv('VEXE') | ||||||
| 	//vroot := os.dir(vexe)
 | 	// vroot := os.dir(vexe)
 | ||||||
| 	dir := 'vlib/v/checker/tests/inout' | 	dir := 'vlib/v/checker/tests/inout' | ||||||
| 	files := os.ls(dir) or { | 	files := os.ls(dir) or { | ||||||
| 		panic(err) | 		panic(err) | ||||||
|  | @ -28,8 +28,10 @@ fn test_all() { | ||||||
| 		mut expected := os.read_file(program.replace('.v', '') + '.out') or { | 		mut expected := os.read_file(program.replace('.v', '') + '.out') or { | ||||||
| 			panic(err) | 			panic(err) | ||||||
| 		} | 		} | ||||||
| 		expected = expected.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', '\n').trim('\n') | 		expected = expected.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', | ||||||
| 		found := res.output.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', '\n').trim('\n') | 			'\n').trim('\n') | ||||||
|  | 		found := res.output.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', | ||||||
|  | 			'\n').trim('\n') | ||||||
| 		if expected != found { | 		if expected != found { | ||||||
| 			println(term.red('FAIL')) | 			println(term.red('FAIL')) | ||||||
| 			println('============') | 			println('============') | ||||||
|  | @ -40,8 +42,7 @@ fn test_all() { | ||||||
| 			println(found) | 			println(found) | ||||||
| 			println('============\n') | 			println('============\n') | ||||||
| 			total_errors++ | 			total_errors++ | ||||||
| 		} | 		} else { | ||||||
| 		else { |  | ||||||
| 			println(term.green('OK')) | 			println(term.green('OK')) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,14 +1,11 @@ | ||||||
| module doc | module doc | ||||||
| 
 | 
 | ||||||
| import ( | import strings | ||||||
| 	strings | import v.pref | ||||||
| 	// v.builder
 | import v.table | ||||||
| 	v.pref | import v.parser | ||||||
| 	v.table | import v.ast | ||||||
| 	v.parser | import os | ||||||
| 	v.ast |  | ||||||
| 	os |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| struct Doc { | struct Doc { | ||||||
| 	out   strings.Builder | 	out   strings.Builder | ||||||
|  | @ -18,7 +15,7 @@ mut: | ||||||
| 	stmts []ast.Stmt // all module statements from all files
 | 	stmts []ast.Stmt // all module statements from all files
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type FilterFn fn(node ast.FnDecl)bool | type FilterFn = fn (node ast.FnDecl) bool | ||||||
| 
 | 
 | ||||||
| pub fn doc(mod string, table &table.Table) string { | pub fn doc(mod string, table &table.Table) string { | ||||||
| 	mut d := Doc{ | 	mut d := Doc{ | ||||||
|  | @ -28,7 +25,7 @@ pub fn doc(mod string, table &table.Table) string { | ||||||
| 	} | 	} | ||||||
| 	vlib_path := os.dir(pref.vexe_path()) + '/vlib' | 	vlib_path := os.dir(pref.vexe_path()) + '/vlib' | ||||||
| 	mod_path := mod.replace('.', os.path_separator) | 	mod_path := mod.replace('.', os.path_separator) | ||||||
| 	path := os.join_path(vlib_path,mod_path) | 	path := os.join_path(vlib_path, mod_path) | ||||||
| 	if !os.exists(path) { | 	if !os.exists(path) { | ||||||
| 		println('module "$mod" not found') | 		println('module "$mod" not found') | ||||||
| 		println(path) | 		println(path) | ||||||
|  | @ -45,7 +42,10 @@ pub fn doc(mod string, table &table.Table) string { | ||||||
| 		if file.ends_with('_test.v') || file.ends_with('_windows.c.v') || file.ends_with('_macos.c.v') { | 		if file.ends_with('_test.v') || file.ends_with('_windows.c.v') || file.ends_with('_macos.c.v') { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		file_ast := parser.parse_file(os.join_path(path,file), table, .skip_comments,	&pref.Preferences{}, &ast.Scope{parent: 0}) | 		file_ast := parser.parse_file(os.join_path(path, file), table, .skip_comments, &pref.Preferences{}, | ||||||
|  | 			&ast.Scope{ | ||||||
|  | 			parent: 0 | ||||||
|  | 		}) | ||||||
| 		d.stmts << file_ast.stmts | 		d.stmts << file_ast.stmts | ||||||
| 	} | 	} | ||||||
| 	if d.stmts.len == 0 { | 	if d.stmts.len == 0 { | ||||||
|  | @ -58,12 +58,11 @@ pub fn doc(mod string, table &table.Table) string { | ||||||
| 	d.out.writeln('') | 	d.out.writeln('') | ||||||
| 	d.print_methods() | 	d.print_methods() | ||||||
| 	/* | 	/* | ||||||
| 		for stmt in file_ast.stmts { | 	for stmt in file_ast.stmts { | ||||||
| 			d.stmt(stmt) | 			d.stmt(stmt) | ||||||
| 		} | 		} | ||||||
| 	println(path) | 	println(path) | ||||||
| 	*/ | 	*/ | ||||||
| 
 |  | ||||||
| 	return d.out.str().trim_space() | 	return d.out.str().trim_space() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -71,18 +70,18 @@ fn (d &Doc) get_fn_node(f ast.FnDecl) string { | ||||||
| 	return f.str(d.table).replace_each([d.mod + '.', '', 'pub ', '']) | 	return f.str(d.table).replace_each([d.mod + '.', '', 'pub ', '']) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (d mut Doc) print_fns() { | fn (mut d Doc) print_fns() { | ||||||
| 	fn_signatures := d.get_fn_signatures(is_pub_function) | 	fn_signatures := d.get_fn_signatures(is_pub_function) | ||||||
| 	d.write_fn_signatures(fn_signatures) | 	d.write_fn_signatures(fn_signatures) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (d mut Doc) print_methods() { | fn (mut d Doc) print_methods() { | ||||||
| 	fn_signatures := d.get_fn_signatures(is_pub_method) | 	fn_signatures := d.get_fn_signatures(is_pub_method) | ||||||
| 	d.write_fn_signatures(fn_signatures) | 	d.write_fn_signatures(fn_signatures) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [inline] | [inline] | ||||||
| fn (d mut Doc) write_fn_signatures(fn_signatures []string) { | fn (mut d Doc) write_fn_signatures(fn_signatures []string) { | ||||||
| 	for s in fn_signatures { | 	for s in fn_signatures { | ||||||
| 		d.out.writeln(s) | 		d.out.writeln(s) | ||||||
| 	} | 	} | ||||||
|  | @ -98,7 +97,7 @@ fn (d Doc) get_fn_signatures(filter_fn FilterFn) []string { | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			else {} | 			else {} | ||||||
| 	} | 		} | ||||||
| 	} | 	} | ||||||
| 	fn_signatures.sort() | 	fn_signatures.sort() | ||||||
| 	return fn_signatures | 	return fn_signatures | ||||||
|  | @ -113,7 +112,7 @@ fn is_pub_function(node ast.FnDecl) bool { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TODO it's probably better to keep using AST, not `table`
 | // TODO it's probably better to keep using AST, not `table`
 | ||||||
| fn (d mut Doc) print_enums() { | fn (mut d Doc) print_enums() { | ||||||
| 	for typ in d.table.types { | 	for typ in d.table.types { | ||||||
| 		if typ.kind != .enum_ { | 		if typ.kind != .enum_ { | ||||||
| 			continue | 			continue | ||||||
|  | @ -127,7 +126,7 @@ fn (d mut Doc) print_enums() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (d mut Doc) print_structs() { | fn (mut d Doc) print_structs() { | ||||||
| 	for typ in d.table.types { | 	for typ in d.table.types { | ||||||
| 		if typ.kind != .struct_ || !typ.name.starts_with(d.mod + '.') { | 		if typ.kind != .struct_ || !typ.name.starts_with(d.mod + '.') { | ||||||
| 			// !typ.name[0].is_capital() || typ.name.starts_with('C.') {
 | 			// !typ.name[0].is_capital() || typ.name.starts_with('C.') {
 | ||||||
|  |  | ||||||
|  | @ -375,6 +375,44 @@ fn (mut f Fmt) type_decl(node ast.TypeDecl) { | ||||||
| 			ptype := f.type_to_str(it.parent_type) | 			ptype := f.type_to_str(it.parent_type) | ||||||
| 			f.write('type $it.name $ptype') | 			f.write('type $it.name $ptype') | ||||||
| 		} | 		} | ||||||
|  | 		ast.FnTypeDecl { | ||||||
|  | 			if it.is_pub { | ||||||
|  | 				f.write('pub ') | ||||||
|  | 			} | ||||||
|  | 			typ_sym := f.table.get_type_symbol(it.typ) | ||||||
|  | 			fn_typ_info := typ_sym.info as table.FnType | ||||||
|  | 			fn_info := fn_typ_info.func | ||||||
|  | 			fn_name := it.name.replace(f.cur_mod + '.', '') | ||||||
|  | 			f.write('type $fn_name = fn (') | ||||||
|  | 			for i, arg in fn_info.args { | ||||||
|  | 				f.write(arg.name) | ||||||
|  | 				mut s := f.table.type_to_str(arg.typ) | ||||||
|  | 				if arg.is_mut { | ||||||
|  | 					f.write('mut ') | ||||||
|  | 					if s.starts_with('&') { | ||||||
|  | 						s = s[1..] | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				is_last_arg := i == fn_info.args.len - 1 | ||||||
|  | 				should_add_type := is_last_arg || fn_info.args[i + 1].typ != arg.typ || (fn_info.is_variadic && | ||||||
|  | 					i == fn_info.args.len - 2) | ||||||
|  | 				if should_add_type { | ||||||
|  | 					if fn_info.is_variadic && is_last_arg { | ||||||
|  | 						f.write(' ...' + s) | ||||||
|  | 					} else { | ||||||
|  | 						f.write(' ' + s) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if !is_last_arg { | ||||||
|  | 					f.write(', ') | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			f.write(')') | ||||||
|  | 			if fn_info.return_type.idx() != table.void_type_idx { | ||||||
|  | 				ret_str := f.table.type_to_str(fn_info.return_type) | ||||||
|  | 				f.write(' ' + ret_str) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		ast.SumTypeDecl { | 		ast.SumTypeDecl { | ||||||
| 			if it.is_pub { | 			if it.is_pub { | ||||||
| 				f.write('pub ') | 				f.write('pub ') | ||||||
|  | @ -384,11 +422,9 @@ fn (mut f Fmt) type_decl(node ast.TypeDecl) { | ||||||
| 			for t in it.sub_types { | 			for t in it.sub_types { | ||||||
| 				sum_type_names << f.type_to_str(t) | 				sum_type_names << f.type_to_str(t) | ||||||
| 			} | 			} | ||||||
|  | 			sum_type_names.sort() | ||||||
| 			f.write(sum_type_names.join(' | ')) | 			f.write(sum_type_names.join(' | ')) | ||||||
| 		} | 		} | ||||||
| 		else { |  | ||||||
| 			eprintln('fmt type_decl: unknown ' + typeof(node)) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	f.writeln('\n') | 	f.writeln('\n') | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,9 +1,26 @@ | ||||||
| // Sumtype
 | // Sumtype
 | ||||||
| type FooBar = Foo | Bar | type FooBar = Bar | Foo | ||||||
| 
 | 
 | ||||||
| pub type PublicBar = Foo | Bar | FooBar | pub type PublicBar = Bar | Foo | FooBar | ||||||
|  | 
 | ||||||
|  | type Uint = byte | u16 | u32 | u64 | ||||||
|  | 
 | ||||||
|  | type Float = f32 | f64 | ||||||
| 
 | 
 | ||||||
| // Alias type
 | // Alias type
 | ||||||
| type MyInt int | type MyInt int | ||||||
| 
 | 
 | ||||||
| pub type Abc f32 | pub type Abc f32 | ||||||
|  | 
 | ||||||
|  | // Fn type decl
 | ||||||
|  | type EmptyFn = fn () | ||||||
|  | 
 | ||||||
|  | type OneArgFn = fn (i int) | ||||||
|  | 
 | ||||||
|  | type TwoDiffArgs = fn (i int, s string) bool | ||||||
|  | 
 | ||||||
|  | type TwoSameArgs = fn (i, j int) string | ||||||
|  | 
 | ||||||
|  | type VarArgs = fn (s ...string) int | ||||||
|  | 
 | ||||||
|  | type NOVarArgs = fn (i int, s ...string) f64 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,32 @@ | ||||||
|    type    FooBar=   Foo |     Bar |    type    FooBar=   Foo |     Bar | ||||||
|    pub type   PublicBar = Foo | Bar | FooBar |    pub type   PublicBar = Foo | Bar | FooBar | ||||||
| 
 | 
 | ||||||
|  | type   Uint =   u16 | u64 | ||||||
|  | 	| u32 | ||||||
|  | 	    | byte | ||||||
|  | type | ||||||
|  | Float = | ||||||
|  | 	f32 | | ||||||
|  | 	f64 | ||||||
|  | 
 | ||||||
|  // Alias type
 |  // Alias type
 | ||||||
|      type  MyInt    int |      type  MyInt    int | ||||||
| 	  | 
 | ||||||
|  pub type Abc f32 |  pub type Abc f32 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // Fn type decl
 | ||||||
|  | 
 | ||||||
|  |  type EmptyFn	= fn() | ||||||
|  | type OneArgFn = | ||||||
|  | 	fn (i    int) | ||||||
|  | type TwoDiffArgs | ||||||
|  | = fn (i    int, s string) bool | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	type TwoSameArgs = fn(i int, j int) string | ||||||
|  | 
 | ||||||
|  | type VarArgs = fn | ||||||
|  | (s ...string) int | ||||||
|  | 
 | ||||||
|  | type NOVarArgs = fn(i int, s ...string) f64 | ||||||
|  |  | ||||||
|  | @ -3,10 +3,8 @@ | ||||||
| // that can be found in the LICENSE file.
 | // that can be found in the LICENSE file.
 | ||||||
| module gen | module gen | ||||||
| 
 | 
 | ||||||
| import ( | import v.table | ||||||
| 	v.table | import strings | ||||||
| 	strings |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // TODO replace with comptime code generation.
 | // TODO replace with comptime code generation.
 | ||||||
| // TODO remove cJSON dependency.
 | // TODO remove cJSON dependency.
 | ||||||
|  | @ -19,7 +17,7 @@ import ( | ||||||
| // return res;
 | // return res;
 | ||||||
| // }
 | // }
 | ||||||
| // Codegen json_decode/encode funcs
 | // Codegen json_decode/encode funcs
 | ||||||
| fn (g mut Gen) gen_json_for_type(typ table.Type) { | fn (mut g Gen) gen_json_for_type(typ table.Type) { | ||||||
| 	mut dec := strings.new_builder(100) | 	mut dec := strings.new_builder(100) | ||||||
| 	mut enc := strings.new_builder(100) | 	mut enc := strings.new_builder(100) | ||||||
| 	sym := g.table.get_type_symbol(typ) | 	sym := g.table.get_type_symbol(typ) | ||||||
|  | @ -73,7 +71,7 @@ Option ${dec_fn.name}(cJSON* root, $t* res) { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| ' | ' | ||||||
| */ | 	*/ | ||||||
| 	// Code gen encoder
 | 	// Code gen encoder
 | ||||||
| 	enc_fn_name := js_enc_name(sym.name) | 	enc_fn_name := js_enc_name(sym.name) | ||||||
| 	enc.writeln(' | 	enc.writeln(' | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ import v.ast | ||||||
| 
 | 
 | ||||||
| pub type Type int | pub type Type int | ||||||
| 
 | 
 | ||||||
| pub type TypeInfo = Array | ArrayFixed | Map | Struct | Interface | MultiReturn | Alias | Enum | SumType | FnType | pub type TypeInfo = Alias | Array | ArrayFixed | Enum | FnType | Interface | Map | MultiReturn | Struct | SumType | ||||||
| 
 | 
 | ||||||
| pub struct TypeSymbol { | pub struct TypeSymbol { | ||||||
| pub: | pub: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue