fmt: wrap_long_line()
							parent
							
								
									728aeb8092
								
							
						
					
					
						commit
						e9931e6f84
					
				|  | @ -8,7 +8,7 @@ import ( | |||
| 	strings | ||||
| 	filepath | ||||
| 	v.pref | ||||
| 	//compiler.x64
 | ||||
| 	// compiler.x64
 | ||||
| 	time | ||||
| ) | ||||
| 
 | ||||
|  | @ -33,7 +33,7 @@ mut: | |||
| 	prev_tok2              TokenKind // TODO remove these once the tokens are cached
 | ||||
| 	lit                    string | ||||
| 	cgen                   &CGen | ||||
| 	//x64                    &x64.Gen
 | ||||
| 	// x64                    &x64.Gen
 | ||||
| 	table                  &Table | ||||
| 	import_table           ImportTable // Holds imports for just the file being parsed
 | ||||
| 	pass                   Pass | ||||
|  | @ -165,23 +165,21 @@ fn (v mut V) new_parser_from_file(path string) Parser { | |||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if v.pref.compile_defines.len > 0 { | ||||
| 		for cdefine in v.pref.compile_defines { | ||||
| 			custom_path_ending := '_d_${cdefine}.v' | ||||
| 			if path.ends_with(custom_path_ending){ | ||||
| 			if path.ends_with(custom_path_ending) { | ||||
| 				path_platform = custom_path_ending | ||||
| 				path_pcguard = v.platform_postfix_to_ifdefguard('custom $cdefine') | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	mut p := v.new_parser(new_scanner_file(path)) | ||||
| 	p = { | ||||
| 		p | | ||||
| 		file_path:path, | ||||
| 		file_path_dir:filepath.dir( path ), | ||||
| 		file_path_dir:filepath.dir(path), | ||||
| 		file_name:path.all_after(filepath.separator), | ||||
| 		file_platform:path_platform, | ||||
| 		file_pcguard:path_pcguard, | ||||
|  | @ -213,12 +211,12 @@ fn (v mut V) new_parser(scanner &Scanner) Parser { | |||
| 		table: v.table | ||||
| 		cur_fn: EmptyFn | ||||
| 		cgen: v.cgen | ||||
| 		//x64: v.x64
 | ||||
| 		// x64: v.x64
 | ||||
| 
 | ||||
| 		pref: v.pref | ||||
| 		os: v.pref.os | ||||
| 		vroot: v.pref.vroot | ||||
| 		local_vars: [Var{ | ||||
| 		}].repeat(MaxLocalVars) | ||||
| 		local_vars: [Var{}].repeat(MaxLocalVars) | ||||
| 		import_table: new_import_table() | ||||
| 	} | ||||
| 	$if js { | ||||
|  | @ -318,15 +316,16 @@ fn (p &Parser) peek_token() Token { | |||
| 	return p.tokens[p.token_idx] | ||||
| } | ||||
| 
 | ||||
| fn (p &Parser) log(s string) { | ||||
| } | ||||
| 	/* | ||||
| fn (p &Parser) log(s string) {} | ||||
| 
 | ||||
| /* | ||||
| 	if !p.pref.is_verbose { | ||||
| 		return | ||||
| 	} | ||||
| 	println(s) | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| pub fn (p &Parser) save_state() ParserState { | ||||
| 	return ParserState{ | ||||
| 		scanner_file_path: p.scanner.file_path | ||||
|  | @ -467,9 +466,8 @@ fn (p mut Parser) parse(pass Pass) { | |||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	parsing_start_ticks := time.ticks() | ||||
| 	compile_cycles_stuck_mask := u64( 0x1FFFFFFF ) // 2^29-1 cycles
 | ||||
| 	compile_cycles_stuck_mask := u64(0x1FFFFFFF) // 2^29-1 cycles
 | ||||
| 	mut parsing_cycle := u64(1) | ||||
| 	p.prev_stuck_token_idx = p.token_idx | ||||
| 	// Go through every top level token or throw a compilation error if a non-top level token is met
 | ||||
|  | @ -494,7 +492,8 @@ fn (p mut Parser) parse(pass Pass) { | |||
| 					// (for example, by DOOM). such fields are
 | ||||
| 					// basically int consts
 | ||||
| 					p.enum_decl(true) | ||||
| 				} else { | ||||
| 				} | ||||
| 				else { | ||||
| 					p.error('Nameless enums are not allowed.') | ||||
| 				} | ||||
| 			} | ||||
|  | @ -518,7 +517,8 @@ fn (p mut Parser) parse(pass Pass) { | |||
| 					} | ||||
| 					else { | ||||
| 						p.error('wrong pub keyword usage') | ||||
| 					}} | ||||
| 					} | ||||
| 	} | ||||
| 			} | ||||
| 			.key_fn { | ||||
| 				p.fn_decl() | ||||
|  | @ -547,9 +547,7 @@ fn (p mut Parser) parse(pass Pass) { | |||
| 				p.comp_time() | ||||
| 			} | ||||
| 			.key_global { | ||||
| 				if !p.pref.translated && !p.pref.is_live && !p.builtin_mod && !p.pref.building_v && | ||||
| 					p.mod != 'ui' && p.mod != 'gg2' && p.mod != 'uiold' && !os.getwd().contains('/volt') && | ||||
| 					!p.pref.enable_globals { | ||||
| 				if !p.pref.translated && !p.pref.is_live && !p.builtin_mod && !p.pref.building_v && p.mod != 'ui' && p.mod != 'gg2' && p.mod != 'uiold' && !os.getwd().contains('/volt') && !p.pref.enable_globals { | ||||
| 					p.error('use `v --enable-globals ...` to enable globals') | ||||
| 				} | ||||
| 				p.next() | ||||
|  | @ -627,7 +625,8 @@ fn (p mut Parser) parse(pass Pass) { | |||
| 				else { | ||||
| 					p.error('unexpected token `${p.strtok()}`') | ||||
| 				} | ||||
| 			}} | ||||
| 			} | ||||
| 	} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -755,7 +754,7 @@ fn (p mut Parser) const_decl() { | |||
| 			p.table.register_const(name, typ, p.mod, is_pub) | ||||
| 		} | ||||
| 		// Check to see if this constant exists, and is void. If so, try and get the type again:
 | ||||
| 		if my_const:=p.v.table.find_const(name){ | ||||
| 		if my_const := p.v.table.find_const(name) { | ||||
| 			if my_const.typ == 'void' { | ||||
| 				for i, v in p.v.table.consts { | ||||
| 					if v.name == name { | ||||
|  | @ -833,7 +832,7 @@ fn (p mut Parser) type_decl() { | |||
| 		name = p.prepend_mod(name) | ||||
| 	} | ||||
| 	// Sum type
 | ||||
| 	//is_sum := p.tok == .pipe
 | ||||
| 	// is_sum := p.tok == .pipe
 | ||||
| 	if is_sum { | ||||
| 		// Register the first child  (name we already parsed)
 | ||||
| 		/* | ||||
|  | @ -847,17 +846,18 @@ fn (p mut Parser) type_decl() { | |||
| 		// Register the rest of them
 | ||||
| 		mut idx := 0 | ||||
| 		mut done := false | ||||
| 		for  {//p.tok == .pipe {
 | ||||
| 		for { | ||||
| 			// p.tok == .pipe {
 | ||||
| 			idx++ | ||||
| 			//p.next()
 | ||||
| 			// p.next()
 | ||||
| 			child_type_name := p.check_name() | ||||
| 			//println('$idx $child_type_name')
 | ||||
| 			// println('$idx $child_type_name')
 | ||||
| 			if p.tok != .pipe { | ||||
| 				done = true | ||||
| 			} | ||||
| 			if p.pass == .main { | ||||
| 				// Update the type's parent
 | ||||
| 				//println('child=$child_type_name parent=$name')
 | ||||
| 				// println('child=$child_type_name parent=$name')
 | ||||
| 				mut t := p.find_type(child_type_name) | ||||
| 				if t.name == '' { | ||||
| 					p.error('unknown type `$child_type_name`') | ||||
|  | @ -872,9 +872,9 @@ fn (p mut Parser) type_decl() { | |||
| 			p.fspace() | ||||
| 			p.check(.pipe) | ||||
| 			p.fspace() | ||||
| 			if p.tokens[p.token_idx - 2].line_nr <  p.tokens[p.token_idx - 1].line_nr { | ||||
| 			if p.tokens[p.token_idx - 2].line_nr < p.tokens[p.token_idx - 1].line_nr { | ||||
| 				p.fgenln('\t') | ||||
| 				//p.fgen_nl()
 | ||||
| 				// p.fgen_nl()
 | ||||
| 			} | ||||
| 		} | ||||
| 		if p.pass == .decl { | ||||
|  | @ -896,7 +896,6 @@ int typ; | |||
| ') | ||||
| 	} | ||||
| 	else { | ||||
| 
 | ||||
| 		parent = p.get_type2() | ||||
| 	} | ||||
| 	nt_pair := p.table.cgen_name_type_pair(name, parent.name) | ||||
|  | @ -914,12 +913,11 @@ int typ; | |||
| 			is_public: is_pub | ||||
| 		}) | ||||
| 	} | ||||
| 	//if p.tok != .key_type {
 | ||||
| 		p.fgen_nl() | ||||
| 		p.fgen_nl() | ||||
| 	//}
 | ||||
| 	// if p.tok != .key_type {
 | ||||
| 	p.fgen_nl() | ||||
| 	p.fgen_nl() | ||||
| 	// }
 | ||||
| } | ||||
| 
 | ||||
| // current token is `(`
 | ||||
| fn (p mut Parser) interface_method(field_name, receiver string) &Fn { | ||||
| 	mut method := &Fn{ | ||||
|  | @ -955,8 +953,8 @@ fn key_to_type_cat(tok TokenKind) TypeCategory { | |||
| 		.key_union { | ||||
| 			return .union_ | ||||
| 		} | ||||
| 		else { | ||||
| 		}} | ||||
| 		else {} | ||||
| 	} | ||||
| 	verror('Unknown token: $tok') | ||||
| 	return .builtin | ||||
| } | ||||
|  | @ -1096,7 +1094,6 @@ fn (p mut Parser) get_type() string { | |||
| 	if is_question { | ||||
| 		p.check(.question) | ||||
| 	} | ||||
| 
 | ||||
| 	// multiple returns
 | ||||
| 	if p.tok == .lpar { | ||||
| 		// p.warn('`()` are no longer necessary in multiple returns' +
 | ||||
|  | @ -1122,7 +1119,6 @@ fn (p mut Parser) get_type() string { | |||
| 		} | ||||
| 		return typ | ||||
| 	} | ||||
| 
 | ||||
| 	// arrays ([]int)
 | ||||
| 	mut arr_level := 0 | ||||
| 	for p.tok == .lsbr { | ||||
|  | @ -1215,7 +1211,7 @@ fn (p mut Parser) get_type() string { | |||
| 				if t_suggest.len > 0 { | ||||
| 					t_suggest = '. did you mean: ($tc_suggest) `$t_suggest`' | ||||
| 				} | ||||
| 				econtext := if p.pref.is_debug { '('+@FILE+':'+@LINE+')' } else {''} | ||||
| 				econtext := if p.pref.is_debug { '(' + '/Users/alex/code/v/vlib/compiler/aparser.v' + ':' + '1236' + ')' } else { '' } | ||||
| 				p.error('unknown type `$typ`$t_suggest $econtext') | ||||
| 			} | ||||
| 		} | ||||
|  | @ -1308,9 +1304,9 @@ fn (p mut Parser) statements() string { | |||
| 
 | ||||
| fn (p mut Parser) statements_no_rcbr() string { | ||||
| 	p.open_scope() | ||||
| 	//if !p.inside_if_expr {
 | ||||
| 		// p.genln('')
 | ||||
| 	//}
 | ||||
| 	// if !p.inside_if_expr {
 | ||||
| 	// p.genln('')
 | ||||
| 	// }
 | ||||
| 	mut i := 0 | ||||
| 	mut last_st_typ := '' | ||||
| 	for p.tok != .rcbr && p.tok != .eof { | ||||
|  | @ -1561,13 +1557,13 @@ fn (p mut Parser) statement(add_semi bool) string { | |||
| 		else { | ||||
| 			// An expression as a statement
 | ||||
| 			typ := p.expression() | ||||
| 			if p.inside_if_expr { | ||||
| 			} | ||||
| 			if p.inside_if_expr {} | ||||
| 			else { | ||||
| 				p.genln('; ') | ||||
| 			} | ||||
| 			return typ | ||||
| 		}} | ||||
| 		} | ||||
| 	} | ||||
| 	// ? : uses , as statement separators
 | ||||
| 	if p.inside_if_expr && p.tok != .rcbr { | ||||
| 		p.gen(', ') | ||||
|  | @ -1623,11 +1619,11 @@ fn ($v.name mut $v.typ) ${p.cur_fn.name}(...) { | |||
| 			} | ||||
| 		} | ||||
| 		.minus_assign { | ||||
| 				next := p.peek_token() | ||||
| 				if next.tok == .number && next.lit == '1' { | ||||
| 					p.error('use `--` instead of `-= 1`') | ||||
| 				} | ||||
| 				p.gen(' -= ') | ||||
| 			next := p.peek_token() | ||||
| 			if next.tok == .number && next.lit == '1' { | ||||
| 				p.error('use `--` instead of `-= 1`') | ||||
| 			} | ||||
| 			p.gen(' -= ') | ||||
| 		} | ||||
| 		else { | ||||
| 			p.gen(' ' + p.tok.str() + ' ') | ||||
|  | @ -1645,7 +1641,7 @@ fn ($v.name mut $v.typ) ${p.cur_fn.name}(...) { | |||
| 	// p.warn('expecting array got $expr_type')
 | ||||
| 	// }
 | ||||
| 	if expr_type == 'void' { | ||||
| 		_,fn_name := p.is_expr_fn_call(expr_tok+1) | ||||
| 		_,fn_name := p.is_expr_fn_call(expr_tok + 1) | ||||
| 		p.error_with_token_index('${fn_name}() $err_used_as_value', expr_tok) | ||||
| 	} | ||||
| 	// Allow `num = 4` where `num` is an `?int`
 | ||||
|  | @ -1658,7 +1654,7 @@ fn ($v.name mut $v.typ) ${p.cur_fn.name}(...) { | |||
| 	else if expr_type.starts_with('Option_') && p.assigned_type == parse_pointer(expr_type['Option_'.len..]) && p.tok == .key_orelse { | ||||
| 		line := p.cgen.cur_line | ||||
| 		vname := line[..pos].replace('=', '') // TODO cgen line hack
 | ||||
| 		if idx:=line.index('='){ | ||||
| 		if idx := line.index('=') { | ||||
| 			p.cgen.resetln(line.replace(line[..idx + 1], '')) | ||||
| 			p.gen_handle_option_or_else(expr_type, vname, ph) | ||||
| 		} | ||||
|  | @ -1674,12 +1670,12 @@ fn ($v.name mut $v.typ) ${p.cur_fn.name}(...) { | |||
| 		} | ||||
| 		p.cgen.resetln('memcpy( (& $left), ($etype{$expr}), sizeof( $left ) );') | ||||
| 	} | ||||
| 	// check type for +=, -=, *=, /=. 
 | ||||
| 	// check type for +=, -=, *=, /=.
 | ||||
| 	else if tok in [.plus_assign, .minus_assign, .mult_assign, .div_assign] { | ||||
| 		// special 1. ptrs with += or -= are acceptable.
 | ||||
| 		if !(tok in [.plus_assign, .minus_assign] && (is_integer_type(p.assigned_type) || is_pointer_type(p.assigned_type)) && (is_integer_type(expr_type) || is_pointer_type(expr_type))) { | ||||
| 			// special 2. `str += str` is acceptable 
 | ||||
| 			if !(tok == .plus_assign && p.assigned_type == expr_type && expr_type == 'string' ) { | ||||
| 			// special 2. `str += str` is acceptable
 | ||||
| 			if !(tok == .plus_assign && p.assigned_type == expr_type && expr_type == 'string') { | ||||
| 				if !is_number_type(p.assigned_type) { | ||||
| 					p.error_with_token_index('cannot use assignment operator ${tok.str()} on non-numeric type `$p.assigned_type`', errtok) | ||||
| 				} | ||||
|  | @ -1773,7 +1769,7 @@ fn (p mut Parser) var_decl() { | |||
| 	p.var_decl_name = if var_names.len > 1 { '_V_mret_${p.token_idx}_' + var_names.join('_') } else { var_names[0] } | ||||
| 	t := p.gen_var_decl(p.var_decl_name, is_static) | ||||
| 	if t == 'void' { | ||||
| 		_,fn_name := p.is_expr_fn_call(expr_tok+1) | ||||
| 		_,fn_name := p.is_expr_fn_call(expr_tok + 1) | ||||
| 		p.error_with_token_index('${fn_name}() $err_used_as_value', expr_tok) | ||||
| 	} | ||||
| 	mut var_types := [t] | ||||
|  | @ -2067,9 +2063,8 @@ fn (p mut Parser) var_expr(v Var) string { | |||
| 		p.gen(p.tok.str()) | ||||
| 		p.next() // ++/--
 | ||||
| 		// allow `a := c++` in translated code TODO remove once c2v handles this
 | ||||
| 		if p.pref.translated { | ||||
| 			// return p.index_expr(typ, fn_ph)
 | ||||
| 		} | ||||
| 		if p.pref.translated {} | ||||
| 		// return p.index_expr(typ, fn_ph)
 | ||||
| 		else { | ||||
| 			return typ | ||||
| 		} | ||||
|  | @ -2689,7 +2684,7 @@ fn (p mut Parser) array_init() string { | |||
| 	mut i := 0 | ||||
| 	for p.tok != .rsbr { | ||||
| 		if expected_array_type.starts_with('array_') { | ||||
| 		p.expected_type = expected_array_type[6..] | ||||
| 			p.expected_type = expected_array_type[6..] | ||||
| 		} | ||||
| 		val_typ := p.bool_expression() | ||||
| 		// Get the type of the first expression
 | ||||
|  | @ -2898,11 +2893,7 @@ fn (p mut Parser) return_st() { | |||
| 		mut cur_fn_typ_chk := p.cur_fn.typ | ||||
| 		// multiple returns
 | ||||
| 		if types.len > 1 { | ||||
| 			mr_type := if p.cur_fn.typ.starts_with('Option_') { | ||||
| 				p.cur_fn.typ[7..] | ||||
| 			} else { | ||||
| 				p.cur_fn.typ | ||||
| 			} | ||||
| 			mr_type := if p.cur_fn.typ.starts_with('Option_') { p.cur_fn.typ[7..] } else { p.cur_fn.typ } | ||||
| 			expr_type = mr_type | ||||
| 			expr_type_chk = types.join(',') | ||||
| 			cur_fn_typ_chk = cur_fn_typ_chk.replace('_V_MulRet_', '').replace('_PTR_', '*').replace('_V_', ',') | ||||
|  | @ -3174,9 +3165,8 @@ fn (p mut Parser) check_unused_imports() { | |||
| 	if output == '' { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// the imports are usually at the start of the file
 | ||||
| 	//p.production_error_with_token_index('the following imports were never used: $output', 0)
 | ||||
| 	// p.production_error_with_token_index('the following imports were never used: $output', 0)
 | ||||
| 	if p.pref.is_verbose { | ||||
| 		eprintln('Used imports table: ${p.import_table.used_imports.str()}') | ||||
| 	} | ||||
|  | @ -3216,12 +3206,11 @@ fn (p mut Parser) skip_block(inside_first_lcbr bool) { | |||
| 	p.check(.rcbr) | ||||
| } | ||||
| 
 | ||||
| fn todo_remove() { | ||||
| 	//x64.new_gen('f')
 | ||||
| } | ||||
| fn todo_remove() {} | ||||
| 
 | ||||
| 
 | ||||
| fn (p mut Parser) check_if_parser_is_stuck(parsing_cycle u64, parsing_start_ticks i64){ | ||||
| // x64.new_gen('f')
 | ||||
| // }
 | ||||
| fn (p mut Parser) check_if_parser_is_stuck(parsing_cycle u64, parsing_start_ticks i64) { | ||||
| 	// QTODO
 | ||||
| 	p.warn('todo...') | ||||
| 	/* | ||||
|  | @ -3242,4 +3231,5 @@ Please create a GitHub issue: https://github.com/vlang/v/issues/new/choose | |||
| 	} | ||||
| 	p.prev_stuck_token_idx = p.token_idx | ||||
| 	*/ | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -206,6 +206,9 @@ fn (f mut Fmt) expr(node ast.Expr) { | |||
| 			// type_sym := f.table.get_type_symbol(it.typ)
 | ||||
| 			f.write('[') | ||||
| 			for i, expr in it.exprs { | ||||
| 				if i > 0 { | ||||
| 					f.wrap_long_line() | ||||
| 				} | ||||
| 				f.expr(expr) | ||||
| 				if i < it.exprs.len - 1 { | ||||
| 					f.write(', ') | ||||
|  | @ -255,10 +258,7 @@ fn (f mut Fmt) expr(node ast.Expr) { | |||
| 		ast.InfixExpr { | ||||
| 			f.expr(it.left) | ||||
| 			f.write(' $it.op.str() ') | ||||
| 			if f.line_len > max_len { | ||||
| 				f.write('\n' + tabs[f.indent + 1]) | ||||
| 				f.line_len = 0 | ||||
| 			} | ||||
| 			f.wrap_long_line() | ||||
| 			f.expr(it.right) | ||||
| 		} | ||||
| 		ast.IndexExpr { | ||||
|  | @ -271,6 +271,9 @@ fn (f mut Fmt) expr(node ast.Expr) { | |||
| 			f.expr(it.expr) | ||||
| 			f.write('.' + it.name + '(') | ||||
| 			for i, arg in it.args { | ||||
| 				if i > 0 { | ||||
| 					f.wrap_long_line() | ||||
| 				} | ||||
| 				f.expr(arg) | ||||
| 				if i < it.args.len - 1 { | ||||
| 					f.write(', ') | ||||
|  | @ -313,6 +316,13 @@ fn (f mut Fmt) expr(node ast.Expr) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (f mut Fmt) wrap_long_line() { | ||||
| 	if f.line_len > max_len { | ||||
| 		f.write('\n' + tabs[f.indent + 1]) | ||||
| 		f.line_len = 0 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (f mut Fmt) index_expr(node ast.IndexExpr) { | ||||
| 	mut is_range := false | ||||
| 	match node.index { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue