use mago_word::Word;
use mago_word::WordMap;
use mago_word::WordSet;
use crate::ttype::template::GenericTemplate;
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeResolutionContext {
template_definitions: WordMap<Vec<GenericTemplate>>,
type_aliases: WordSet,
imported_type_aliases: WordMap<(Word, Word)>,
}
impl Default for TypeResolutionContext {
fn default() -> Self {
Self::new()
}
}
impl TypeResolutionContext {
#[must_use]
pub fn new() -> Self {
Self {
template_definitions: WordMap::default(),
type_aliases: WordSet::default(),
imported_type_aliases: WordMap::default(),
}
}
#[inline]
#[must_use]
pub fn is_empty(&self) -> bool {
self.template_definitions.is_empty() && self.type_aliases.is_empty() && self.imported_type_aliases.is_empty()
}
#[must_use]
pub fn with_template_definition(mut self, name: Word, constraints: Vec<GenericTemplate>) -> Self {
self.template_definitions.insert(name, constraints);
self
}
#[inline]
pub fn get_template_definitions_mut(&mut self) -> &mut WordMap<Vec<GenericTemplate>> {
&mut self.template_definitions
}
#[must_use]
pub fn get_template_definition(&self, name: Word) -> Option<&Vec<GenericTemplate>> {
self.template_definitions.get(&name)
}
#[must_use]
pub fn has_template_definition(&self, name: Word) -> bool {
self.template_definitions.contains_key(&name)
}
#[must_use]
pub fn with_type_aliases(mut self, aliases: WordSet) -> Self {
self.type_aliases = aliases;
self
}
#[must_use]
pub fn with_type_alias(mut self, name: Word) -> Self {
self.type_aliases.insert(name);
self
}
#[must_use]
pub fn has_type_alias(&self, name: Word) -> bool {
self.type_aliases.contains(&name)
}
#[must_use]
pub fn with_imported_type_alias(mut self, local_name: Word, source_class: Word, original_name: Word) -> Self {
self.imported_type_aliases.insert(local_name, (source_class, original_name));
self
}
#[must_use]
pub fn get_imported_type_alias(&self, name: Word) -> Option<&(Word, Word)> {
self.imported_type_aliases.get(&name)
}
}