2019-09-06 23:41:54 +03:00
|
|
|
//! Attributes injected into the crate root from command line using `-Z crate-attr`.
|
|
|
|
|
|
2025-03-11 00:24:08 -04:00
|
|
|
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};
|
2020-01-11 15:03:15 +01:00
|
|
|
use rustc_session::parse::ParseSess;
|
2019-12-31 20:15:40 +03:00
|
|
|
use rustc_span::FileName;
|
2019-09-06 23:41:54 +03:00
|
|
|
|
2024-03-04 16:31:49 +11:00
|
|
|
pub fn inject(krate: &mut ast::Crate, psess: &ParseSess, attrs: &[String]) {
|
2019-09-06 23:41:54 +03:00
|
|
|
for raw_attr in attrs {
|
2025-03-11 00:24:08 -04:00
|
|
|
let source = format!("#![{raw_attr}]");
|
|
|
|
|
let parse = || -> Result<ast::Attribute, Vec<Diag<'_>>> {
|
|
|
|
|
let tokens = source_str_to_stream(
|
|
|
|
|
psess,
|
|
|
|
|
FileName::cli_crate_attr_source_code(raw_attr),
|
|
|
|
|
source,
|
|
|
|
|
None,
|
|
|
|
|
)?;
|
|
|
|
|
parse_in(psess, tokens, "<crate attribute>", |p| {
|
|
|
|
|
p.parse_attribute(InnerAttrPolicy::Permitted)
|
|
|
|
|
})
|
|
|
|
|
.map_err(|e| vec![e])
|
|
|
|
|
};
|
|
|
|
|
let meta = match parse() {
|
|
|
|
|
Ok(meta) => meta,
|
|
|
|
|
Err(errs) => {
|
|
|
|
|
for err in errs {
|
2024-07-17 13:14:35 +10:00
|
|
|
err.emit();
|
|
|
|
|
}
|
2025-03-11 00:24:08 -04:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
};
|
2019-09-06 23:41:54 +03:00
|
|
|
|
2025-03-11 00:24:08 -04:00
|
|
|
krate.attrs.push(meta);
|
2019-09-06 23:41:54 +03:00
|
|
|
}
|
|
|
|
|
}
|