[fine] Error checking for some cases

This commit is contained in:
John Doty 2024-01-20 11:13:22 -08:00
parent 4505996710
commit d0b74db715
2 changed files with 33 additions and 2 deletions

View file

@ -1375,7 +1375,14 @@ impl<'a> Semantics<'a> {
// Form 2: { x, ... }
let environment = self.environment_of(t);
let id = tree.nth_token(0)?;
match environment.bind(id)? {
let declaration = match environment.bind(id) {
Some(d) => d,
None => {
self.report_error_tree(tree, format!("cannot find value {id} here"));
return Some(Type::Error);
}
};
match declaration {
Declaration::Variable {
declaration_type, ..
}
@ -1662,7 +1669,7 @@ fn check_new_object_expression(s: &Semantics, tree: &Tree) {
s.report_error_tree_ref(
*field_tree,
format!(
"field {} has is of type {}, but this expression generates a {}",
"field {} is of type {}, but this expression generates a {}",
f.name, f.field_type, expr_type,
),
);

View file

@ -0,0 +1,24 @@
class Point {
x: f64;
y: f64;
}
fun test() {
let one = new Point { x: 23 };
let two = new Point { y: 23 };
let three = new Point { y: 23, x: 123, z: "hello" };
let four = new Point { y: 23, x: "what" };
let five = new Point { y: 23, x };
let x = "now";
let six = new Point { y: 23, x };
}
// @expect-errors:
// | 7:12: missing an initializer for field y
// | 8:12: missing an initializer for field x
// | 9:41: class Point 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