Make sure that there are no unresolved types left over and the end of pass.
This commit is contained in:
parent
1aeeda93fe
commit
fc5a796321
5 changed files with 31 additions and 1 deletions
|
@ -329,6 +329,10 @@ impl Context {
|
|||
Context::new("Test context")
|
||||
}
|
||||
|
||||
pub fn types(&self) -> Vec<&Ty> {
|
||||
self.types.iter().collect()
|
||||
}
|
||||
|
||||
/// Create a type variable of unknown type.
|
||||
///
|
||||
/// Unresolved types should be removed by typechecking and any remaining
|
||||
|
|
|
@ -50,4 +50,5 @@ pub enum ErrorKind {
|
|||
UnknownVariable,
|
||||
InconsistentBranchTypes,
|
||||
TypeInferenceFailure,
|
||||
UnknownType,
|
||||
}
|
||||
|
|
|
@ -3,4 +3,5 @@ pub mod clause_return_types;
|
|||
pub mod desugar_infix;
|
||||
pub mod desugar_unary;
|
||||
pub mod infix_folding;
|
||||
pub mod no_unresolved_types_remaining;
|
||||
pub mod unary_folding;
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
use crate::context::Context;
|
||||
use crate::error::ErrorKind;
|
||||
|
||||
pub fn pass(context: &mut Context) {
|
||||
let mut unresolved_types = Vec::default();
|
||||
let all_types = context.types();
|
||||
for (idx, ty) in all_types.iter().enumerate() {
|
||||
if ty.is_unresolved() {
|
||||
let name = match ty.name() {
|
||||
Some(name_idx) => context.get_string(name_idx).unwrap().to_string(),
|
||||
None => format!("T{:0>4}", idx),
|
||||
};
|
||||
let message = format!("Unable to resolve type {}", name);
|
||||
let location = ty.get_location().unwrap().clone();
|
||||
unresolved_types.push((message, location));
|
||||
}
|
||||
}
|
||||
for (message, location) in unresolved_types {
|
||||
context.compile_error(&message, location, ErrorKind::UnknownType);
|
||||
}
|
||||
}
|
|
@ -16,7 +16,8 @@ use huia_parser::ast::Term;
|
|||
use std::fs;
|
||||
|
||||
pub fn compile_file(path: &str) -> Context {
|
||||
let contents = fs::read_to_string(path).expect("Unable to open file");
|
||||
let contents = fs::read_to_string(path)
|
||||
.unwrap_or_else(|e| panic!("Unable to open file '{}': {}", path, e));
|
||||
let terms = Term::file(&contents).expect("Unable to parse file");
|
||||
let mut context = Context::new(path);
|
||||
let mut builder = ir::builder::Builder::default();
|
||||
|
@ -42,5 +43,7 @@ pub fn compile_file(path: &str) -> Context {
|
|||
improvements::clause_return_types::pass(&mut method, &mut context);
|
||||
});
|
||||
|
||||
improvements::no_unresolved_types_remaining::pass(&mut context);
|
||||
|
||||
context
|
||||
}
|
||||
|
|
Reference in a new issue