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*/