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
}
}