Use `GenericTypes`'s type resolver instead of re-resolving
authorMatt Corallo <git@bluematt.me>
Wed, 22 Sep 2021 06:04:50 +0000 (06:04 +0000)
committerMatt Corallo <git@bluematt.me>
Thu, 23 Sep 2021 19:30:48 +0000 (19:30 +0000)
When we resolve a type with `GenericTypes::maybe_resolve_path` it
returns a resolved-path string as well as a syn::Path. When
resolving we'd previously then re-resolve the Path with the current
type/import information, instead of just accepting what was already
resolved. Simply accepting what was already resolved not only
simplifies a few cases, but also allows us to clean up where the
"crate::" prefix is printed, keeping "crate::" prefixes out of all
type resolution.

c-bindings-gen/src/blocks.rs
c-bindings-gen/src/types.rs

index 9c32ef153918c485cab64a1943ed49361fc2bc47..fab69f6e922f8b71e33bd804401af29f4cc01f51 100644 (file)
@@ -737,7 +737,7 @@ pub fn maybe_write_generics<W: std::io::Write>(w: &mut W, generics: &syn::Generi
                                        for bound in type_param.bounds.iter() {
                                                if let syn::TypeParamBound::Trait(trait_bound) = bound {
                                                        assert_simple_bound(&trait_bound);
-                                                       write!(w, "{}{}", if idx != 0 { ", " } else { "" }, gen_types.maybe_resolve_ident(&type_param.ident).unwrap()).unwrap();
+                                                       write!(w, "{}crate::{}", if idx != 0 { ", " } else { "" }, gen_types.maybe_resolve_ident(&type_param.ident).unwrap()).unwrap();
                                                        if printed_param {
                                                                unimplemented!("Can't print generic params that have multiple non-lifetime bounds");
                                                        }
index b4b46a833a38e65bde039fabc348c68619a0fe44..50800bb41ead1df865c57d4351fab8298378e28a 100644 (file)
@@ -205,13 +205,12 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                                        if path_matches_nongeneric(&trait_bound.path, &["core", "clone", "Clone"]) { continue; }
 
                                                        assert_simple_bound(&trait_bound);
-                                                       if let Some(mut path) = types.maybe_resolve_path(&trait_bound.path, None) {
+                                                       if let Some(path) = types.maybe_resolve_path(&trait_bound.path, None) {
                                                                if types.skip_path(&path) { continue; }
                                                                if path == "Sized" { continue; }
                                                                if non_lifetimes_processed { return false; }
                                                                non_lifetimes_processed = true;
                                                                let new_ident = if path != "std::ops::Deref" && path != "core::ops::Deref" {
-                                                                       path = "crate::".to_string() + &path;
                                                                        Some(&trait_bound.path)
                                                                } else if trait_bound.path.segments.len() == 1 {
                                                                        // If we're templated on Deref<Target = ConcreteThing>, store
@@ -267,7 +266,7 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                                                        if non_lifetimes_processed { return false; }
                                                                        non_lifetimes_processed = true;
                                                                        assert_simple_bound(&trait_bound);
-                                                                       *gen = ("crate::".to_string() + &types.resolve_path(&trait_bound.path, None),
+                                                                       *gen = (types.resolve_path(&trait_bound.path, None),
                                                                                Some(&trait_bound.path));
                                                                }
                                                        }
@@ -292,14 +291,13 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                        match bounds_iter.next().unwrap() {
                                                syn::TypeParamBound::Trait(tr) => {
                                                        assert_simple_bound(&tr);
-                                                       if let Some(mut path) = types.maybe_resolve_path(&tr.path, None) {
+                                                       if let Some(path) = types.maybe_resolve_path(&tr.path, None) {
                                                                if types.skip_path(&path) { continue; }
                                                                // In general we handle Deref<Target=X> as if it were just X (and
                                                                // implement Deref<Target=Self> for relevant types). We don't
                                                                // bother to implement it for associated types, however, so we just
                                                                // ignore such bounds.
                                                                let new_ident = if path != "std::ops::Deref" && path != "core::ops::Deref" {
-                                                                       path = "crate::".to_string() + &path;
                                                                        Some(&tr.path)
                                                                } else { None };
                                                                self.typed_generics.insert(&t.ident, (path, new_ident));
@@ -581,12 +579,12 @@ impl<'mod_lifetime, 'crate_lft: 'mod_lifetime> ImportResolver<'mod_lifetime, 'cr
                } else { None }
        }
 
-       pub fn maybe_resolve_path(&self, p_arg: &syn::Path, generics: Option<&GenericTypes>) -> Option<String> {
-               let p = if let Some(gen_types) = generics {
-                       if let Some((_, synpath)) = gen_types.maybe_resolve_path(p_arg) {
-                               synpath
-                       } else { p_arg }
-               } else { p_arg };
+       pub fn maybe_resolve_path(&self, p: &syn::Path, generics: Option<&GenericTypes>) -> Option<String> {
+               if let Some(gen_types) = generics {
+                       if let Some((resp, _)) = gen_types.maybe_resolve_path(p) {
+                               return Some(resp.clone());
+                       }
+               }
 
                if p.leading_colon.is_some() {
                        let mut res: String = p.segments.iter().enumerate().map(|(idx, seg)| {