]> git.lizzy.rs Git - rust.git/blob - src/librustc_builtin_macros/cfg.rs
Auto merge of #67788 - cjgillot:delint-day, r=Zoxc
[rust.git] / src / librustc_builtin_macros / cfg.rs
1 /// The compiler code necessary to support the cfg! extension, which expands to
2 /// a literal `true` or `false` based on whether the given cfg matches the
3 /// current compilation environment.
4 use errors::DiagnosticBuilder;
5
6 use rustc_expand::base::{self, *};
7 use rustc_span::Span;
8 use syntax::ast;
9 use syntax::attr;
10 use syntax::token;
11 use syntax::tokenstream::TokenStream;
12
13 pub fn expand_cfg(
14     cx: &mut ExtCtxt<'_>,
15     sp: Span,
16     tts: TokenStream,
17 ) -> Box<dyn base::MacResult + 'static> {
18     let sp = cx.with_def_site_ctxt(sp);
19
20     match parse_cfg(cx, sp, tts) {
21         Ok(cfg) => {
22             let matches_cfg = attr::cfg_matches(&cfg, cx.parse_sess, cx.ecfg.features);
23             MacEager::expr(cx.expr_bool(sp, matches_cfg))
24         }
25         Err(mut err) => {
26             err.emit();
27             DummyResult::any(sp)
28         }
29     }
30 }
31
32 fn parse_cfg<'a>(
33     cx: &mut ExtCtxt<'a>,
34     sp: Span,
35     tts: TokenStream,
36 ) -> Result<ast::MetaItem, DiagnosticBuilder<'a>> {
37     let mut p = cx.new_parser_from_tts(tts);
38
39     if p.token == token::Eof {
40         let mut err = cx.struct_span_err(sp, "macro requires a cfg-pattern as an argument");
41         err.span_label(sp, "cfg-pattern required");
42         return Err(err);
43     }
44
45     let cfg = p.parse_meta_item()?;
46
47     let _ = p.eat(&token::Comma);
48
49     if !p.eat(&token::Eof) {
50         return Err(cx.struct_span_err(sp, "expected 1 cfg-pattern"));
51     }
52
53     Ok(cfg)
54 }