diff options
Diffstat (limited to 'syntax/resolve.rs')
-rw-r--r-- | syntax/resolve.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/syntax/resolve.rs b/syntax/resolve.rs new file mode 100644 index 00000000..3a2635bd --- /dev/null +++ b/syntax/resolve.rs @@ -0,0 +1,46 @@ +use crate::syntax::instantiate::NamedImplKey; +use crate::syntax::{Lifetimes, NamedType, Pair, Types}; +use proc_macro2::Ident; + +#[derive(Copy, Clone)] +pub struct Resolution<'a> { + pub name: &'a Pair, + pub generics: &'a Lifetimes, +} + +impl<'a> Types<'a> { + pub fn resolve(&self, ident: &impl UnresolvedName) -> Resolution<'a> { + let ident = ident.ident(); + match self.try_resolve(ident) { + Some(resolution) => resolution, + None => panic!("Unable to resolve type `{}`", ident), + } + } + + pub fn try_resolve(&self, ident: &impl UnresolvedName) -> Option<Resolution<'a>> { + let ident = ident.ident(); + self.resolutions.get(ident).copied() + } +} + +pub trait UnresolvedName { + fn ident(&self) -> &Ident; +} + +impl UnresolvedName for Ident { + fn ident(&self) -> &Ident { + self + } +} + +impl UnresolvedName for NamedType { + fn ident(&self) -> &Ident { + &self.rust + } +} + +impl<'a> UnresolvedName for NamedImplKey<'a> { + fn ident(&self) -> &Ident { + self.rust + } +} |