|
1 | 1 | //! Attributes injected into the crate root from command line using `-Z crate-attr`. |
2 | 2 |
|
3 | | -use rustc_ast::attr::mk_attr; |
4 | | -use rustc_ast::{self as ast, AttrItem, AttrStyle, token}; |
5 | | -use rustc_parse::parser::ForceCollect; |
6 | | -use rustc_parse::{new_parser_from_source_str, unwrap_or_emit_fatal}; |
| 3 | +use rustc_ast::{self as ast}; |
| 4 | +use rustc_errors::Diag; |
| 5 | +use rustc_parse::parser::attr::InnerAttrPolicy; |
| 6 | +use rustc_parse::{parse_in, source_str_to_stream}; |
7 | 7 | use rustc_session::parse::ParseSess; |
8 | 8 | use rustc_span::FileName; |
9 | 9 |
|
10 | | -use crate::errors; |
11 | | - |
12 | 10 | pub fn inject(krate: &mut ast::Crate, psess: &ParseSess, attrs: &[String]) { |
13 | 11 | for raw_attr in attrs { |
14 | | - let mut parser = unwrap_or_emit_fatal(new_parser_from_source_str( |
15 | | - psess, |
16 | | - FileName::cli_crate_attr_source_code(raw_attr), |
17 | | - raw_attr.clone(), |
18 | | - )); |
19 | | - |
20 | | - let start_span = parser.token.span; |
21 | | - let AttrItem { unsafety, path, args, tokens: _ } = |
22 | | - match parser.parse_attr_item(ForceCollect::No) { |
23 | | - Ok(ai) => ai, |
24 | | - Err(err) => { |
| 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 { |
25 | 29 | err.emit(); |
26 | | - continue; |
27 | 30 | } |
28 | | - }; |
29 | | - let end_span = parser.token.span; |
30 | | - if parser.token != token::Eof { |
31 | | - psess.dcx().emit_err(errors::InvalidCrateAttr { span: start_span.to(end_span) }); |
32 | | - continue; |
33 | | - } |
| 31 | + continue; |
| 32 | + } |
| 33 | + }; |
34 | 34 |
|
35 | | - krate.attrs.push(mk_attr( |
36 | | - &psess.attr_id_generator, |
37 | | - AttrStyle::Inner, |
38 | | - unsafety, |
39 | | - path, |
40 | | - args, |
41 | | - start_span.to(end_span), |
42 | | - )); |
| 35 | + krate.attrs.push(meta); |
43 | 36 | } |
44 | 37 | } |
0 commit comments