ferment-sys 0.2.14

Syntax tree morphing of FFI-compatible stuff
Documentation
use std::collections::HashMap;
use indexmap::IndexMap;
use proc_macro2::Ident;
use syn::{ItemTrait, Path,};
use crate::composable::TraitModelPart1;
use crate::context::ScopeChain;
use crate::kind::ObjectKind;

#[derive(Clone, Default)]
pub struct TraitsResolver {
    pub inner: IndexMap<ScopeChain, IndexMap<Ident, TraitModelPart1>>,
    pub used_traits_dictionary: HashMap<ScopeChain, Vec<Path>>,
}

impl TraitsResolver {
    pub fn add_trait(&mut self, scope: &ScopeChain, item_trait: &ItemTrait, _itself: &ObjectKind) {
        self.inner
            .entry(scope.clone())
            .or_default()
            .insert(item_trait.ident.clone(), TraitModelPart1::new(item_trait.clone()));
    }

    pub fn add_used_traits(&mut self, scope: &ScopeChain, trait_names: Vec<Path>) {
        self.used_traits_dictionary
            .entry(scope.clone())
            .or_default()
            .extend(trait_names);
    }

    pub fn item_trait_with_ident_for(&self, ident: &Ident, scope: &ScopeChain) -> Option<&TraitModelPart1> {
        self.inner
            .get(scope)
            .and_then(|dict| dict.get(ident))
    }

}