cxx_build/syntax/
resolve.rs1use 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}