]>
Commit | Line | Data |
---|---|---|
e1599b0c XL |
1 | //! Attributes injected into the crate root from command line using `-Z crate-attr`. |
2 | ||
3 | use syntax::ast::{self, AttrStyle}; | |
4 | use syntax::attr::mk_attr; | |
5 | use syntax::panictry; | |
6 | use syntax::parse::{self, token, ParseSess}; | |
7 | use syntax_pos::FileName; | |
8 | ||
9 | pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate { | |
10 | for raw_attr in attrs { | |
11 | let mut parser = parse::new_parser_from_source_str( | |
12 | parse_sess, | |
13 | FileName::cli_crate_attr_source_code(&raw_attr), | |
14 | raw_attr.clone(), | |
15 | ); | |
16 | ||
17 | let start_span = parser.token.span; | |
18 | let (path, tokens) = panictry!(parser.parse_meta_item_unrestricted()); | |
19 | let end_span = parser.token.span; | |
20 | if parser.token != token::Eof { | |
21 | parse_sess.span_diagnostic | |
22 | .span_err(start_span.to(end_span), "invalid crate attribute"); | |
23 | continue; | |
24 | } | |
25 | ||
26 | krate.attrs.push(mk_attr(AttrStyle::Inner, path, tokens, start_span.to(end_span))); | |
27 | } | |
28 | ||
29 | krate | |
30 | } |