Skip to content

Commit 3d4cb50

Browse files
authored
Rollup merge of #64243 - petrochenkov:cmdattr, r=alexcrichton
Move injection of attributes from command line to `libsyntax_ext` Just a tiny bit of code generation that wasn't moved into `libsyntax_ext` in #62771.
2 parents 69121f5 + 3dde650 commit 3d4cb50

File tree

5 files changed

+48
-48
lines changed

5 files changed

+48
-48
lines changed

src/librustc_interface/passes.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,9 @@ pub fn register_plugins<'a>(
230230
crate_name: &str,
231231
) -> Result<(ast::Crate, PluginInfo)> {
232232
krate = time(sess, "attributes injection", || {
233-
syntax::attr::inject(krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr)
233+
syntax_ext::cmdline_attrs::inject(
234+
krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr
235+
)
234236
});
235237

236238
let (krate, features) = syntax::config::features(

src/libsyntax/attr/mod.rs

+13-46
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::mut_visit::visit_clobber;
1616
use crate::source_map::{BytePos, Spanned, DUMMY_SP};
1717
use crate::parse::lexer::comments::{doc_comment_style, strip_doc_comment_decoration};
1818
use crate::parse::parser::Parser;
19-
use crate::parse::{self, ParseSess, PResult};
19+
use crate::parse::{ParseSess, PResult};
2020
use crate::parse::token::{self, Token};
2121
use crate::ptr::P;
2222
use crate::symbol::{sym, Symbol};
@@ -25,7 +25,7 @@ use crate::tokenstream::{TokenStream, TokenTree, DelimSpan};
2525
use crate::GLOBALS;
2626

2727
use log::debug;
28-
use syntax_pos::{FileName, Span};
28+
use syntax_pos::Span;
2929

3030
use std::iter;
3131
use std::ops::DerefMut;
@@ -381,28 +381,25 @@ crate fn mk_attr_id() -> AttrId {
381381
AttrId(id)
382382
}
383383

384-
/// Returns an inner attribute with the given value and span.
385-
pub fn mk_attr_inner(item: MetaItem) -> Attribute {
384+
pub fn mk_attr(style: AttrStyle, path: Path, tokens: TokenStream, span: Span) -> Attribute {
386385
Attribute {
387386
id: mk_attr_id(),
388-
style: ast::AttrStyle::Inner,
389-
path: item.path,
390-
tokens: item.node.tokens(item.span),
387+
style,
388+
path,
389+
tokens,
391390
is_sugared_doc: false,
392-
span: item.span,
391+
span,
393392
}
394393
}
395394

395+
/// Returns an inner attribute with the given value and span.
396+
pub fn mk_attr_inner(item: MetaItem) -> Attribute {
397+
mk_attr(AttrStyle::Inner, item.path, item.node.tokens(item.span), item.span)
398+
}
399+
396400
/// Returns an outer attribute with the given value and span.
397401
pub fn mk_attr_outer(item: MetaItem) -> Attribute {
398-
Attribute {
399-
id: mk_attr_id(),
400-
style: ast::AttrStyle::Outer,
401-
path: item.path,
402-
tokens: item.node.tokens(item.span),
403-
is_sugared_doc: false,
404-
span: item.span,
405-
}
402+
mk_attr(AttrStyle::Outer, item.path, item.node.tokens(item.span), item.span)
406403
}
407404

408405
pub fn mk_sugared_doc_attr(text: Symbol, span: Span) -> Attribute {
@@ -716,33 +713,3 @@ derive_has_attrs! {
716713
Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::ImplItem, ast::TraitItem, ast::Arm,
717714
ast::Field, ast::FieldPat, ast::Variant, ast::Param
718715
}
719-
720-
pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate {
721-
for raw_attr in attrs {
722-
let mut parser = parse::new_parser_from_source_str(
723-
parse_sess,
724-
FileName::cli_crate_attr_source_code(&raw_attr),
725-
raw_attr.clone(),
726-
);
727-
728-
let start_span = parser.token.span;
729-
let (path, tokens) = panictry!(parser.parse_meta_item_unrestricted());
730-
let end_span = parser.token.span;
731-
if parser.token != token::Eof {
732-
parse_sess.span_diagnostic
733-
.span_err(start_span.to(end_span), "invalid crate attribute");
734-
continue;
735-
}
736-
737-
krate.attrs.push(Attribute {
738-
id: mk_attr_id(),
739-
style: AttrStyle::Inner,
740-
path,
741-
tokens,
742-
is_sugared_doc: false,
743-
span: start_span.to(end_span),
744-
});
745-
}
746-
747-
krate
748-
}

src/libsyntax/parse/attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl<'a> Parser<'a> {
176176
/// PATH
177177
/// PATH `=` TOKEN_TREE
178178
/// The delimiters or `=` are still put into the resulting token stream.
179-
crate fn parse_meta_item_unrestricted(&mut self) -> PResult<'a, (ast::Path, TokenStream)> {
179+
pub fn parse_meta_item_unrestricted(&mut self) -> PResult<'a, (ast::Path, TokenStream)> {
180180
let meta = match self.token.kind {
181181
token::Interpolated(ref nt) => match **nt {
182182
Nonterminal::NtMeta(ref meta) => Some(meta.clone()),

src/libsyntax_ext/cmdline_attrs.rs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
}

src/libsyntax_ext/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ mod source_util;
4040
mod test;
4141
mod trace_macros;
4242

43+
pub mod cmdline_attrs;
4344
pub mod plugin_macro_defs;
4445
pub mod proc_macro_harness;
4546
pub mod standard_library_imports;

0 commit comments

Comments
 (0)