@@ -131,19 +131,8 @@ pub fn new_scanner_file(file_path string, file_idx i16, comments_mode CommentsMo
131131 return error('${file_path} is not a .v file')
132132 }
133133 raw_text := util.read_file(file_path) or { return err }
134- mut s := &Scanner{
135- pref: pref_
136- text: raw_text
137- all_tokens: []token.Token{cap: raw_text.len / 3}
138- is_print_line_on_error: true
139- is_print_colored_error: true
140- is_print_rel_paths_on_error: true
141- is_fmt: pref_.is_fmt
142- comments_mode: comments_mode
143- file_path: file_path
144- file_base: os.base(file_path)
145- file_idx: file_idx
146- }
134+ mut s := new_plain_scanner(raw_text, comments_mode, pref_, file_path, os.base(file_path))
135+ s.file_idx = file_idx
147136 s.scan_all_tokens_in_buffer()
148137 return s
149138}
@@ -152,12 +141,13 @@ const internally_generated_v_code = 'internally_generated_v_code'
152141
153142// new scanner from string.
154143pub fn new_scanner(text string, comments_mode CommentsMode, pref_ &pref.Preferences) &Scanner {
155- mut s := new_plain_scanner(text, comments_mode, pref_)
144+ mut s := new_plain_scanner(text, comments_mode, pref_, internally_generated_v_code,
145+ internally_generated_v_code)
156146 s.scan_all_tokens_in_buffer()
157147 return s
158148}
159149
160-fn new_plain_scanner(text string, comments_mode CommentsMode, pref_ &pref.Preferences) &Scanner {
150+fn new_plain_scanner(text string, comments_mode CommentsMode, pref_ &pref.Preferences, file_path string, file_base string) &Scanner {
161151 return &Scanner{
162152 pref: pref_
163153 text: text
@@ -167,8 +157,8 @@ fn new_plain_scanner(text string, comments_mode CommentsMode, pref_ &pref.Prefer
167157 is_print_rel_paths_on_error: true
168158 is_fmt: pref_.is_fmt
169159 comments_mode: comments_mode
170- file_path: internally_generated_v_code
171- file_base: internally_generated_v_code
160+ file_path: file_path
161+ file_base: file_base
172162 }
173163}
174164
@@ -5,7 +5,8 @@ import v.token
55import v.pref
66
77fn scan_kinds(text string) []token.Kind {
8- mut scanner := new_plain_scanner(text, .skip_comments, &pref.Preferences{})
8+ mut scanner := new_plain_scanner(text, .skip_comments, &pref.Preferences{},
9+ internally_generated_v_code, internally_generated_v_code)
910 mut token_kinds := []token.Kind{}
1011 for {
1112 tok := scanner.text_scan()
@@ -18,7 +19,8 @@ fn scan_kinds(text string) []token.Kind {
1819}
1920
2021fn scan_tokens(text string) []token.Token {
21- mut scanner := new_plain_scanner(text, .parse_comments, &pref.Preferences{})
22+ mut scanner := new_plain_scanner(text, .parse_comments, &pref.Preferences{},
23+ internally_generated_v_code, internally_generated_v_code)
2224 mut tokens := []token.Token{}
2325 for {
2426 tok := scanner.text_scan()
@@ -315,7 +317,8 @@ fn test_escape_string() {
315317
316318fn assert_str_interpolation_works(mlen int, text string) {
317319 mut max_len := 0
318- mut scanner := new_plain_scanner(text, .skip_comments, &pref.Preferences{})
320+ mut scanner := new_plain_scanner(text, .skip_comments, &pref.Preferences{},
321+ internally_generated_v_code, internally_generated_v_code)
319322 for {
320323 tok := scanner.text_scan()
321324 if scanner.str_helper_tokens.len > max_len {
@@ -369,7 +372,8 @@ fn test_truncated_escape_at_eof_does_not_read_past_end() {
369372 // Buggy scanner reads [3]='a', [4]='b' — valid hex — and reports NO \x error.
370373 buf_x := r'"\xab"'.bytes()
371374 text_x := unsafe { tos(buf_x.data, 3) }
372- mut s := new_plain_scanner(text_x, .skip_comments, prefs)
375+ mut s := new_plain_scanner(text_x, .skip_comments, prefs, internally_generated_v_code,
376+ internally_generated_v_code)
373377 _ = s.text_scan()
374378 assert s.errors.any(it.message.contains('used without two following hex digits')), r'scanner must report \x error for "\xab" truncated after "\x"'
375379
@@ -377,7 +381,8 @@ fn test_truncated_escape_at_eof_does_not_read_past_end() {
377381 // Buggy scanner reads [3]...[6] — all valid hex — and reports NO \u error.
378382 buf_u := r'"\u1234"'.bytes()
379383 text_u := unsafe { tos(buf_u.data, 3) }
380- mut s2 := new_plain_scanner(text_u, .skip_comments, prefs)
384+ mut s2 := new_plain_scanner(text_u, .skip_comments, prefs, internally_generated_v_code,
385+ internally_generated_v_code)
381386 _ = s2.text_scan()
382387 assert s2.errors.any(it.message.contains('incomplete 16 bit unicode')), r'scanner must report \u error for "\u1234" truncated after "\u"'
383388
@@ -385,7 +390,8 @@ fn test_truncated_escape_at_eof_does_not_read_past_end() {
385390 // Buggy scanner reads [3]...[10] — all valid hex — and reports NO \U error.
386391 buf_uu := r'"\U12345678"'.bytes()
387392 text_uu := unsafe { tos(buf_uu.data, 3) }
388- mut s3 := new_plain_scanner(text_uu, .skip_comments, prefs)
393+ mut s3 := new_plain_scanner(text_uu, .skip_comments, prefs, internally_generated_v_code,
394+ internally_generated_v_code)
389395 _ = s3.text_scan()
390396 assert s3.errors.any(it.message.contains('incomplete 32 bit unicode')), r'scanner must report \U error for "\U12345678" truncated after "\U"'
391397}