diff options
| author | Fabian Sperber <fabian.sperber@gmx.net> | 2023-03-10 13:01:28 +0100 |
|---|---|---|
| committer | Fabian Sperber <fabian.sperber@gmx.net> | 2023-03-10 13:01:46 +0100 |
| commit | a76bcc4969b05b016f4cb802b7ade9dff50d85b3 (patch) | |
| tree | d19b585615c212694d9debffa3a1ae617547de2d | |
| parent | 233fcf32e859518df211e82cd5dc7251dce7ca33 (diff) | |
Improve scanning 'odin check' output to ignore suggestion text, and provide column info
| -rw-r--r-- | src/server/check.odin | 122 |
1 files changed, 68 insertions, 54 deletions
diff --git a/src/server/check.odin b/src/server/check.odin index e3dd0fa..6ede069 100644 --- a/src/server/check.odin +++ b/src/server/check.odin @@ -84,88 +84,102 @@ check :: proc(uri: common.Uri, writer: ^Writer, config: ^common.Config) { //find all the signatures string(digit:digit) loop: for scanner.peek(&s) != scanner.EOF { - error: ErrorSeperator + scan_line: { + error: ErrorSeperator - source_pos := s.src_pos + source_pos := s.src_pos - if source_pos == 1 { - source_pos = 0 - } + if source_pos == 1 { + source_pos = 0 + } - for scanner.peek(&s) != '(' { - n := scanner.scan(&s) + for scanner.peek(&s) != '(' { + n := scanner.scan(&s) - if n == scanner.EOF { - break loop + if n == scanner.EOF { + break loop + } + if n == '\n' { + source_pos = s.src_pos - 1 + } } - } - error.uri = string(buffer[source_pos:s.src_pos - 1]) + error.uri = string(buffer[source_pos:s.src_pos - 1]) - left_paren := scanner.scan(&s) + left_paren := scanner.scan(&s) - if left_paren != '(' { - break loop - } + if left_paren != '(' { + break scan_line + } - lhs_digit := scanner.scan(&s) + lhs_digit := scanner.scan(&s) - if lhs_digit != scanner.Int { - break loop - } + if lhs_digit != scanner.Int { + break scan_line + } - line, column: int - ok: bool + line, column: int + ok: bool - line, ok = strconv.parse_int(scanner.token_text(&s)) + line, ok = strconv.parse_int(scanner.token_text(&s)) - if !ok { - break loop - } + if !ok { + break scan_line + } - seperator := scanner.scan(&s) + seperator := scanner.scan(&s) - if seperator != ':' { - break loop - } + if seperator != ':' { + break scan_line + } - rhs_digit := scanner.scan(&s) + rhs_digit := scanner.scan(&s) - if rhs_digit != scanner.Int { - break loop - } + if rhs_digit != scanner.Int { + break scan_line + } - column, ok = strconv.parse_int(scanner.token_text(&s)) + column, ok = strconv.parse_int(scanner.token_text(&s)) - if !ok { - break loop - } + if !ok { + break scan_line + } - right_paren := scanner.scan(&s) + right_paren := scanner.scan(&s) - if right_paren != ')' { - break loop - } + if right_paren != ')' { + break scan_line + } + + source_pos = s.src_pos + + for scanner.peek(&s) != '\n' { + n := scanner.scan(&s) + + if n == scanner.EOF { + break + } + } + + if source_pos == s.src_pos { + continue + } - source_pos = s.src_pos + error.message = string(buffer[source_pos:s.src_pos - 1]) + error.column = column + error.line = line + append(&error_seperators, error) + continue loop + } + + // line scan failed, skip to the next line for scanner.peek(&s) != '\n' { n := scanner.scan(&s) - if n == scanner.EOF { break } } - - if source_pos == s.src_pos { - continue - } - - error.message = string(buffer[source_pos:s.src_pos - 1]) - error.column = column - error.line = line - - append(&error_seperators, error) } errors := make(map[string][dynamic]Diagnostic, 0, context.temp_allocator) @@ -185,7 +199,7 @@ check :: proc(uri: common.Uri, writer: ^Writer, config: ^common.Config) { code = "checker", severity = .Error, range = { - start = {character = 0, line = error.line - 1}, + start = {character = error.column, line = error.line - 1}, end = {character = 0, line = error.line}, }, message = error.message, |