diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-10-28 04:53:07 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-28 04:53:07 +0100 |
| commit | 83260d5c4370679f145d5cebb471f91e81771ee2 (patch) | |
| tree | 13e688558e3481acb9efbd6d8a217dc6f9deaa36 /src/libsyntax | |
| parent | 4728d66206c82c98aa4e1fad751e8aae7489c242 (diff) | |
| parent | fb12c708521d66b1f727ad4c1ec752a78799980d (diff) | |
| download | rust-83260d5c4370679f145d5cebb471f91e81771ee2.tar.gz rust-83260d5c4370679f145d5cebb471f91e81771ee2.zip | |
Rollup merge of #65792 - Centril:split-syntax-2, r=petrochenkov
rustc, rustc_passes: reduce deps on rustc_expand Part of #65324. r? @petrochenkov
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/attr/mod.rs | 29 | ||||
| -rw-r--r-- | src/libsyntax/config.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/expand/allocator.rs | 75 | ||||
| -rw-r--r-- | src/libsyntax/expand/mod.rs | 21 | ||||
| -rw-r--r-- | src/libsyntax/lib.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 21 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/path.rs | 2 |
7 files changed, 125 insertions, 31 deletions
diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index 27de084ae98..3e240a855e2 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -15,7 +15,7 @@ use crate::ast::{Lit, LitKind, Expr, Item, Local, Stmt, StmtKind, GenericParam}; use crate::mut_visit::visit_clobber; use crate::source_map::{BytePos, Spanned}; use crate::parse::lexer::comments::doc_comment_style; -use crate::parse::parser::Parser; +use crate::parse; use crate::parse::PResult; use crate::parse::token::{self, Token}; use crate::ptr::P; @@ -280,35 +280,10 @@ impl Attribute { self.item.meta(self.span) } - crate fn parse<'a, T, F>(&self, sess: &'a ParseSess, mut f: F) -> PResult<'a, T> - where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>, - { - let mut parser = Parser::new( - sess, - self.tokens.clone(), - None, - false, - false, - Some("attribute"), - ); - let result = f(&mut parser)?; - if parser.token != token::Eof { - parser.unexpected()?; - } - Ok(result) - } - - pub fn parse_derive_paths<'a>(&self, sess: &'a ParseSess) -> PResult<'a, Vec<Path>> { - if self.tokens.is_empty() { - return Ok(Vec::new()); - } - self.parse(sess, |p| p.parse_derive_paths()) - } - pub fn parse_meta<'a>(&self, sess: &'a ParseSess) -> PResult<'a, MetaItem> { Ok(MetaItem { path: self.path.clone(), - kind: self.parse(sess, |parser| parser.parse_meta_item_kind())?, + kind: parse::parse_in_attr(sess, self, |p| p.parse_meta_item_kind())?, span: self.span, }) } diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index 54dc95291d6..6003fd1d286 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -10,6 +10,7 @@ use crate::attr; use crate::ast; use crate::edition::Edition; use crate::mut_visit::*; +use crate::parse; use crate::ptr::P; use crate::sess::ParseSess; use crate::symbol::sym; @@ -112,7 +113,8 @@ impl<'a> StripUnconfigured<'a> { return vec![]; } - let (cfg_predicate, expanded_attrs) = match attr.parse(self.sess, |p| p.parse_cfg_attr()) { + let res = parse::parse_in_attr(self.sess, &attr, |p| p.parse_cfg_attr()); + let (cfg_predicate, expanded_attrs) = match res { Ok(result) => result, Err(mut e) => { e.emit(); diff --git a/src/libsyntax/expand/allocator.rs b/src/libsyntax/expand/allocator.rs new file mode 100644 index 00000000000..20487b9af03 --- /dev/null +++ b/src/libsyntax/expand/allocator.rs @@ -0,0 +1,75 @@ +use crate::{ast, attr, visit}; +use syntax_pos::symbol::{sym, Symbol}; +use syntax_pos::Span; + +#[derive(Clone, Copy)] +pub enum AllocatorKind { + Global, + DefaultLib, + DefaultExe, +} + +impl AllocatorKind { + pub fn fn_name(&self, base: &str) -> String { + match *self { + AllocatorKind::Global => format!("__rg_{}", base), + AllocatorKind::DefaultLib => format!("__rdl_{}", base), + AllocatorKind::DefaultExe => format!("__rde_{}", base), + } + } +} + +pub enum AllocatorTy { + Layout, + Ptr, + ResultPtr, + Unit, + Usize, +} + +pub struct AllocatorMethod { + pub name: &'static str, + pub inputs: &'static [AllocatorTy], + pub output: AllocatorTy, +} + +pub static ALLOCATOR_METHODS: &[AllocatorMethod] = &[ + AllocatorMethod { + name: "alloc", + inputs: &[AllocatorTy::Layout], + output: AllocatorTy::ResultPtr, + }, + AllocatorMethod { + name: "dealloc", + inputs: &[AllocatorTy::Ptr, AllocatorTy::Layout], + output: AllocatorTy::Unit, + }, + AllocatorMethod { + name: "realloc", + inputs: &[AllocatorTy::Ptr, AllocatorTy::Layout, AllocatorTy::Usize], + output: AllocatorTy::ResultPtr, + }, + AllocatorMethod { + name: "alloc_zeroed", + inputs: &[AllocatorTy::Layout], + output: AllocatorTy::ResultPtr, + }, +]; + +pub fn global_allocator_spans(krate: &ast::Crate) -> Vec<Span> { + struct Finder { name: Symbol, spans: Vec<Span> } + impl<'ast> visit::Visitor<'ast> for Finder { + fn visit_item(&mut self, item: &'ast ast::Item) { + if item.ident.name == self.name && + attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol) { + self.spans.push(item.span); + } + visit::walk_item(self, item) + } + } + + let name = Symbol::intern(&AllocatorKind::Global.fn_name("alloc")); + let mut f = Finder { name, spans: Vec::new() }; + visit::walk_crate(&mut f, krate); + f.spans +} diff --git a/src/libsyntax/expand/mod.rs b/src/libsyntax/expand/mod.rs new file mode 100644 index 00000000000..038f60287be --- /dev/null +++ b/src/libsyntax/expand/mod.rs @@ -0,0 +1,21 @@ +//! Definitions shared by macros / syntax extensions and e.g. librustc. + +use crate::ast::Attribute; +use syntax_pos::symbol::sym; + +pub mod allocator; + +bitflags::bitflags! { + /// Built-in derives that need some extra tracking beyond the usual macro functionality. + #[derive(Default)] + pub struct SpecialDerives: u8 { + const PARTIAL_EQ = 1 << 0; + const EQ = 1 << 1; + const COPY = 1 << 2; + } +} + +pub fn is_proc_macro_attr(attr: &Attribute) -> bool { + [sym::proc_macro, sym::proc_macro_attribute, sym::proc_macro_derive] + .iter().any(|kind| attr.check_name(*kind)) +} diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 3a2af96f7db..7be6e6c7e18 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -95,9 +95,9 @@ pub mod json; pub mod ast; pub mod attr; +pub mod expand; pub mod source_map; -#[macro_use] -pub mod config; +#[macro_use] pub mod config; pub mod entry; pub mod feature_gate; pub mod mut_visit; diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index e6ddf8778cc..f5e416b722b 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -288,6 +288,27 @@ pub fn stream_to_parser_with_base_dir<'a>( Parser::new(sess, stream, Some(base_dir), true, false, None) } +/// Runs the given subparser `f` on the tokens of the given `attr`'s item. +pub fn parse_in_attr<'a, T>( + sess: &'a ParseSess, + attr: &ast::Attribute, + mut f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>, +) -> PResult<'a, T> { + let mut parser = Parser::new( + sess, + attr.tokens.clone(), + None, + false, + false, + Some("attribute"), + ); + let result = f(&mut parser)?; + if parser.token != token::Eof { + parser.unexpected()?; + } + Ok(result) +} + // NOTE(Centril): The following probably shouldn't be here but it acknowledges the // fact that architecturally, we are using parsing (read on below to understand why). diff --git a/src/libsyntax/parse/parser/path.rs b/src/libsyntax/parse/parser/path.rs index 77709a22953..38a28224dab 100644 --- a/src/libsyntax/parse/parser/path.rs +++ b/src/libsyntax/parse/parser/path.rs @@ -130,7 +130,7 @@ impl<'a> Parser<'a> { } /// Parse a list of paths inside `#[derive(path_0, ..., path_n)]`. - crate fn parse_derive_paths(&mut self) -> PResult<'a, Vec<Path>> { + pub fn parse_derive_paths(&mut self) -> PResult<'a, Vec<Path>> { self.expect(&token::OpenDelim(token::Paren))?; let mut list = Vec::new(); while !self.eat(&token::CloseDelim(token::Paren)) { |
