intercom_common/attributes/common.rs
1use crate::prelude::*;
2
3use std::env;
4use std::iter::FromIterator;
5
6/// Resolve the name of the package being compiled.
7pub fn lib_name() -> String
8{
9 // Cargo stores the currently compiled package in the CARGO_PKG_NAME
10 // environment variable.
11 env::var("CARGO_PKG_NAME").expect(
12 "Could not resolve package name. \
13 Ensure CARGO_PKG_NAME environment variable is defined.",
14 )
15}
16
17pub fn tokens_to_tokenstream<T: IntoIterator<Item = TokenStream>>(
18 original: TokenStreamNightly,
19 tokens: T,
20) -> TokenStreamNightly
21{
22 TokenStreamNightly::from_iter(
23 std::iter::once(original).chain(tokens.into_iter().map(Into::into)),
24 )
25}
26
27// These functions are left in for debugging purposes.
28//
29// They can be swapped in for the tokens_to_tokenstreams to get a printout of
30// span information (bad vs ok) when tracking down tokens still referring to
31// call site spans and thus messing the error messages.
32/*
33extern crate proc_macro;
34pub fn tokens_to_validated_tokenstream<T: IntoIterator<Item = TokenStream>>(
35 call_site: proc_macro::Span,
36 original: TokenStreamNightly,
37 tokens: T,
38) -> TokenStreamNightly
39{
40 TokenStreamNightly::from_iter(
41 std::iter::once(original)
42 .chain(tokens.into_iter().map(|tt| do_valid(&call_site, tt.into())))
43 )
44}
45
46pub fn do_valid(
47 call_site: &proc_macro::Span,
48 ts: proc_macro::TokenStream,
49) -> proc_macro::TokenStream
50{
51 let mut v = vec![];
52 for tt in ts {
53 let s = tt.span();
54 if s.start().line == call_site.start().line &&
55 s.start().column == call_site.start().column {
56
57 eprint!("BAD: ");
58 } else {
59 eprint!("OK: ");
60 }
61 match tt {
62 proc_macro::TokenTree::Group(grp) => {
63 let (left, right) = match grp.delimiter() {
64 proc_macro::Delimiter::Parenthesis => ( "(", ")" ),
65 proc_macro::Delimiter::Brace => ( "{", "}" ),
66 proc_macro::Delimiter::Bracket => ( "[", "]" ),
67 proc_macro::Delimiter::None => ( "@", "€" ),
68 };
69 eprintln!("{}", left);
70 v.push(proc_macro::TokenTree::Group(
71 proc_macro::Group::new(grp.delimiter(), do_valid(call_site, grp.stream()))));
72 eprintln!("--- {}", right);
73 },
74 tt => {
75 eprintln!("{}", tt);
76 v.push(tt)
77 }
78 }
79 }
80 proc_macro::TokenStream::from_iter(v)
81}
82*/