diff --git a/src/compiler.rs b/src/compiler.rs index df003f5..58aae45 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -545,10 +545,7 @@ impl Compiler { self.last_errors.clear(); self.last_parse_errors.clear(); for err in &tree.errors { - let msg = format!( - "{}:{}: {}", - err.location.file, err.location.line, err.message - ); + let msg = format_error(err.location, &err.message); if !self.quiet { println!("{}", msg); } diff --git a/src/lexer.rs b/src/lexer.rs index c7386a9..fbfe225 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -127,18 +127,26 @@ impl Lexer { } } - /// Handle a newline: increment line and update line_start. + /// Handle a newline. The resulting `Endl` token is located at the newline + /// itself, on the line it terminates, so errors like "expected Rparen, + /// got Endl" point at the end of the offending line. The line counter is + /// advanced when the token after the `Endl` is lexed. fn handle_newline(&mut self) { + self.loc.col = (self.i - self.line_start + 1) as u32; self.i += 1; - self.loc.line += 1; self.line_start = self.i; - self.loc.col = 1; } fn _next(&mut self) -> Token { let bytes = self.code.as_bytes(); let n = bytes.len(); + // The previous token was a newline: move on to the next line. + if self.tok == Token::Endl { + self.loc.line += 1; + self.loc.col = 1; + } + // Skip whitespace. while self.i < n && bytes[self.i].is_ascii_whitespace() { if bytes[self.i] == b'\n' { diff --git a/src/parser.rs b/src/parser.rs index 878725b..e038c10 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -43,7 +43,6 @@ fn expect_id(cx: &mut ParseContext) -> Name { name } else { let message = format!("expected identifier, got {:?}", cx.lex.tok); - println!("{:?}", message); cx.err(message); cx.next(); Name::new("".to_string()) diff --git a/tests/cases/arenas.lyte b/tests/cases/arenas.lyte index a04f983..dbda8d2 100644 --- a/tests/cases/arenas.lyte +++ b/tests/cases/arenas.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/arenas.lyte:5: arena is reserved for future use +// ../tests/cases/arenas.lyte:5:5: arena is reserved for future use main { arena {} } diff --git a/tests/cases/arrays/zero_size_array.lyte b/tests/cases/arrays/zero_size_array.lyte index a22bd09..fb7a266 100644 --- a/tests/cases/arrays/zero_size_array.lyte +++ b/tests/cases/arrays/zero_size_array.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/arrays/zero_size_array.lyte:6: array size must be greater than 0 +// ../tests/cases/arrays/zero_size_array.lyte:6:18: array size must be greater than 0 main { var x: [i32; 0] diff --git a/tests/cases/checker/assume_forbidden.lyte b/tests/cases/checker/assume_forbidden.lyte index db07b9b..8e228e8 100644 --- a/tests/cases/checker/assume_forbidden.lyte +++ b/tests/cases/checker/assume_forbidden.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/assume_forbidden.lyte:6: assume is only allowed in the standard library or prelude +// ../tests/cases/checker/assume_forbidden.lyte:6:5: assume is only allowed in the standard library or prelude foo(a: [i32], i: i32) { assume i >= 0 diff --git a/tests/cases/checker/literal_suffix_array_type_size.lyte b/tests/cases/checker/literal_suffix_array_type_size.lyte index 0bf7957..789cda4 100644 --- a/tests/cases/checker/literal_suffix_array_type_size.lyte +++ b/tests/cases/checker/literal_suffix_array_type_size.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_array_type_size.lyte:6: array size integer cannot have a suffix +// ../tests/cases/checker/literal_suffix_array_type_size.lyte:6:18: array size integer cannot have a suffix main { var a: [i32; 3u32] diff --git a/tests/cases/checker/literal_suffix_const.lyte b/tests/cases/checker/literal_suffix_const.lyte index ed50df1..db5e636 100644 --- a/tests/cases/checker/literal_suffix_const.lyte +++ b/tests/cases/checker/literal_suffix_const.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_const.lyte:5: integer const cannot have a suffix +// ../tests/cases/checker/literal_suffix_const.lyte:5:11: integer const cannot have a suffix const N = 3u32 main { diff --git a/tests/cases/checker/literal_suffix_invalid.lyte b/tests/cases/checker/literal_suffix_invalid.lyte index 33c6914..1418f2a 100644 --- a/tests/cases/checker/literal_suffix_invalid.lyte +++ b/tests/cases/checker/literal_suffix_invalid.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_invalid.lyte:6: invalid numeric literal suffix 'i64' +// ../tests/cases/checker/literal_suffix_invalid.lyte:6:5: invalid numeric literal suffix 'i64' main { 1i64 diff --git a/tests/cases/checker/literal_suffix_invalid_float_u.lyte b/tests/cases/checker/literal_suffix_invalid_float_u.lyte index b387965..0b85706 100644 --- a/tests/cases/checker/literal_suffix_invalid_float_u.lyte +++ b/tests/cases/checker/literal_suffix_invalid_float_u.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_invalid_float_u.lyte:6: invalid numeric literal suffix 'u' +// ../tests/cases/checker/literal_suffix_invalid_float_u.lyte:6:5: invalid numeric literal suffix 'u' main { 1.0u diff --git a/tests/cases/checker/literal_suffix_invalid_i8.lyte b/tests/cases/checker/literal_suffix_invalid_i8.lyte index 4288fcc..71dcd46 100644 --- a/tests/cases/checker/literal_suffix_invalid_i8.lyte +++ b/tests/cases/checker/literal_suffix_invalid_i8.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_invalid_i8.lyte:6: invalid numeric literal suffix 'i8' +// ../tests/cases/checker/literal_suffix_invalid_i8.lyte:6:5: invalid numeric literal suffix 'i8' main { 1i8 diff --git a/tests/cases/checker/literal_suffix_invalid_integer_float.lyte b/tests/cases/checker/literal_suffix_invalid_integer_float.lyte index 4461f2f..9a430e0 100644 --- a/tests/cases/checker/literal_suffix_invalid_integer_float.lyte +++ b/tests/cases/checker/literal_suffix_invalid_integer_float.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_invalid_integer_float.lyte:6: invalid numeric literal suffix 'f64' +// ../tests/cases/checker/literal_suffix_invalid_integer_float.lyte:6:5: invalid numeric literal suffix 'f64' main { 1f64 diff --git a/tests/cases/checker/literal_suffix_invalid_u8.lyte b/tests/cases/checker/literal_suffix_invalid_u8.lyte index 9fee25c..0bedb01 100644 --- a/tests/cases/checker/literal_suffix_invalid_u8.lyte +++ b/tests/cases/checker/literal_suffix_invalid_u8.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_invalid_u8.lyte:6: invalid numeric literal suffix 'u8' +// ../tests/cases/checker/literal_suffix_invalid_u8.lyte:6:5: invalid numeric literal suffix 'u8' main { 1u8 diff --git a/tests/cases/checker/literal_suffix_tuple_index.lyte b/tests/cases/checker/literal_suffix_tuple_index.lyte index 79b0b67..1ab470e 100644 --- a/tests/cases/checker/literal_suffix_tuple_index.lyte +++ b/tests/cases/checker/literal_suffix_tuple_index.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/checker/literal_suffix_tuple_index.lyte:7: tuple field index cannot have a suffix +// ../tests/cases/checker/literal_suffix_tuple_index.lyte:7:7: tuple field index cannot have a suffix main { var t = (1, 2) diff --git a/tests/cases/defer_reserved.lyte b/tests/cases/defer_reserved.lyte index 1673abb..84a8d6e 100644 --- a/tests/cases/defer_reserved.lyte +++ b/tests/cases/defer_reserved.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/defer_reserved.lyte:5: defer is reserved for future use +// ../tests/cases/defer_reserved.lyte:5:1: defer is reserved for future use defer { } diff --git a/tests/cases/partial_function.lyte b/tests/cases/partial_function.lyte index 2f78ef5..533d0d6 100644 --- a/tests/cases/partial_function.lyte +++ b/tests/cases/partial_function.lyte @@ -1,6 +1,6 @@ // args: --check // expected stdout: -// ../tests/cases/partial_function.lyte:6: expected Rparen, got Endl +// ../tests/cases/partial_function.lyte:5:5: expected Rparen, got Endl foo(