simplify vfmt
							parent
							
								
									d9b29bfb4e
								
							
						
					
					
						commit
						e6775913aa
					
				|  | @ -969,6 +969,7 @@ fn (p mut Parser) fn_call_args(f mut Fn) { | |||
| 				p.error('`$arg.name` is a mutable argument, you need to provide a variable to modify: `$f.name(... mut a...)`') | ||||
| 			} | ||||
| 			p.check(.key_mut) | ||||
| 			p.fspace() | ||||
| 			var_name := p.lit | ||||
| 			v := p.find_var(var_name) or { | ||||
| 				p.error('`$arg.name` is a mutable argument, you need to provide a variable to modify: `$f.name(... mut a...)`') | ||||
|  |  | |||
|  | @ -73,7 +73,6 @@ mut: | |||
| 	sql_params []string // ("select * from users where id = $1", ***"100"***)
 | ||||
| 	sql_types []string // int, string and so on; see sql_params
 | ||||
| 	is_vh bool // parsing .vh file (for example `const (a int)` is allowed)
 | ||||
| 	fmt_dollar bool | ||||
| pub: | ||||
| 	mod            string | ||||
| } | ||||
|  |  | |||
|  | @ -42,6 +42,8 @@ mut: | |||
| 	line_ends   []int // the positions of source lines ends   (i.e. \n signs)
 | ||||
| 	nlines int  // total number of lines in the source file that were scanned
 | ||||
| 	is_vh bool // Keep newlines
 | ||||
| 	is_fmt bool // Used only for skipping ${} in strings, since we need literal
 | ||||
| 	            // string values when generating formatted code.
 | ||||
| } | ||||
| 
 | ||||
| // new scanner from file.
 | ||||
|  | @ -67,6 +69,7 @@ fn new_scanner_file(file_path string) &Scanner { | |||
| 	} | ||||
| 
 | ||||
| 	mut s := new_scanner(raw_text) | ||||
| 	s.init_fmt() | ||||
| 	s.file_path = file_path | ||||
| 
 | ||||
| 	return s | ||||
|  | @ -688,14 +691,14 @@ fn (s mut Scanner) ident_string() string { | |||
| 			s.error('0 character in a string literal') | ||||
| 		} | ||||
| 		// ${var}
 | ||||
| 		if c == `{` && prevc == `$` && !is_raw && s.count_symbol_before(s.pos-2, slash) % 2 == 0 { | ||||
| 		if c == `{` && prevc == `$` && !is_raw && !s.is_fmt && s.count_symbol_before(s.pos-2, slash) % 2 == 0 { | ||||
| 			s.inside_string = true | ||||
| 			// so that s.pos points to $ at the next step
 | ||||
| 			s.pos -= 2 | ||||
| 			break | ||||
| 		} | ||||
| 		// $var
 | ||||
| 		if (c.is_letter() || c == `_`) && prevc == `$` && !is_raw && s.count_symbol_before(s.pos-2, slash) % 2 == 0 { | ||||
| 		if (c.is_letter() || c == `_`) && prevc == `$` && !s.is_fmt && !is_raw && s.count_symbol_before(s.pos-2, slash) % 2 == 0 { | ||||
| 			s.inside_string = true | ||||
| 			s.inter_start = true | ||||
| 			s.pos -= 2 | ||||
|  |  | |||
|  | @ -290,6 +290,9 @@ fn (t Token) str() string { | |||
| 		return t.lit | ||||
| 		 | ||||
| 	}	 | ||||
| 	if t.tok == .chartoken { | ||||
| 		return '`$t.lit`' | ||||
| 	}	 | ||||
| 	if t.tok == .str { | ||||
| 		return "'$t.lit'" | ||||
| 	}	 | ||||
|  |  | |||
|  | @ -86,6 +86,11 @@ fn (p mut Parser) fmt_dec() { | |||
| 	p.scanner.fmt_indent-- | ||||
| } | ||||
| 
 | ||||
| [if vfmt] | ||||
| fn (p mut Scanner) init_fmt() { | ||||
| 	p.is_fmt = true | ||||
| } | ||||
| 
 | ||||
| [if vfmt] | ||||
| fn (p mut Parser) fnext() { | ||||
| 	if p.tok == .eof { | ||||
|  | @ -95,18 +100,6 @@ fn (p mut Parser) fnext() { | |||
| 		p.fmt_dec() | ||||
| 	} | ||||
| 	mut s := p.strtok() | ||||
| 	// Need to reconstruct an interpolated string from multiple string and
 | ||||
| 	// dollar tokens.
 | ||||
| 	// 'abc $name zxc' => ['abc', $, name, 'zxc'] => 'abc'$name'zxc'
 | ||||
| 	// need to remove the extra '
 | ||||
| 	if p.tok == .str && p.peek() == .dollar { | ||||
| 		s = s[..s.len - 1] | ||||
| 		p.fmt_dollar = true | ||||
| 	}	 | ||||
| 	else if p.tok == .str && p.fmt_dollar { | ||||
| 		s = s[1..] | ||||
| 		p.fmt_dollar = false | ||||
| 	}	 | ||||
| 	p.fgen(s) | ||||
| 	// vfmt: increase indentation on `{` unless it's `{}`
 | ||||
| 	if p.tok == .lcbr && !p.inside_if_expr && p.peek() != .rcbr { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue