aboutsummaryrefslogtreecommitdiff
path: root/syntax/resolve.rs
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/resolve.rs')
-rw-r--r--syntax/resolve.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/syntax/resolve.rs b/syntax/resolve.rs
new file mode 100644
index 00000000..3a2635bd
--- /dev/null
+++ b/syntax/resolve.rs
@@ -0,0 +1,46 @@
+use crate::syntax::instantiate::NamedImplKey;
+use crate::syntax::{Lifetimes, NamedType, Pair, Types};
+use proc_macro2::Ident;
+
+#[derive(Copy, Clone)]
+pub struct Resolution<'a> {
+ pub name: &'a Pair,
+ pub generics: &'a Lifetimes,
+}
+
+impl<'a> Types<'a> {
+ pub fn resolve(&self, ident: &impl UnresolvedName) -> Resolution<'a> {
+ let ident = ident.ident();
+ match self.try_resolve(ident) {
+ Some(resolution) => resolution,
+ None => panic!("Unable to resolve type `{}`", ident),
+ }
+ }
+
+ pub fn try_resolve(&self, ident: &impl UnresolvedName) -> Option<Resolution<'a>> {
+ let ident = ident.ident();
+ self.resolutions.get(ident).copied()
+ }
+}
+
+pub trait UnresolvedName {
+ fn ident(&self) -> &Ident;
+}
+
+impl UnresolvedName for Ident {
+ fn ident(&self) -> &Ident {
+ self
+ }
+}
+
+impl UnresolvedName for NamedType {
+ fn ident(&self) -> &Ident {
+ &self.rust
+ }
+}
+
+impl<'a> UnresolvedName for NamedImplKey<'a> {
+ fn ident(&self) -> &Ident {
+ self.rust
+ }
+}