telety_impl/visitor/
decrateify.rs

1use proc_macro2::Span;
2use syn::{Ident, PathArguments, PathSegment, UseTree};
3
4use super::calling_crate;
5
6pub struct Decrateify(PathSegment);
7
8impl Decrateify {
9    pub fn new() -> Self {
10        Self::new_as_crate(calling_crate(Span::call_site()))
11    }
12
13    pub fn new_as_crate(crate_ident: Ident) -> Self {
14        Self(PathSegment {
15            ident: crate_ident,
16            arguments: PathArguments::None,
17        })
18    }
19}
20
21impl Default for Decrateify {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl directed_visit::syn::visit::FullMut for Decrateify {
28    fn visit_path_mut<D>(visitor: directed_visit::Visitor<'_, D, Self>, node: &mut syn::Path)
29    where
30        D: directed_visit::DirectMut<Self, syn::Path> + ?Sized,
31    {
32        if let Some(first_segment) = node.segments.first_mut()
33            && first_segment.ident == "crate"
34        {
35            let mut segment = visitor.0.clone();
36            segment.ident.set_span(first_segment.ident.span());
37            *first_segment = segment;
38            node.leading_colon = Some(Default::default());
39        }
40
41        directed_visit::Visitor::visit_mut(visitor, node);
42    }
43
44    fn visit_item_use_mut<D>(visitor: directed_visit::Visitor<'_, D, Self>, node: &mut syn::ItemUse)
45    where
46        D: directed_visit::DirectMut<Self, syn::ItemUse> + ?Sized,
47    {
48        if let UseTree::Path(path) = &mut node.tree
49            && path.ident == "crate"
50        {
51            let mut ident = visitor.0.ident.clone();
52            ident.set_span(path.ident.span());
53            path.ident = ident;
54            node.leading_colon = Some(Default::default());
55        }
56
57        directed_visit::Visitor::visit_mut(visitor, node);
58    }
59}