1mod details;
2pub(crate) use details::Details;
3mod index;
4pub(crate) use index::Index;
5mod map;
6pub(crate) use map::Map;
7mod group;
8pub(crate) use group::Group;
9
10use syn::{
11 punctuated::Punctuated, AngleBracketedGenericArguments, GenericArgument, Generics, Ident, Path,
12 PathArguments, PathSegment, Token, Type, TypePath,
13};
14
15use crate::syn_util;
16
17#[derive(Debug, Clone, Copy)]
19pub struct Alias<'m> {
20 map: &'m Map,
21 index: Index,
22 details: &'m Details,
23}
24
25impl<'m> Alias<'m> {
26 pub(crate) fn new(map: &'m Map, index: Index, details: &'m Details) -> Self {
27 Self {
28 map,
29 index,
30 details,
31 }
32 }
33
34 #[doc(hidden)]
35 pub fn ident(&self) -> Ident {
36 self.index.ident()
37 }
38
39 pub fn parameters(&self) -> &Generics {
57 &self.details.parameters
58 }
59
60 pub fn path_segment_no_parameters(&self) -> PathSegment {
62 PathSegment {
63 ident: self.index.ident(),
64 arguments: PathArguments::None,
65 }
66 }
67
68 pub fn path_segment(&self) -> PathSegment {
71 let mut segment = self.path_segment_no_parameters();
72 segment.arguments = PathArguments::AngleBracketed(AngleBracketedGenericArguments {
73 colon2_token: None,
74 lt_token: Default::default(),
75 args: syn_util::generic_params_to_arguments(self.parameters()),
76 gt_token: Default::default(),
77 });
78 segment
79 }
80
81 pub fn aliased_type(&self) -> &Type {
83 &self.details.aliased_type
84 }
85
86 pub fn aliased_type_arguments(&self) -> Option<&Punctuated<GenericArgument, Token![,]>> {
89 if let Type::Path(type_path) = self.aliased_type() {
90 if let Some(last_segment) = type_path.path.segments.last() {
91 if let PathArguments::AngleBracketed(angle_bracketed) = &last_segment.arguments {
92 return Some(&angle_bracketed.args);
93 }
94 }
95 }
96 None
97 }
98
99 pub fn path(&self) -> Path {
101 let mut path = self.map.group().path();
102 path.segments.push(self.path_segment_no_parameters());
103 path
104 }
105
106 pub fn type_path(&self) -> TypePath {
108 let mut path = self.map.group().path();
109 path.segments.push(self.path_segment());
110 TypePath { qself: None, path }
111 }
112
113 pub fn ty(&self) -> Type {
115 Type::Path(self.type_path())
116 }
117}