From e0e064ff08af43507168dcc5492a595b0fe85991 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 4 May 2020 16:19:23 +0800 Subject: [PATCH] scanner: fix string slash line breaks error --- vlib/builtin/string_test.v | 11 +++++++++++ vlib/v/scanner/scanner.v | 24 +++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/vlib/builtin/string_test.v b/vlib/builtin/string_test.v index 58eada529f..f32cc5e2b1 100644 --- a/vlib/builtin/string_test.v +++ b/vlib/builtin/string_test.v @@ -728,3 +728,14 @@ fn test_split_into_lines() { assert line == line_content } } + +fn test_string_literal_with_backslash(){ + a := 'Hello\ + World' + assert a == 'HelloWorld' + + b := 'One\ + Two\ + Three' + assert b == 'OneTwoThree' +} diff --git a/vlib/v/scanner/scanner.v b/vlib/v/scanner/scanner.v index 0c6ffb0c83..396297a047 100644 --- a/vlib/v/scanner/scanner.v +++ b/vlib/v/scanner/scanner.v @@ -900,13 +900,31 @@ fn (s mut Scanner) ident_string() string { if s.is_inside_string { end++ } - if start > s.pos {} - else { - lit = s.text[start..end] + if start <= s.pos { + if s.text[start..end].contains('\\\n') { + lit = trim_slash_line_break(s.text[start..end]) + } else { + lit = s.text[start..end] + } } return lit } +fn trim_slash_line_break(s string) string { + mut start := 0 + mut ret_str := s + for { + idx := ret_str.index_after('\\\n', start) + if idx != -1 { + ret_str = ret_str[..idx] + ret_str[idx+2..].trim_left(' \n\t\v\f\r') + start = idx + } else { + break + } + } + return ret_str +} + fn (s mut Scanner) ident_char() string { start := s.pos slash := `\\`