ferment-sys 0.2.14

Syntax tree morphing of FFI-compatible stuff
Documentation
use std::cell::RefCell;
use std::rc::Rc;
use syn::Attribute;
use ferment_macro::ComposerBase;
use crate::composable::{AttrsModel, GenModel, LifetimesModel};
use crate::composer::{BasicComposer, BasicComposerLink, BasicComposerOwner, ComposerLink, DocComposer, Linkable, SigComposerLink};
use crate::context::ScopeContextLink;
use crate::lang::Specification;

#[derive(ComposerBase)]
pub struct VTableComposer<SPEC>
    where SPEC: Specification + 'static {
    pub base: BasicComposerLink<SPEC, Self>,
    pub vtable_method_composers: Vec<SigComposerLink<SPEC>>,
}

impl<SPEC> VTableComposer<SPEC>
where SPEC: Specification {
    pub fn from_trait_path(
        ty_context: SPEC::TYC,
        attrs: &[Attribute],
        vtable_method_composers: Vec<SigComposerLink<SPEC>>,
        context: ScopeContextLink
    ) -> ComposerLink<Self> {
        let root = Rc::new(RefCell::new(Self {
            base: BasicComposer::from(
                DocComposer::from(&ty_context),
                AttrsModel::from(attrs),
                ty_context,
                GenModel::default(),
                LifetimesModel::default(),
                context),
            vtable_method_composers
        }));
        {
            let mut composer = root.borrow_mut();
            composer.base.link(&root);
        }
        root
    }
}