1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use Ident; use MakeImpl; use Module; use RuntimeType; use Type; use WipImpl; use std::cell::RefCell; use std::rc::Rc; #[derive(Clone, Copy)] pub struct Execution<'a> { pub(crate) ty: &'a Type, pub(crate) tracker: &'a Tracker, } #[derive(Debug, Clone)] pub(crate) struct Tracker { pub(crate) crates: RefCell<Vec<Ident>>, pub(crate) impls: RefCell<Vec<Rc<RefCell<WipImpl>>>>, } impl<'a> Execution<'a> { pub fn load_crate(self, name: &str) -> Module { self.tracker.load_crate(name) } pub fn make_impl<TraitType, SelfType>( self, trait_type: TraitType, self_type: SelfType, run: fn(MakeImpl), ) where TraitType: RuntimeType, SelfType: RuntimeType, { self.tracker .make_impl(trait_type.SELF(), self_type.SELF(), run); } pub fn target_type(self) -> Type { self.ty.clone() } } impl Tracker { pub(crate) fn new() -> Self { Tracker { crates: RefCell::new(Vec::new()), impls: RefCell::new(Vec::new()), } } fn load_crate(&self, name: &str) -> Module { self.crates.borrow_mut().push(Ident::new(name)); Module { global: false, path: vec![name.to_owned()], } } fn make_impl(&self, of: Type, ty: Type, run: fn(MakeImpl)) { let wip = Rc::new(RefCell::new(WipImpl { of, ty, functions: Vec::new(), })); self.impls.borrow_mut().push(wip.clone()); run(MakeImpl { wip }); } }