diff --git a/vlib/v/fmt/tests/integer_literal_keep.vv b/vlib/v/fmt/tests/integer_literal_keep.vv index 4a77e68bdf..f26d917084 100644 --- a/vlib/v/fmt/tests/integer_literal_keep.vv +++ b/vlib/v/fmt/tests/integer_literal_keep.vv @@ -10,9 +10,9 @@ fn sum_types(a []Expr) { } fn main() { - x := 0xdeadbeef - u := 9978654321 - o := 0o664 + x := 0xdead_beef + u := 9_978_654_321 + o := 0o66_4 eprintln(' hex constant in decimal: $x') eprintln(' u constant in decimal: $u') eprintln('octal constant in decimal: $o') diff --git a/vlib/v/scanner/scanner.v b/vlib/v/scanner/scanner.v index 91a1c55843..273acff8e2 100644 --- a/vlib/v/scanner/scanner.v +++ b/vlib/v/scanner/scanner.v @@ -39,8 +39,7 @@ pub mut: line_ends []int // the positions of source lines ends (i.e. \n signs) nr_lines 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. + is_fmt bool // Used for v fmt. comments_mode CommentsMode is_inside_toplvl_statement bool // *only* used in comments_mode: .toplevel_comments, toggled by parser all_tokens []token.Token // *only* used in comments_mode: .toplevel_comments, contains all tokens @@ -174,8 +173,12 @@ fn (mut s Scanner) ident_name() string { return name } -fn filter_num_sep(txt byteptr, start int, end int) string { +fn (s Scanner) num_lit(start int, end int) string { + if s.is_fmt { + return s.text[start..end] + } unsafe { + txt := s.text.str mut b := malloc(end - start + 1) // add a byte for the endstring 0 mut i1 := 0 for i := start; i < end; i++ { @@ -223,7 +226,7 @@ fn (mut s Scanner) ident_bin_number() string { s.pos = first_wrong_digit_pos // adjust error position s.error('this binary number has unsuitable digit `$first_wrong_digit.str()`') } - number := filter_num_sep(s.text.str, start_pos, s.pos) + number := s.num_lit(start_pos, s.pos) s.pos-- return number } @@ -265,7 +268,7 @@ fn (mut s Scanner) ident_hex_number() string { s.pos = first_wrong_digit_pos // adjust error position s.error('this hexadecimal number has unsuitable digit `$first_wrong_digit.str()`') } - number := filter_num_sep(s.text.str, start_pos, s.pos) + number := s.num_lit(start_pos, s.pos) s.pos-- return number } @@ -304,7 +307,7 @@ fn (mut s Scanner) ident_oct_number() string { s.pos = first_wrong_digit_pos // adjust error position s.error('this octal number has unsuitable digit `$first_wrong_digit.str()`') } - number := filter_num_sep(s.text.str, start_pos, s.pos) + number := s.num_lit(start_pos, s.pos) s.pos-- return number } @@ -416,7 +419,7 @@ fn (mut s Scanner) ident_dec_number() string { s.error('too many decimal points in number') } } - number := filter_num_sep(s.text.str, start_pos, s.pos) + number := s.num_lit(start_pos, s.pos) s.pos-- return number }