1use crate::{Span, TrimmedLiteral};
2
3pub fn annotated_literals_raw(source: &str) -> impl Iterator<Item = proc_macro2::Literal> + '_ {
4 let stream = syn::parse_str::<proc_macro2::TokenStream>(source).expect("Must be valid rust");
5 stream
6 .into_iter()
7 .filter_map(|x| {
8 if let proc_macro2::TokenTree::Group(group) = x {
9 Some(group.stream().into_iter())
10 } else {
11 None
12 }
13 })
14 .flatten()
15 .filter_map(|x| {
16 if let proc_macro2::TokenTree::Literal(literal) = x {
17 Some(literal)
18 } else {
19 None
20 }
21 })
22}
23
24pub fn annotated_literals(source: &str) -> Vec<TrimmedLiteral> {
25 annotated_literals_raw(source)
26 .map(|literal| {
27 let span = Span::from(literal.span());
28 TrimmedLiteral::load_from(source, span)
29 .expect("Literals must be convertable to trimmed literals")
30 })
31 .collect()
32}