1
Fork 0

Use more accurate lifetimes

This commit is contained in:
bjorn3 2021-05-31 16:24:09 +02:00
parent 1b7ec34878
commit bddf151dea

View file

@ -88,16 +88,14 @@ fn count_nodes(krate: &ast::Crate) -> usize {
counter.count counter.count
} }
#[derive(Copy, Clone)] pub struct AccessAction(*mut dyn for<'a> FnMut(&mut Resolver<'a>));
pub struct AccessAction(*mut dyn FnMut());
impl AccessAction { impl AccessAction {
pub fn get(self) -> *mut dyn FnMut() { pub fn get(self) -> *mut dyn for<'a> FnMut(&mut Resolver<'a>) {
self.0 self.0
} }
} }
#[derive(Copy, Clone)]
pub enum Action { pub enum Action {
Initial, Initial,
Access(AccessAction), Access(AccessAction),
@ -123,7 +121,7 @@ pub struct BoxedResolver {
Box< Box<
dyn Generator< dyn Generator<
Action, Action,
Yield = YieldType<Result<ast::Crate>, fn(&mut Resolver<'_>)>, Yield = YieldType<Result<ast::Crate>, for<'a> fn(&mut Resolver<'a>)>,
Return = ResolverOutputs, Return = ResolverOutputs,
>, >,
>, >,
@ -150,16 +148,16 @@ impl BoxedResolver {
(init, BoxedResolver { generator }) (init, BoxedResolver { generator })
} }
pub fn access<F: FnOnce(&mut Resolver<'_>) -> R, R>(&mut self, f: F) -> R { pub fn access<F: for<'a> FnOnce(&mut Resolver<'a>) -> R, R>(&mut self, f: F) -> R {
// Turn the FnOnce closure into *mut dyn FnMut() // Turn the FnOnce closure into *mut dyn FnMut()
// so we can pass it in to the generator // so we can pass it in to the generator
let mut r = None; let mut r = None;
let mut f = Some(f); let mut f = Some(f);
let mut_f: &mut dyn FnMut(&mut Resolver<'_>) = &mut |resolver| { let mut_f: &mut dyn for<'a> FnMut(&mut Resolver<'a>) = &mut |resolver| {
let f = f.take().unwrap(); let f = f.take().unwrap();
r = Some(f(resolver)); r = Some(f(resolver));
}; };
let mut_f = mut_f as *mut dyn FnMut(&mut Resolver<'_>); let mut_f = mut_f as *mut dyn for<'a> FnMut(&mut Resolver<'a>);
// Get the generator to call our closure // Get the generator to call our closure
unsafe { unsafe {