blob: 3a2635bd3d1943522420d4df1b95e925c8c9c6b8 [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();
David Tolnay06ef96f2021-03-28 04:06:48 -040014 match self.try_resolve(ident) {
15 Some(resolution) => resolution,
David Tolnay5f5602c2021-03-28 03:58:06 -040016 None => panic!("Unable to resolve type `{}`", ident),
17 }
David Tolnay3abed472020-12-31 23:34:53 -080018 }
David Tolnay06ef96f2021-03-28 04:06:48 -040019
20 pub fn try_resolve(&self, ident: &impl UnresolvedName) -> Option<Resolution<'a>> {
21 let ident = ident.ident();
22 self.resolutions.get(ident).copied()
23 }
David Tolnay3abed472020-12-31 23:34:53 -080024}
25
26pub trait UnresolvedName {
27 fn ident(&self) -> &Ident;
28}
29
30impl UnresolvedName for Ident {
31 fn ident(&self) -> &Ident {
32 self
33 }
34}
35
36impl UnresolvedName for NamedType {
37 fn ident(&self) -> &Ident {
38 &self.rust
39 }
40}
David Tolnayfedc63b2021-03-27 00:19:13 -040041
42impl<'a> UnresolvedName for NamedImplKey<'a> {
43 fn ident(&self) -> &Ident {
44 self.rust
45 }
46}