//! Attributes injected into the crate root from command line using `-Z crate-attr`. use rustc_ast::{self as ast}; use rustc_errors::Diag; use rustc_parse::parser::attr::InnerAttrPolicy; use rustc_parse::{parse_in, source_str_to_stream}; use rustc_session::parse::ParseSess; use rustc_span::FileName; pub fn inject(krate: &mut ast::Crate, psess: &ParseSess, attrs: &[String]) { for raw_attr in attrs { let source = format!("#![{raw_attr}]"); let parse = || -> Result>> { let tokens = source_str_to_stream( psess, FileName::cli_crate_attr_source_code(raw_attr), source, None, )?; parse_in(psess, tokens, "", |p| { p.parse_attribute(InnerAttrPolicy::Permitted) }) .map_err(|e| vec![e]) }; let meta = match parse() { Ok(meta) => meta, Err(errs) => { for err in errs { err.emit(); } continue; } }; krate.attrs.push(meta); } }