133d722a9Sopenharmony_ciuse crate::syntax::instantiate::NamedImplKey;
233d722a9Sopenharmony_ciuse crate::syntax::{Lifetimes, NamedType, Pair, Types};
333d722a9Sopenharmony_ciuse proc_macro2::Ident;
433d722a9Sopenharmony_ci
533d722a9Sopenharmony_ci#[derive(Copy, Clone)]
633d722a9Sopenharmony_cipub struct Resolution<'a> {
733d722a9Sopenharmony_ci    pub name: &'a Pair,
833d722a9Sopenharmony_ci    pub generics: &'a Lifetimes,
933d722a9Sopenharmony_ci}
1033d722a9Sopenharmony_ci
1133d722a9Sopenharmony_ciimpl<'a> Types<'a> {
1233d722a9Sopenharmony_ci    pub fn resolve(&self, ident: &impl UnresolvedName) -> Resolution<'a> {
1333d722a9Sopenharmony_ci        let ident = ident.ident();
1433d722a9Sopenharmony_ci        match self.try_resolve(ident) {
1533d722a9Sopenharmony_ci            Some(resolution) => resolution,
1633d722a9Sopenharmony_ci            None => panic!("Unable to resolve type `{}`", ident),
1733d722a9Sopenharmony_ci        }
1833d722a9Sopenharmony_ci    }
1933d722a9Sopenharmony_ci
2033d722a9Sopenharmony_ci    pub fn try_resolve(&self, ident: &impl UnresolvedName) -> Option<Resolution<'a>> {
2133d722a9Sopenharmony_ci        let ident = ident.ident();
2233d722a9Sopenharmony_ci        self.resolutions.get(ident).copied()
2333d722a9Sopenharmony_ci    }
2433d722a9Sopenharmony_ci}
2533d722a9Sopenharmony_ci
2633d722a9Sopenharmony_cipub trait UnresolvedName {
2733d722a9Sopenharmony_ci    fn ident(&self) -> &Ident;
2833d722a9Sopenharmony_ci}
2933d722a9Sopenharmony_ci
3033d722a9Sopenharmony_ciimpl UnresolvedName for Ident {
3133d722a9Sopenharmony_ci    fn ident(&self) -> &Ident {
3233d722a9Sopenharmony_ci        self
3333d722a9Sopenharmony_ci    }
3433d722a9Sopenharmony_ci}
3533d722a9Sopenharmony_ci
3633d722a9Sopenharmony_ciimpl UnresolvedName for NamedType {
3733d722a9Sopenharmony_ci    fn ident(&self) -> &Ident {
3833d722a9Sopenharmony_ci        &self.rust
3933d722a9Sopenharmony_ci    }
4033d722a9Sopenharmony_ci}
4133d722a9Sopenharmony_ci
4233d722a9Sopenharmony_ciimpl<'a> UnresolvedName for NamedImplKey<'a> {
4333d722a9Sopenharmony_ci    fn ident(&self) -> &Ident {
4433d722a9Sopenharmony_ci        self.rust
4533d722a9Sopenharmony_ci    }
4633d722a9Sopenharmony_ci}
47