aboutsummaryrefslogtreecommitdiff
path: root/src/server/check.odin
diff options
context:
space:
mode:
authorFabian Sperber <fabian.sperber@gmx.net>2023-03-10 13:01:28 +0100
committerFabian Sperber <fabian.sperber@gmx.net>2023-03-10 13:01:46 +0100
commita76bcc4969b05b016f4cb802b7ade9dff50d85b3 (patch)
treed19b585615c212694d9debffa3a1ae617547de2d /src/server/check.odin
parent233fcf32e859518df211e82cd5dc7251dce7ca33 (diff)
Improve scanning 'odin check' output to ignore suggestion text, and provide column info
Diffstat (limited to 'src/server/check.odin')
-rw-r--r--src/server/check.odin122
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,