mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
clean up empty lines in errors; simplify source line tracking
This commit is contained in:
parent
d289a90cc7
commit
eeea257467
@ -95,11 +95,11 @@ fn (s &Scanner) error_with_col(msg string, col int) {
|
||||
// to find the source file, when the IDE has a different working folder than v itself.
|
||||
eprintln('${fullpath}:${s.line_nr + 1}:${col}: $final_message')
|
||||
|
||||
if s.should_print_line_on_error && s.file_lines.len > 0 {
|
||||
context_start_line := imax(0, (s.line_nr - error_context_before + 1 ))
|
||||
context_end_line := imin(s.file_lines.len, (s.line_nr + error_context_after + 1 ))
|
||||
if s.should_print_line_on_error && s.nlines > 0 {
|
||||
context_start_line := imax(0, (s.line_nr - error_context_before + 1 ))
|
||||
context_end_line := imin(s.nlines-1, (s.line_nr + error_context_after + 1 ))
|
||||
for cline := context_start_line; cline < context_end_line; cline++ {
|
||||
line := '${(cline+1):5d}| ' + s.file_lines[ cline ]
|
||||
line := '${(cline+1):5d}| ' + s.line( cline )
|
||||
coloredline := if cline == s.line_nr && color_on { term.red(line) } else { line }
|
||||
eprintln( coloredline )
|
||||
if cline != s.line_nr { continue }
|
||||
@ -225,9 +225,8 @@ fn (s mut Scanner) get_scanner_pos_of_token(t &Token) ScannerPos {
|
||||
// Starting from the start, scan the source lines
|
||||
// till the desired tline is reached, then
|
||||
// s.pos + tcol would be the proper position
|
||||
// of the token. Continue scanning for some more lines of context too.
|
||||
// of the token.
|
||||
s.goto_scanner_position(ScannerPos{})
|
||||
s.file_lines = []string
|
||||
|
||||
mut prevlinepos := 0
|
||||
// NB: TCC BUG workaround: removing the `mut ate:=0 ate++` line
|
||||
@ -251,15 +250,13 @@ fn (s mut Scanner) get_scanner_pos_of_token(t &Token) ScannerPos {
|
||||
for {
|
||||
prevlinepos = s.pos
|
||||
if s.pos >= s.text.len { break }
|
||||
if s.line_nr > tline + 10 { break }
|
||||
if s.line_nr > tline { break }
|
||||
////////////////////////////////////////
|
||||
if tline == s.line_nr {
|
||||
sptoken = s.get_scanner_pos()
|
||||
sptoken.pos += tcol
|
||||
}
|
||||
s.ignore_line() s.eat_single_newline()
|
||||
sline := s.text.substr( prevlinepos, s.pos )//.trim_right('\r\n')
|
||||
s.file_lines << sline
|
||||
}
|
||||
//////////////////////////////////////////////////
|
||||
s.goto_scanner_position(cpos)
|
||||
|
@ -39,7 +39,8 @@ mut:
|
||||
should_print_errors_in_color bool
|
||||
should_print_relative_paths_on_error bool
|
||||
quote byte // which quote is used to denote current string: ' or "
|
||||
file_lines []string // filled *only on error* by rescanning the source till the error (and several lines more)
|
||||
line_ends []int // the positions of source lines ends (i.e. \n signs)
|
||||
nlines int // total number of lines in the source file that were scanned
|
||||
}
|
||||
|
||||
// new scanner from file.
|
||||
@ -632,7 +633,7 @@ fn (s mut Scanner) ident_string() string {
|
||||
s.inc_line_number()
|
||||
}
|
||||
// Don't allow \0
|
||||
if c == `0` && s.pos > 2 && s.text[s.pos - 1] == `\\` {
|
||||
if c == `0` && s.pos > 2 && s.text[s.pos - 1] == slash {
|
||||
s.error('0 character in a string literal')
|
||||
}
|
||||
// Don't allow \x00
|
||||
@ -640,14 +641,14 @@ fn (s mut Scanner) ident_string() string {
|
||||
s.error('0 character in a string literal')
|
||||
}
|
||||
// ${var}
|
||||
if c == `{` && prevc == `$` && s.count_symbol_before(s.pos-2, `\\`) % 2 == 0 {
|
||||
if c == `{` && prevc == `$` && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
||||
s.inside_string = true
|
||||
// so that s.pos points to $ at the next step
|
||||
s.pos -= 2
|
||||
break
|
||||
}
|
||||
// $var
|
||||
if (c.is_letter() || c == `_`) && prevc == `$` && s.count_symbol_before(s.pos-2, `\\`) % 2 == 0 {
|
||||
if (c.is_letter() || c == `_`) && prevc == `$` && s.count_symbol_before(s.pos-2, slash) % 2 == 0 {
|
||||
s.inside_string = true
|
||||
s.inter_start = true
|
||||
s.pos -= 2
|
||||
@ -748,7 +749,7 @@ fn (s mut Scanner) debug_tokens() {
|
||||
|
||||
|
||||
fn (s mut Scanner) ignore_line() {
|
||||
s.eat_to_end_of_line()
|
||||
s.eat_to_end_of_line()
|
||||
s.inc_line_number()
|
||||
}
|
||||
|
||||
@ -761,6 +762,21 @@ fn (s mut Scanner) eat_to_end_of_line(){
|
||||
fn (s mut Scanner) inc_line_number() {
|
||||
s.last_nl_pos = s.pos
|
||||
s.line_nr++
|
||||
s.line_ends << s.pos
|
||||
s.nlines++
|
||||
}
|
||||
|
||||
fn (s Scanner) line(n int) string {
|
||||
mut res := ''
|
||||
if n >= 0 &&
|
||||
n < s.line_ends.len {
|
||||
nline_start := if n == 0 { 0 } else { s.line_ends[ n - 1 ] }
|
||||
nline_end := s.line_ends[n]
|
||||
if nline_start <= nline_end {
|
||||
res = s.text.substr( nline_start, nline_end )
|
||||
}
|
||||
}
|
||||
return res.trim_right('\r\n').trim_left('\r\n')
|
||||
}
|
||||
|
||||
fn is_name_char(c byte) bool {
|
||||
|
Loading…
Reference in New Issue
Block a user