rustc_builtin_macros/
cmdline_attrs.rs

1//! Attributes injected into the crate root from command line using `-Z crate-attr`.
2
3use rustc_ast::{self as ast};
4use rustc_errors::Diag;
5use rustc_parse::parser::attr::InnerAttrPolicy;
6use rustc_parse::{parse_in, source_str_to_stream};
7use rustc_session::parse::ParseSess;
8use rustc_span::FileName;
9
10pub fn inject(krate: &mut ast::Crate, psess: &ParseSess, attrs: &[String]) {
11    for raw_attr in attrs {
12        let source = format!("#![{raw_attr}]");
13        let parse = || -> Result<ast::Attribute, Vec<Diag<'_>>> {
14            let tokens = source_str_to_stream(
15                psess,
16                FileName::cli_crate_attr_source_code(raw_attr),
17                source,
18                None,
19            )?;
20            parse_in(psess, tokens, "<crate attribute>", |p| {
21                p.parse_attribute(InnerAttrPolicy::Permitted)
22            })
23            .map_err(|e| vec![e])
24        };
25        let meta = match parse() {
26            Ok(meta) => meta,
27            Err(errs) => {
28                for err in errs {
29                    err.emit();
30                }
31                continue;
32            }
33        };
34
35        krate.attrs.push(meta);
36    }
37}