scanner: fix string interpolation in raw strings
parent
3449a8bc4d
commit
4e64a58ac1
|
@ -498,3 +498,10 @@ fn test_atoi() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_raw_inter() {
|
||||||
|
world := 'world'
|
||||||
|
s := r'hello\n$world'
|
||||||
|
assert s == r'hello\n$world'
|
||||||
|
assert s.contains('$')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -2733,7 +2733,7 @@ fn (p mut Parser) string_expr() {
|
||||||
// `C.puts('hi')` => `puts("hi");`
|
// `C.puts('hi')` => `puts("hi");`
|
||||||
/*
|
/*
|
||||||
Calling a C function sometimes requires a call to a string method
|
Calling a C function sometimes requires a call to a string method
|
||||||
C.fun('ssss'.to_wide()) => fun(string_to_wide(tos2((byte*)('ssss'))))
|
C.fun('ssss'.to_wide()) => fun(string_to_wide(tos3("ssss")))
|
||||||
*/
|
*/
|
||||||
if (p.calling_c && p.peek() != .dot) || (p.pref.translated && p.mod == 'main') {
|
if (p.calling_c && p.peek() != .dot) || (p.pref.translated && p.mod == 'main') {
|
||||||
p.gen('"$f"')
|
p.gen('"$f"')
|
||||||
|
|
|
@ -650,11 +650,11 @@ fn (s Scanner) count_symbol_before(p int, sym byte) int {
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
// println('array out of bounds $idx len=$a.len')
|
|
||||||
// This is really bad. It needs a major clean up
|
|
||||||
fn (s mut Scanner) ident_string() string {
|
fn (s mut Scanner) ident_string() string {
|
||||||
q := s.text[s.pos]
|
q := s.text[s.pos]
|
||||||
if (q == single_quote || q == double_quote) && !s.inside_string{
|
is_quote := q == single_quote || q == double_quote
|
||||||
|
is_raw := is_quote && s.text[s.pos-1] == `r`
|
||||||
|
if is_quote && !s.inside_string {
|
||||||
s.quote = q
|
s.quote = q
|
||||||
}
|
}
|
||||||
//if s.file_path.contains('string_test') {
|
//if s.file_path.contains('string_test') {
|
||||||
|
@ -688,14 +688,14 @@ fn (s mut Scanner) ident_string() string {
|
||||||
s.error('0 character in a string literal')
|
s.error('0 character in a string literal')
|
||||||
}
|
}
|
||||||
// ${var}
|
// ${var}
|
||||||
if c == `{` && prevc == `$` && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
if c == `{` && prevc == `$` && !is_raw && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
||||||
s.inside_string = true
|
s.inside_string = true
|
||||||
// so that s.pos points to $ at the next step
|
// so that s.pos points to $ at the next step
|
||||||
s.pos -= 2
|
s.pos -= 2
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// $var
|
// $var
|
||||||
if (c.is_letter() || c == `_`) && prevc == `$` && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
if (c.is_letter() || c == `_`) && prevc == `$` && !is_raw && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
||||||
s.inside_string = true
|
s.inside_string = true
|
||||||
s.inter_start = true
|
s.inter_start = true
|
||||||
s.pos -= 2
|
s.pos -= 2
|
||||||
|
|
Loading…
Reference in New Issue