TracedInject
This commit is contained in:
parent
6e5302331c
commit
a10447457a
@ -1,27 +1,12 @@
|
|||||||
use crate::rstd::{cast::*, typeless::*};
|
use crate::rstd::inject::*;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
struct TracedResolver<'a, Ctx: Context<'a>> {
|
struct TracedInject;
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> TracedResolver<'a, Ctx> {
|
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Inject<'a, Ctx> for TracedInject {
|
||||||
fn wrap(resolver: Rc<dyn Resolver<'a, Ctx>>) -> Rc<dyn Resolver<'a, Ctx>> {
|
fn inject<A: 'a>(&self, fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A> {
|
||||||
Rc::new(Self { resolver })
|
fa.after_resolution()
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Resolver<'a, Ctx> for TracedResolver<'a, Ctx> {
|
|
||||||
fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, Ctx> {
|
|
||||||
self.resolver
|
|
||||||
.clone()
|
|
||||||
.resolve_map(address, |resolved| {
|
|
||||||
let (src, resolver) = resolved?;
|
|
||||||
let delayed: Rc<dyn Resolver<'a, Ctx>> = Rc::new(TracedResolver { resolver });
|
|
||||||
Ok((src, delayed))
|
|
||||||
})
|
|
||||||
.after_resolution()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,15 +19,9 @@ pub trait Traceable<'a, Ctx: Context<'a, _Tm = TracedInstance>>:
|
|||||||
///
|
///
|
||||||
/// [^extra]: applying [`Traceable::trace`] multiple times
|
/// [^extra]: applying [`Traceable::trace`] multiple times
|
||||||
/// might affect the trace in undesireable ways
|
/// might affect the trace in undesireable ways
|
||||||
fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self>;
|
fn trace(&self) -> ParseResultA<'a, Ctx, Self> {
|
||||||
|
Rc::new(TracedInject).inject_mentionable(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A
|
impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A {}
|
||||||
where
|
|
||||||
Ctx::LookupError: From<CastError<'a>>,
|
|
||||||
{
|
|
||||||
fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self> {
|
|
||||||
let factory = self.factory();
|
|
||||||
TypelessMentionable::from_typed(self).cast_full(factory, TracedResolver::wrap)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user