cxx_build/syntax/
resolve.rs

1use crate::syntax::attrs::OtherAttrs;
2use crate::syntax::instantiate::NamedImplKey;
3use crate::syntax::{Lifetimes, NamedType, Pair, Types};
4use proc_macro2::Ident;
5
6#[derive(Copy, Clone)]
7pub(crate) struct Resolution<'a> {
8    pub name: &'a Pair,
9    #[cfg_attr(not(proc_macro), expect(dead_code))]
10    pub attrs: &'a OtherAttrs,
11    pub generics: &'a Lifetimes,
12}
13
14impl<'a> Types<'a> {
15    pub(crate) fn resolve(&self, ident: &impl UnresolvedName) -> Resolution<'a> {
16        let ident = ident.ident();
17        match self.try_resolve(ident) {
18            Some(resolution) => resolution,
19            None => panic!("Unable to resolve type `{}`", ident),
20        }
21    }
22
23    pub(crate) fn try_resolve(&self, ident: &impl UnresolvedName) -> Option<Resolution<'a>> {
24        let ident = ident.ident();
25        self.resolutions.get(ident).copied()
26    }
27}
28
29pub(crate) trait UnresolvedName {
30    fn ident(&self) -> &Ident;
31}
32
33impl UnresolvedName for Ident {
34    fn ident(&self) -> &Ident {
35        self
36    }
37}
38
39impl UnresolvedName for NamedType {
40    fn ident(&self) -> &Ident {
41        &self.rust
42    }
43}
44
45impl<'a> UnresolvedName for NamedImplKey<'a> {
46    fn ident(&self) -> &Ident {
47        self.rust
48    }
49}