Make sure that every decl has a definition at the end of type checking
This commit is contained in:
committed by
Chris Fallin
parent
d2bd07c246
commit
0e082e8d6f
@@ -269,6 +269,10 @@ impl Term {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_declared(&self) -> bool {
|
||||||
|
matches!(self.kind, TermKind::Declared)
|
||||||
|
}
|
||||||
|
|
||||||
/// Is this term external?
|
/// Is this term external?
|
||||||
pub fn is_external(&self) -> bool {
|
pub fn is_external(&self) -> bool {
|
||||||
match &self.kind {
|
match &self.kind {
|
||||||
@@ -680,6 +684,7 @@ impl TermEnv {
|
|||||||
env.collect_extractor_templates(tyenv, defs);
|
env.collect_extractor_templates(tyenv, defs);
|
||||||
tyenv.return_errors()?;
|
tyenv.return_errors()?;
|
||||||
env.collect_rules(tyenv, defs);
|
env.collect_rules(tyenv, defs);
|
||||||
|
env.check_for_undefined_decls(tyenv, defs);
|
||||||
tyenv.return_errors()?;
|
tyenv.return_errors()?;
|
||||||
|
|
||||||
Ok(env)
|
Ok(env)
|
||||||
@@ -1012,6 +1017,24 @@ impl TermEnv {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_for_undefined_decls(&self, tyenv: &mut TypeEnv, defs: &ast::Defs) {
|
||||||
|
for def in &defs.defs {
|
||||||
|
if let ast::Def::Decl(decl) = def {
|
||||||
|
let sym = tyenv.intern_mut(&decl.term);
|
||||||
|
let term = self.term_map[&sym];
|
||||||
|
if self.terms[term.index()].is_declared() {
|
||||||
|
tyenv.report_error(
|
||||||
|
decl.pos,
|
||||||
|
format!(
|
||||||
|
"no rules, extractor, or external definition for declaration '{}'",
|
||||||
|
decl.term.0
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn translate_pattern(
|
fn translate_pattern(
|
||||||
&self,
|
&self,
|
||||||
tyenv: &mut TypeEnv,
|
tyenv: &mut TypeEnv,
|
||||||
|
|||||||
Reference in New Issue
Block a user