Refine type error reporting for readability

The `display_compact` method on `StaticType` has been enhanced to
provide more concise representations of types within error messages.
This change aims to improve the clarity of type-related diagnostics
generated by the compiler.
This commit is contained in:
2026-03-30 11:45:31 +02:00
parent 8aa2a67b5b
commit c403c80f5b
2 changed files with 6 additions and 6 deletions
+5 -5
View File
@@ -307,7 +307,7 @@ impl TypeChecker {
(a, b) if a == b => {}
(StaticType::TypeVar(n), ty) | (ty, StaticType::TypeVar(n)) => {
if Self::occurs(n, &ty, &subst) {
diag.push_error(format!("Infinite type: ?{} = {}", n, ty), None);
diag.push_error(format!("Infinite type: ?{} = {}", n, ty.display_compact()), None);
return;
}
// Release the borrow before routing through bind_var so that
@@ -369,7 +369,7 @@ impl TypeChecker {
self.unify(*body, other, diag);
}
(a, b) => {
diag.push_error(format!("Type mismatch: expected {}, got {}", a, b), None);
diag.push_error(format!("Type mismatch: expected {}, got {}", a.display_compact(), b.display_compact()), None);
}
}
}
@@ -1000,7 +1000,7 @@ impl TypeChecker {
diag.push_error(
format!(
"Cannot destructure type {} as a tuple/vector",
specialized_ty
specialized_ty.display_compact()
),
Some(node.identity.clone()),
);
@@ -1194,7 +1194,7 @@ impl TypeChecker {
format!(
"Cannot access field :{} on non-record type {}",
field.name(),
rec_typed.ty
rec_typed.ty.display_compact()
),
Some(rec_typed.identity.clone()),
);
@@ -1519,7 +1519,7 @@ impl TypeChecker {
diag.push_error(
format!(
"Type mismatch in 'again' call: expected {}, but got {}",
expected_ty, args_typed.ty
expected_ty.display_compact(), args_typed.ty.display_compact()
),
Some(node.identity.clone()),
);
+1 -1
View File
@@ -498,7 +498,7 @@ impl StaticType {
/// Abbreviates verbose types like records to keep diagnostics readable.
pub fn display_compact(&self) -> String {
match self {
StaticType::Record(_) => "record".to_string(),
StaticType::Record(_) => "<record>".to_string(),
StaticType::Tuple(elements) => {
let inner: Vec<String> = elements.iter().map(|e| e.display_compact()).collect();
format!("[{}]", inner.join(" "))