Skip to content

Commit 0ebf184

Browse files
authored
vrepl: fix handling of multi-line type declaration syntax errors (#21902)
1 parent 25b26e0 commit 0ebf184

File tree

2 files changed

+66
-32
lines changed

2 files changed

+66
-32
lines changed

cmd/tools/vrepl.v

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ enum DeclType {
7979
fn_ // fn ...
8080
struct_ // struct ...
8181
interface_ // interface ...
82+
stmt_ // statement
8283
}
8384

8485
fn new_repl(folder string) Repl {
@@ -240,42 +241,44 @@ fn (r &Repl) current_source_code(should_add_temp_lines bool, not_add_print bool)
240241
return all_lines.join('\n')
241242
}
242243

243-
fn (r &Repl) insert_source_code(typ DeclType, line string) string {
244+
fn (r &Repl) insert_source_code(typ DeclType, lines []string) string {
244245
mut all_lines := r.import_to_source_code()
245246

246247
if vstartup != '' {
247-
mut lines := r.vstartup_lines.filter(!it.starts_with('print'))
248-
all_lines << lines
248+
all_lines << r.vstartup_lines.filter(!it.starts_with('print'))
249249
}
250250
all_lines << r.includes
251251
if typ == .include_ {
252-
all_lines << line
252+
all_lines << lines
253253
}
254254
all_lines << r.types
255255
if typ == .type_ {
256-
all_lines << line
256+
all_lines << lines
257257
}
258258
all_lines << r.enums
259259
if typ == .enum_ {
260-
all_lines << line
260+
all_lines << lines
261261
}
262262
all_lines << r.consts
263263
if typ == .const_ {
264-
all_lines << line
264+
all_lines << lines
265265
}
266266
all_lines << r.structs
267267
if typ == .struct_ {
268-
all_lines << line
268+
all_lines << lines
269269
}
270270
all_lines << r.interfaces
271271
if typ == .interface_ {
272-
all_lines << line
272+
all_lines << lines
273273
}
274274
all_lines << r.functions
275275
if typ == .fn_ {
276-
all_lines << line
276+
all_lines << lines
277277
}
278278
all_lines << r.lines
279+
if typ == .stmt_ {
280+
all_lines << lines
281+
}
279282
return all_lines.join('\n')
280283
}
281284

@@ -472,17 +475,7 @@ fn run_repl(workdir string, vrepl_prefix string) int {
472475

473476
if r.checks() {
474477
for rline in r.line.split('\n') {
475-
if r.in_func || was_func {
476-
r.functions << rline
477-
} else if r.in_struct || was_struct {
478-
r.structs << rline
479-
} else if r.in_enum || was_enum {
480-
r.enums << rline
481-
} else if r.in_interface || was_interface {
482-
r.interfaces << rline
483-
} else {
484-
r.temp_lines << rline
485-
}
478+
r.temp_lines << rline
486479
}
487480
if r.indent > 0 {
488481
continue
@@ -597,30 +590,52 @@ fn run_repl(workdir string, vrepl_prefix string) int {
597590
if mod !in r.modules {
598591
temp_source_code = '${r.line}\n' + r.current_source_code(false, true)
599592
}
593+
} else if r.line.len == 0 {
594+
if was_func {
595+
temp_source_code = r.insert_source_code(DeclType.fn_, r.temp_lines)
596+
} else if was_struct {
597+
temp_source_code = r.insert_source_code(DeclType.struct_, r.temp_lines)
598+
} else if was_enum {
599+
temp_source_code = r.insert_source_code(DeclType.enum_, r.temp_lines)
600+
} else if was_interface {
601+
temp_source_code = r.insert_source_code(DeclType.interface_, r.temp_lines)
602+
} else {
603+
temp_source_code = r.insert_source_code(DeclType.stmt_, r.temp_lines)
604+
}
600605
} else if starts_with_include {
601-
temp_source_code = r.insert_source_code(DeclType.include_, r.line)
606+
temp_source_code = r.insert_source_code(DeclType.include_, [r.line])
602607
} else if starts_with_fn {
603-
temp_source_code = r.insert_source_code(DeclType.fn_, r.line)
608+
temp_source_code = r.insert_source_code(DeclType.fn_, [r.line])
604609
} else if starts_with_const {
605-
temp_source_code = r.insert_source_code(DeclType.const_, r.line)
610+
temp_source_code = r.insert_source_code(DeclType.const_, [r.line])
606611
} else if starts_with_enum {
607-
temp_source_code = r.insert_source_code(DeclType.enum_, r.line)
612+
temp_source_code = r.insert_source_code(DeclType.enum_, [r.line])
608613
} else if starts_with_struct {
609-
temp_source_code = r.insert_source_code(DeclType.struct_, r.line)
614+
temp_source_code = r.insert_source_code(DeclType.struct_, [r.line])
610615
} else if starts_with_interface {
611-
temp_source_code = r.insert_source_code(DeclType.interface_, r.line)
616+
temp_source_code = r.insert_source_code(DeclType.interface_, [r.line])
612617
} else if starts_with_type {
613-
temp_source_code = r.insert_source_code(DeclType.type_, r.line)
618+
temp_source_code = r.insert_source_code(DeclType.type_, [r.line])
614619
} else {
615620
temp_source_code = r.current_source_code(true, false) + '\n${r.line}\n'
616621
}
617622
os.write_file(temp_file, temp_source_code) or { panic(err) }
618623
s := repl_run_vfile(temp_file) or { return 1 }
619624
if s.exit_code == 0 {
620-
r.lines << r.temp_lines
621-
r.temp_lines.clear()
622625
if starts_with_import {
623626
r.parse_import(r.line)
627+
} else if r.line.len == 0 {
628+
if was_func {
629+
r.functions << r.temp_lines
630+
} else if was_struct {
631+
r.structs << r.temp_lines
632+
} else if was_enum {
633+
r.enums << r.temp_lines
634+
} else if was_interface {
635+
r.interfaces << r.temp_lines
636+
} else {
637+
r.lines << r.temp_lines
638+
}
624639
} else if starts_with_include {
625640
r.includes << r.line
626641
} else if starts_with_fn {
@@ -638,9 +653,8 @@ fn run_repl(workdir string, vrepl_prefix string) int {
638653
} else {
639654
r.lines << r.line
640655
}
641-
} else {
642-
r.temp_lines.clear()
643656
}
657+
r.temp_lines.clear()
644658
if r.is_pin {
645659
r.pin()
646660
println('')
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
mut a := 22
2+
fn test() {
3+
aaa
4+
}
5+
fn print_info(n int) {
6+
println('${n}')
7+
}
8+
print_info(a)
9+
a = 11
10+
print_info(a)
11+
===output===
12+
error: `aaa` evaluated but not used
13+
7 | fn test() {
14+
8 |
15+
9 | aaa
16+
| ~~~
17+
10 |
18+
11 | }
19+
22
20+
11

0 commit comments

Comments
 (0)