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 https://github.com/rust-lang/rust/pull/62771.
This commit is contained in:
commit
3d4cb50312
@ -230,7 +230,9 @@ pub fn register_plugins<'a>(
|
||||
crate_name: &str,
|
||||
) -> Result<(ast::Crate, PluginInfo)> {
|
||||
krate = time(sess, "attributes injection", || {
|
||||
syntax::attr::inject(krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr)
|
||||
syntax_ext::cmdline_attrs::inject(
|
||||
krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr
|
||||
)
|
||||
});
|
||||
|
||||
let (krate, features) = syntax::config::features(
|
||||
|
@ -16,7 +16,7 @@
|
||||
use crate::source_map::{BytePos, Spanned, DUMMY_SP};
|
||||
use crate::parse::lexer::comments::{doc_comment_style, strip_doc_comment_decoration};
|
||||
use crate::parse::parser::Parser;
|
||||
use crate::parse::{self, ParseSess, PResult};
|
||||
use crate::parse::{ParseSess, PResult};
|
||||
use crate::parse::token::{self, Token};
|
||||
use crate::ptr::P;
|
||||
use crate::symbol::{sym, Symbol};
|
||||
@ -25,7 +25,7 @@
|
||||
use crate::GLOBALS;
|
||||
|
||||
use log::debug;
|
||||
use syntax_pos::{FileName, Span};
|
||||
use syntax_pos::Span;
|
||||
|
||||
use std::iter;
|
||||
use std::ops::DerefMut;
|
||||
@ -381,28 +381,25 @@ pub fn mk_nested_word_item(ident: Ident) -> NestedMetaItem {
|
||||
AttrId(id)
|
||||
}
|
||||
|
||||
/// Returns an inner attribute with the given value and span.
|
||||
pub fn mk_attr_inner(item: MetaItem) -> Attribute {
|
||||
pub fn mk_attr(style: AttrStyle, path: Path, tokens: TokenStream, span: Span) -> Attribute {
|
||||
Attribute {
|
||||
id: mk_attr_id(),
|
||||
style: ast::AttrStyle::Inner,
|
||||
path: item.path,
|
||||
tokens: item.node.tokens(item.span),
|
||||
style,
|
||||
path,
|
||||
tokens,
|
||||
is_sugared_doc: false,
|
||||
span: item.span,
|
||||
span,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an inner attribute with the given value and span.
|
||||
pub fn mk_attr_inner(item: MetaItem) -> Attribute {
|
||||
mk_attr(AttrStyle::Inner, item.path, item.node.tokens(item.span), item.span)
|
||||
}
|
||||
|
||||
/// Returns an outer attribute with the given value and span.
|
||||
pub fn mk_attr_outer(item: MetaItem) -> Attribute {
|
||||
Attribute {
|
||||
id: mk_attr_id(),
|
||||
style: ast::AttrStyle::Outer,
|
||||
path: item.path,
|
||||
tokens: item.node.tokens(item.span),
|
||||
is_sugared_doc: false,
|
||||
span: item.span,
|
||||
}
|
||||
mk_attr(AttrStyle::Outer, item.path, item.node.tokens(item.span), item.span)
|
||||
}
|
||||
|
||||
pub fn mk_sugared_doc_attr(text: Symbol, span: Span) -> Attribute {
|
||||
@ -716,33 +713,3 @@ fn visit_attrs<F: FnOnce(&mut Vec<Attribute>)>(&mut self, f: F) {
|
||||
Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::ImplItem, ast::TraitItem, ast::Arm,
|
||||
ast::Field, ast::FieldPat, ast::Variant, ast::Param
|
||||
}
|
||||
|
||||
pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate {
|
||||
for raw_attr in attrs {
|
||||
let mut parser = parse::new_parser_from_source_str(
|
||||
parse_sess,
|
||||
FileName::cli_crate_attr_source_code(&raw_attr),
|
||||
raw_attr.clone(),
|
||||
);
|
||||
|
||||
let start_span = parser.token.span;
|
||||
let (path, tokens) = panictry!(parser.parse_meta_item_unrestricted());
|
||||
let end_span = parser.token.span;
|
||||
if parser.token != token::Eof {
|
||||
parse_sess.span_diagnostic
|
||||
.span_err(start_span.to(end_span), "invalid crate attribute");
|
||||
continue;
|
||||
}
|
||||
|
||||
krate.attrs.push(Attribute {
|
||||
id: mk_attr_id(),
|
||||
style: AttrStyle::Inner,
|
||||
path,
|
||||
tokens,
|
||||
is_sugared_doc: false,
|
||||
span: start_span.to(end_span),
|
||||
});
|
||||
}
|
||||
|
||||
krate
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ fn parse_attribute_with_inner_parse_policy(&mut self,
|
||||
/// PATH
|
||||
/// PATH `=` TOKEN_TREE
|
||||
/// The delimiters or `=` are still put into the resulting token stream.
|
||||
crate fn parse_meta_item_unrestricted(&mut self) -> PResult<'a, (ast::Path, TokenStream)> {
|
||||
pub fn parse_meta_item_unrestricted(&mut self) -> PResult<'a, (ast::Path, TokenStream)> {
|
||||
let meta = match self.token.kind {
|
||||
token::Interpolated(ref nt) => match **nt {
|
||||
Nonterminal::NtMeta(ref meta) => Some(meta.clone()),
|
||||
|
30
src/libsyntax_ext/cmdline_attrs.rs
Normal file
30
src/libsyntax_ext/cmdline_attrs.rs
Normal file
@ -0,0 +1,30 @@
|
||||
//! Attributes injected into the crate root from command line using `-Z crate-attr`.
|
||||
|
||||
use syntax::ast::{self, AttrStyle};
|
||||
use syntax::attr::mk_attr;
|
||||
use syntax::panictry;
|
||||
use syntax::parse::{self, token, ParseSess};
|
||||
use syntax_pos::FileName;
|
||||
|
||||
pub fn inject(mut krate: ast::Crate, parse_sess: &ParseSess, attrs: &[String]) -> ast::Crate {
|
||||
for raw_attr in attrs {
|
||||
let mut parser = parse::new_parser_from_source_str(
|
||||
parse_sess,
|
||||
FileName::cli_crate_attr_source_code(&raw_attr),
|
||||
raw_attr.clone(),
|
||||
);
|
||||
|
||||
let start_span = parser.token.span;
|
||||
let (path, tokens) = panictry!(parser.parse_meta_item_unrestricted());
|
||||
let end_span = parser.token.span;
|
||||
if parser.token != token::Eof {
|
||||
parse_sess.span_diagnostic
|
||||
.span_err(start_span.to(end_span), "invalid crate attribute");
|
||||
continue;
|
||||
}
|
||||
|
||||
krate.attrs.push(mk_attr(AttrStyle::Inner, path, tokens, start_span.to(end_span)));
|
||||
}
|
||||
|
||||
krate
|
||||
}
|
@ -40,6 +40,7 @@
|
||||
mod test;
|
||||
mod trace_macros;
|
||||
|
||||
pub mod cmdline_attrs;
|
||||
pub mod plugin_macro_defs;
|
||||
pub mod proc_macro_harness;
|
||||
pub mod standard_library_imports;
|
||||
|
Loading…
Reference in New Issue
Block a user