[fine] File name in error messages
Going to need to normalize that name though, because right now it really *really* sucks to have a big \\?\ kinda name. Probably normalize it relative to the base directory.
This commit is contained in:
parent
a21f18da6e
commit
1199646e29
16 changed files with 52 additions and 34 deletions
|
|
@ -105,7 +105,8 @@ impl Runtime {
|
|||
ModuleSource::SourceText(source) => {
|
||||
let source: Rc<str> = source.into();
|
||||
let (tree, lines) = parse(&source);
|
||||
let semantics = Rc::new(Semantics::new(source, tree, lines));
|
||||
let semantics =
|
||||
Rc::new(Semantics::new(name.clone().into(), source, tree, lines));
|
||||
|
||||
let mut normalized_imports = Vec::new();
|
||||
for import in semantics.imports() {
|
||||
|
|
|
|||
|
|
@ -23,28 +23,36 @@ use std::{
|
|||
// that will have to wait for now
|
||||
#[derive(Clone, PartialEq, Eq)]
|
||||
pub struct Error {
|
||||
pub file: Rc<str>,
|
||||
pub start: (usize, usize),
|
||||
pub end: (usize, usize),
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
impl Error {
|
||||
pub fn new<T>(line: usize, column: usize, message: T) -> Self
|
||||
pub fn new<T>(file: Rc<str>, line: usize, column: usize, message: T) -> Self
|
||||
where
|
||||
T: ToString,
|
||||
{
|
||||
Error {
|
||||
file,
|
||||
start: (line, column),
|
||||
end: (line, column),
|
||||
message: message.to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_spanned<T>(start: (usize, usize), end: (usize, usize), message: T) -> Self
|
||||
pub fn new_spanned<T>(
|
||||
file: Rc<str>,
|
||||
start: (usize, usize),
|
||||
end: (usize, usize),
|
||||
message: T,
|
||||
) -> Self
|
||||
where
|
||||
T: ToString,
|
||||
{
|
||||
Error {
|
||||
file,
|
||||
start,
|
||||
end,
|
||||
message: message.to_string(),
|
||||
|
|
@ -60,7 +68,11 @@ impl fmt::Debug for Error {
|
|||
|
||||
impl fmt::Display for Error {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}:{}: {}", self.start.0, self.start.1, self.message)
|
||||
write!(
|
||||
f,
|
||||
"{}:{}:{}: {}",
|
||||
self.file, self.start.0, self.start.1, self.message
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -622,6 +634,7 @@ enum Incremental<T> {
|
|||
}
|
||||
|
||||
pub struct Semantics {
|
||||
file: Rc<str>,
|
||||
source: Rc<str>,
|
||||
syntax_tree: Rc<SyntaxTree>,
|
||||
lines: Rc<Lines>,
|
||||
|
|
@ -641,7 +654,7 @@ pub struct Semantics {
|
|||
}
|
||||
|
||||
impl Semantics {
|
||||
pub fn new(source: Rc<str>, tree: Rc<SyntaxTree>, lines: Rc<Lines>) -> Self {
|
||||
pub fn new(file: Rc<str>, source: Rc<str>, tree: Rc<SyntaxTree>, lines: Rc<Lines>) -> Self {
|
||||
let mut logical_parents = vec![None; tree.len()];
|
||||
if let Some(root) = tree.root() {
|
||||
set_logical_parents(&mut logical_parents, &tree, root, None);
|
||||
|
|
@ -650,6 +663,7 @@ impl Semantics {
|
|||
let root_environment = Environment::new(None, Location::Module);
|
||||
|
||||
let mut semantics = Semantics {
|
||||
file,
|
||||
source,
|
||||
syntax_tree: tree.clone(),
|
||||
lines,
|
||||
|
|
@ -730,9 +744,12 @@ impl Semantics {
|
|||
{
|
||||
let start = self.lines.position(start);
|
||||
let end = self.lines.position(end);
|
||||
self.errors
|
||||
.borrow_mut()
|
||||
.push(Error::new_spanned(start, end, error.to_string()));
|
||||
self.errors.borrow_mut().push(Error::new_spanned(
|
||||
self.file.clone(),
|
||||
start,
|
||||
end,
|
||||
error.to_string(),
|
||||
));
|
||||
}
|
||||
|
||||
fn report_error_tree<T>(&self, tree: &Tree, error: T)
|
||||
|
|
@ -2801,7 +2818,7 @@ mod tests {
|
|||
pub fn ice() {
|
||||
let source: Rc<str> = "1+1".into();
|
||||
let (tree, lines) = parse(&source);
|
||||
let semantics = Semantics::new(source, tree.clone(), lines);
|
||||
let semantics = Semantics::new("__test__".into(), source, tree.clone(), lines);
|
||||
semantics.internal_compiler_error(tree.root(), "oh no");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ fun wrong() {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 7:4: cannot assign a value of type 'string' to type 'f64'
|
||||
// | 8:4: cannot assign a value of type 'f64' to type 'string'
|
||||
// | 11:4: cannot assign a value of type 'f64' to type 'string'
|
||||
// | 13:2: cannot assign a new value to a function declaration
|
||||
// | __test__:7:4: cannot assign a value of type 'string' to type 'f64'
|
||||
// | __test__:8:4: cannot assign a value of type 'f64' to type 'string'
|
||||
// | __test__:11:4: cannot assign a value of type 'f64' to type 'string'
|
||||
// | __test__:13:2: cannot assign a new value to a function declaration
|
||||
|
|
|
|||
|
|
@ -4,4 +4,4 @@ fun test() {
|
|||
|
||||
// NOTE: These errors should be better
|
||||
// @expect-errors:
|
||||
// | 2:10: Error at 'true': expected a block after `if`
|
||||
// | __test__:2:10: Error at 'true': expected a block after `if`
|
||||
|
|
|
|||
|
|
@ -5,4 +5,4 @@ fun test() -> f64 {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 4:6: cannot apply binary operator '+' to expressions of type 'class Foo' (on the left) and 'f64' (on the right)
|
||||
// | __test__:4:6: cannot apply binary operator '+' to expressions of type 'class Foo' (on the left) and 'f64' (on the right)
|
||||
|
|
@ -4,4 +4,4 @@ class Foo {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 3:2: duplicate definition of field 'x'
|
||||
// | __test__:3:2: duplicate definition of field 'x'
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ fun test() {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 7:12: missing an initializer for field y
|
||||
// | 8:12: missing an initializer for field x
|
||||
// | 9:41: Point instance does not have a field named z
|
||||
// | 10:32: field x is of type f64, but this expression generates a string
|
||||
// | 12:32: cannot find value x here
|
||||
// | 15:31: field x is of type f64, but this expression generates a string
|
||||
// | __test__:7:12: missing an initializer for field y
|
||||
// | __test__:8:12: missing an initializer for field x
|
||||
// | __test__:9:41: Point instance does not have a field named z
|
||||
// | __test__:10:32: field x is of type f64, but this expression generates a string
|
||||
// | __test__:12:32: cannot find value x here
|
||||
// | __test__:15:31: field x is of type f64, but this expression generates a string
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
fun something(x: f64, x: f64) {}
|
||||
|
||||
// @expect-errors:
|
||||
// | 1:22: duplicate definition of parameter 'x'
|
||||
// | __test__:1:22: duplicate definition of parameter 'x'
|
||||
|
|
|
|||
|
|
@ -11,6 +11,6 @@ class Bar {}
|
|||
class Bar {}
|
||||
|
||||
// @expect-errors:
|
||||
// | 3:2: duplicate definition of function 'foo'
|
||||
// | 8:0: duplicate definition of function 'nested'
|
||||
// | 11:0: duplicate definition of class 'Bar'
|
||||
// | __test__:3:2: duplicate definition of function 'foo'
|
||||
// | __test__:8:0: duplicate definition of function 'nested'
|
||||
// | __test__:11:0: duplicate definition of class 'Bar'
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
if 23 { "what" } else { "the" }
|
||||
|
||||
// @expect-errors:
|
||||
// | 1:3: this condition produces 'f64', but must produce bool
|
||||
// | __test__:1:3: this condition produces 'f64', but must produce bool
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
if (if false { true }) { 32 } else { 23 }
|
||||
|
||||
// @expect-errors:
|
||||
// | 1:3: this condition produces 'nothing or bool', but must produce bool
|
||||
// | __test__:1:3: this condition produces 'nothing or bool', but must produce bool
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@ fun foo() -> f64 {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 8:2: cannot find value y here
|
||||
// | __test__:8:2: cannot find value y here
|
||||
|
|
@ -8,4 +8,4 @@ fun test() {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 7:6: methods cannot be assigned to variables
|
||||
// | __test__:7:6: methods cannot be assigned to variables
|
||||
|
|
|
|||
|
|
@ -6,4 +6,4 @@ fun test() -> f64 {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 3:4: callers of this function expect a value of type 'f64' but this statement returns a value of type 'string'
|
||||
// | __test__:3:4: callers of this function expect a value of type 'f64' but this statement returns a value of type 'string'
|
||||
|
|
@ -3,4 +3,4 @@ fun test() {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 2:8: this condition produces 'f64', but must produce bool
|
||||
// | __test__:2:8: this condition produces 'f64', but must produce bool
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@ fun test() {
|
|||
}
|
||||
|
||||
// @expect-errors:
|
||||
// | 7:12: Error at '{': expected an identifier after a '.' in member access
|
||||
// | 7:26: cannot find value foo here
|
||||
// | __test__:7:12: Error at '{': expected an identifier after a '.' in member access
|
||||
// | __test__:7:26: cannot find value foo here
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue