bend-lang 0.2.38

A high-level, massively parallel programming language
Documentation
use crate::{
  diagnostics::Diagnostics,
  fun::{Book, Ctx, Name, Term},
  maybe_grow,
};
use std::collections::HashSet;

impl Ctx<'_> {
  pub fn check_unbound_refs(&mut self) -> Result<(), Diagnostics> {
    for def in self.book.defs.values() {
      let mut unbounds = HashSet::new();
      for rule in def.rules.iter() {
        rule.body.check_unbound_refs(self.book, &mut unbounds);
      }
      for unbound in unbounds {
        self.info.add_function_error(
          format!("Reference to undefined function '{unbound}'"),
          def.name.clone(),
          def.source.clone(),
        );
      }
    }
    self.info.fatal(())
  }
}

impl Term {
  pub fn check_unbound_refs(&self, book: &Book, unbounds: &mut HashSet<Name>) {
    maybe_grow(|| {
      if let Term::Ref { nam } = self {
        if !(book.defs.contains_key(nam) || book.hvm_defs.contains_key(nam)) {
          unbounds.insert(nam.clone());
        }
      }
      for child in self.children() {
        child.check_unbound_refs(book, unbounds);
      }
    })
  }
}