use crate::ast::*; use crate::checker_state::{CheckerError, CheckerState}; use tracing::{debug, instrument}; impl Programme { pub fn check(&self) -> Result<(), CheckerError> { let mut state = CheckerState::default(); state.check(self) } } impl CheckerState { #[instrument(skip(self, prog), level = "debug")] pub fn check(&mut self, prog: &Programme) -> Result<(), CheckerError> { let Programme(decls) = prog; for decl in decls { debug!(%self, %decl); match decl { Decl::Set { name, set } => { self.assert_unbound_set(name)?; let set = self.check_set(set.clone())?; self.add_set(name.clone(), set.into()) } Decl::Element { name, element, set } => { self.assert_unbound_element(name)?; let set = self.check_set(set.clone())?; let element = self.check_element(element.clone().into(), &set)?; self.add_element(name.clone(), element.into(), set) } Decl::Signature { name, signature } => { self.assert_unbound_signature(name)?; let signature = self.check_signature(signature.clone())?; self.add_signature(name, signature) } Decl::Instance { name, .. } => { self.assert_unbound_instance(name)?; return Err(CheckerError::Unimplemented("instances".to_string())); } }?; } debug!(%self); Ok(()) } }