[fine] Let binding
This commit is contained in:
parent
e5ac1b2718
commit
f9c7591154
2 changed files with 86 additions and 21 deletions
|
|
@ -1,4 +1,4 @@
|
|||
use fine::parser::SyntaxTree;
|
||||
use fine::parser::{SyntaxTree, TreeRef};
|
||||
use fine::semantics::{Semantics, Type};
|
||||
use fine::tokens::Lines;
|
||||
use pretty_assertions::assert_eq;
|
||||
|
|
@ -85,7 +85,7 @@ fn assert_concrete(tree: &SyntaxTree, expected: &str, source_path: &str) {
|
|||
}
|
||||
}
|
||||
|
||||
fn report_semantic_error(semantics: &Semantics, message: &str) {
|
||||
fn report_semantic_error(semantics: &Semantics, tr: Option<TreeRef>, message: &str) {
|
||||
let tree = semantics.tree();
|
||||
|
||||
println!("{message}! Parsed the tree as:");
|
||||
|
|
@ -105,33 +105,52 @@ fn report_semantic_error(semantics: &Semantics, message: &str) {
|
|||
}
|
||||
println!();
|
||||
}
|
||||
|
||||
if let Some(tr) = tr {
|
||||
println!("The logical parent chain of the tree was:\n");
|
||||
let mut current = Some(tr);
|
||||
while let Some(c) = current {
|
||||
let t = &tree[c];
|
||||
println!(" {:?} [{}-{})", t.kind, t.start_pos, t.end_pos);
|
||||
current = semantics.logical_parent(c);
|
||||
}
|
||||
println!("\nThe environment of the tree was:");
|
||||
let mut environment = Some(semantics.environment_of(tr));
|
||||
while let Some(env) = environment {
|
||||
for (k, v) in env.declarations.iter() {
|
||||
println!(" {k}: {:?}", v.declaration_type);
|
||||
}
|
||||
environment = env.parent.clone();
|
||||
}
|
||||
println!();
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! semantic_panic {
|
||||
($semantics:expr, $($t:tt)*) => {{
|
||||
($semantics:expr, $tr:expr, $($t:tt)*) => {{
|
||||
let message = format!($($t)*);
|
||||
report_semantic_error($semantics, &message);
|
||||
report_semantic_error($semantics, $tr, &message);
|
||||
panic!("{message}");
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! semantic_assert {
|
||||
($semantics:expr, $pred:expr, $($t:tt)*) => {{
|
||||
($semantics:expr, $tr:expr, $pred:expr, $($t:tt)*) => {{
|
||||
if !$pred {
|
||||
let message = format!($($t)*);
|
||||
report_semantic_error($semantics, &message);
|
||||
report_semantic_error($semantics, $tr, &message);
|
||||
panic!("{message}");
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! semantic_assert_eq {
|
||||
($semantics:expr, $left:expr, $right:expr, $($t:tt)*) => {{
|
||||
($semantics:expr, $tr:expr, $left:expr, $right:expr, $($t:tt)*) => {{
|
||||
let ll = $left;
|
||||
let rr = $right;
|
||||
if ll != rr {
|
||||
let message = format!($($t)*);
|
||||
report_semantic_error($semantics, &message);
|
||||
report_semantic_error($semantics, $tr, &message);
|
||||
assert_eq!(ll, rr, "{}", message);
|
||||
}
|
||||
}};
|
||||
|
|
@ -147,13 +166,18 @@ fn assert_type_at(
|
|||
let semantics = Semantics::new(tree, lines);
|
||||
let tree_ref = match tree.find_tree_at(pos) {
|
||||
Some(t) => t,
|
||||
None => semantic_panic!(&semantics, "Unable to find the subtee at position {pos}"),
|
||||
None => semantic_panic!(
|
||||
&semantics,
|
||||
None,
|
||||
"Unable to find the subtee at position {pos}"
|
||||
),
|
||||
};
|
||||
|
||||
let tree_type = semantics.type_of(tree_ref);
|
||||
let actual = format!("{}", tree_type.unwrap_or(Type::Error));
|
||||
semantic_assert_eq!(
|
||||
&semantics,
|
||||
Some(tree_ref),
|
||||
expected,
|
||||
actual,
|
||||
"The type of the tree at position {pos} was incorrect"
|
||||
|
|
@ -170,12 +194,17 @@ fn assert_type_error_at(
|
|||
let semantics = Semantics::new(tree, lines);
|
||||
let tree_ref = match tree.find_tree_at(pos) {
|
||||
Some(t) => t,
|
||||
None => semantic_panic!(&semantics, "Unable to find the subtee at position {pos}"),
|
||||
None => semantic_panic!(
|
||||
&semantics,
|
||||
None,
|
||||
"Unable to find the subtee at position {pos}"
|
||||
),
|
||||
};
|
||||
|
||||
let tree_type = semantics.type_of(tree_ref);
|
||||
semantic_assert!(
|
||||
&semantics,
|
||||
Some(tree_ref),
|
||||
matches!(tree_type, Some(Type::Error)),
|
||||
"The type of the {:?} tree at position {pos} was '{tree_type:?}', not an error",
|
||||
tree[tree_ref].kind
|
||||
|
|
@ -184,6 +213,7 @@ fn assert_type_error_at(
|
|||
let errors = semantics.snapshot_errors();
|
||||
semantic_assert!(
|
||||
&semantics,
|
||||
Some(tree_ref),
|
||||
errors.iter().any(|e| e.message == expected),
|
||||
"Unable to find the expected error message '{expected}'"
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue