blob: 757b78f425076c578248c051ec9204d67fde8d58 [file] [log] [blame]
David Tolnayfedc63b2021-03-27 00:19:13 -04001use crate::syntax::instantiate::NamedImplKey;
David Tolnay1e5fe232021-01-01 18:11:40 -08002use crate::syntax::{Lifetimes, NamedType, Pair, Types};
David Tolnay3abed472020-12-31 23:34:53 -08003use proc_macro2::Ident;
4
David Tolnay1e5fe232021-01-01 18:11:40 -08005#[derive(Copy, Clone)]
6pub struct Resolution<'a> {
7 pub name: &'a Pair,
8 pub generics: &'a Lifetimes,
9}
10
David Tolnay3abed472020-12-31 23:34:53 -080011impl<'a> Types<'a> {
David Tolnay1e5fe232021-01-01 18:11:40 -080012 pub fn resolve(&self, ident: &impl UnresolvedName) -> Resolution<'a> {
David Tolnay5f5602c2021-03-28 03:58:06 -040013 let ident = ident.ident();
14 match self.resolutions.get(ident) {
15 Some(resolution) => *resolution,
16 None => panic!("Unable to resolve type `{}`", ident),
17 }
David Tolnay3abed472020-12-31 23:34:53 -080018 }
19}
20
21pub trait UnresolvedName {
22 fn ident(&self) -> &Ident;
23}
24
25impl UnresolvedName for Ident {
26 fn ident(&self) -> &Ident {
27 self
28 }
29}
30
31impl UnresolvedName for NamedType {
32 fn ident(&self) -> &Ident {
33 &self.rust
34 }
35}
David Tolnayfedc63b2021-03-27 00:19:13 -040036
37impl<'a> UnresolvedName for NamedImplKey<'a> {
38 fn ident(&self) -> &Ident {
39 self.rust
40 }
41}