parser: fix string interpolation for expressions ending `c`, `r`, `js`
							parent
							
								
									11908410f3
								
							
						
					
					
						commit
						de76ac583f
					
				| 
						 | 
				
			
			@ -32,6 +32,7 @@ mut:
 | 
			
		|||
	inside_or_expr    bool
 | 
			
		||||
	inside_for        bool
 | 
			
		||||
	inside_fn         bool
 | 
			
		||||
	inside_str_interp bool
 | 
			
		||||
	pref              &pref.Preferences
 | 
			
		||||
	builtin_mod       bool // are we in the `builtin` module?
 | 
			
		||||
	mod               string // current module name
 | 
			
		||||
| 
						 | 
				
			
			@ -811,7 +812,7 @@ pub fn (mut p Parser) name_expr() ast.Expr {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// Raw string (`s := r'hello \n ')
 | 
			
		||||
	if p.tok.lit in ['r', 'c', 'js'] && p.peek_tok.kind == .string && p.prev_tok.kind != .str_dollar {
 | 
			
		||||
	if p.tok.lit in ['r', 'c', 'js'] && p.peek_tok.kind == .string && !p.inside_str_interp {
 | 
			
		||||
		return p.string_expr()
 | 
			
		||||
	}
 | 
			
		||||
	mut known_var := false
 | 
			
		||||
| 
						 | 
				
			
			@ -1106,6 +1107,7 @@ fn (mut p Parser) string_expr() ast.Expr {
 | 
			
		|||
	mut vals := []string{}
 | 
			
		||||
	mut efmts := []string{}
 | 
			
		||||
	// Handle $ interpolation
 | 
			
		||||
	p.inside_str_interp = true
 | 
			
		||||
	for p.tok.kind == .string {
 | 
			
		||||
		vals << p.tok.lit
 | 
			
		||||
		p.next()
 | 
			
		||||
| 
						 | 
				
			
			@ -1141,6 +1143,7 @@ fn (mut p Parser) string_expr() ast.Expr {
 | 
			
		|||
		expr_fmts: efmts
 | 
			
		||||
		pos: pos
 | 
			
		||||
	}
 | 
			
		||||
	p.inside_str_interp = false
 | 
			
		||||
	return node
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,6 +76,15 @@ fn test_string_interpolation_string_prefix() {
 | 
			
		|||
	assert jsjs == 'jsjs'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_interpolation_string_prefix_expr() {
 | 
			
		||||
	r := 1
 | 
			
		||||
	c := 2
 | 
			
		||||
	js := 1
 | 
			
		||||
	assert '>${3+r}<' == '>4<'
 | 
			
		||||
	assert '${r == js} $js' == 'true 1'
 | 
			
		||||
	assert '>${js+c} ${js+r==c}<' == '>3 true<'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_inttypes_string_interpolation() {
 | 
			
		||||
	c := i8(-103)
 | 
			
		||||
	uc := byte(217)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue