1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* use proc_macro::TokenStream;
use syn::{
punctuated::Punctuated, AngleBracketedGenericArguments, GenericArgument, PathSegment, Token,
};
use crate::utils::compile_err;
use super::{angle_bracketed_or_err, type_or_err, type_path_or_err};
pub fn stringify_sgs(sgs: &Punctuated<PathSegment, Token![::]>) -> Result<String, TokenStream> {
// impossible case
// if sgs.len() == 0 {};
let mut s = String::new();
for i in 0..sgs.len() - 1 {
s.push_str(&stringify_sg(&sgs[i])?);
s.push_str("::");
}
s.push_str(&stringify_sg(&sgs[sgs.len() - 1])?);
Ok(s)
}
#[inline]
pub fn stringify_sg(sg: &PathSegment) -> Result<String, TokenStream> {
let mut s = sg.ident.to_string();
if sg.arguments.is_none() {
return Ok(s);
};
let args = angle_bracketed_or_err(&sg.arguments)?;
s.push_str(&stringify_args(args)?);
Ok(s)
}
pub fn stringify_args(args: &AngleBracketedGenericArguments) -> Result<String, TokenStream> {
if args.args.len() == 0 {
return Err(compile_err(&args, "invalid generic arguments"));
};
let mut s = String::from('<');
for i in 0..args.args.len() - 1 {
s.push_str(&stringify_arg(&args.args[i])?);
s.push(',');
}
s.push_str(&stringify_arg(&args.args[args.args.len() - 1])?);
s.push('>');
Ok(s)
}
#[inline]
pub fn stringify_arg(arg: &GenericArgument) -> Result<String, TokenStream> {
let path = &type_path_or_err(type_or_err(arg)?)?.path;
let mut s = String::new();
if path.leading_colon.is_some() {
s.push_str("::");
};
s.push_str(&stringify_sgs(&path.segments)?);
Ok(s)
}
*/