rustversion_msrv/
expand.rs

1use proc_macro::{Delimiter, Group, Ident, Span, TokenStream, TokenTree};
2
3use crate::{
4    error::{Error, Result},
5    expr, iter, token,
6};
7
8pub fn cfg(introducer: &str, args: TokenStream, input: TokenStream) -> TokenStream {
9    try_cfg(introducer, args, input).unwrap_or_else(Error::into_compile_error)
10}
11
12fn try_cfg(introducer: &str, args: TokenStream, input: TokenStream) -> Result<TokenStream> {
13    let introducer = Ident::new(introducer, Span::call_site());
14
15    let mut full_args = TokenStream::from(TokenTree::Ident(introducer));
16    if !args.is_empty() {
17        full_args.extend(std::iter::once(TokenTree::Group(Group::new(
18            Delimiter::Parenthesis,
19            args,
20        ))));
21    }
22
23    let full_args = &mut iter::new(full_args);
24    let expr = expr::parse(full_args)?;
25    token::parse_end(full_args)?;
26
27    if expr.eval(crate::RUST_VERSION) {
28        Ok(input)
29    } else {
30        Ok(TokenStream::new())
31    }
32}