|
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