diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-10-05 16:30:08 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-11-16 18:31:47 +0300 |
| commit | 808522894b612bca8273f20ba4cfa328622c5a97 (patch) | |
| tree | 2e21ebecca25c0023caa6688f46a94f4b49f5b62 /src/libsyntax_expand | |
| parent | a3126a5013e851354f5c10efe3c166332a0a9b46 (diff) | |
expand: Stop marking derive helper attributes as known
Pass them through name resolution instead
Diffstat (limited to 'src/libsyntax_expand')
| -rw-r--r-- | src/libsyntax_expand/expand.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax_expand/proc_macro.rs | 19 |
2 files changed, 5 insertions, 34 deletions
diff --git a/src/libsyntax_expand/expand.rs b/src/libsyntax_expand/expand.rs index b7f6364c2b5..06aa5deb6e0 100644 --- a/src/libsyntax_expand/expand.rs +++ b/src/libsyntax_expand/expand.rs @@ -1,5 +1,5 @@ use crate::base::*; -use crate::proc_macro::{collect_derives, MarkAttrs}; +use crate::proc_macro::collect_derives; use crate::hygiene::{ExpnId, SyntaxContext, ExpnData, ExpnKind}; use crate::mbe::macro_rules::annotate_err_with_kind; use crate::placeholders::{placeholder, PlaceholderExpander}; @@ -394,7 +394,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let fragment = self.expand_invoc(invoc, &ext.kind); self.collect_invocations(fragment, &[]) } - InvocationRes::DeriveContainer(exts) => { + InvocationRes::DeriveContainer(_exts) => { + // FIXME: Consider using the derive resolutions (`_exts`) immediately, + // instead of enqueuing the derives to be resolved again later. let (derives, item) = match invoc.kind { InvocationKind::DeriveContainer { derives, item } => (derives, item), _ => unreachable!(), @@ -421,20 +423,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let mut item = self.fully_configure(item); item.visit_attrs(|attrs| attrs.retain(|a| !a.has_name(sym::derive))); - let mut helper_attrs = Vec::new(); - let mut has_copy = false; - for ext in exts { - helper_attrs.extend(&ext.helper_attrs); - has_copy |= ext.is_derive_copy; - } - // Mark derive helpers inside this item as known and used. - // FIXME: This is a hack, derive helpers should be integrated with regular name - // resolution instead. For example, helpers introduced by a derive container - // can be in scope for all code produced by that container's expansion. - item.visit_with(&mut MarkAttrs(&helper_attrs)); - if has_copy { - self.cx.resolver.add_derive_copy(invoc.expansion_data.id); - } let mut derive_placeholders = Vec::with_capacity(derives.len()); invocations.reserve(derives.len()); diff --git a/src/libsyntax_expand/proc_macro.rs b/src/libsyntax_expand/proc_macro.rs index db981fae5c2..099cf0a4be9 100644 --- a/src/libsyntax_expand/proc_macro.rs +++ b/src/libsyntax_expand/proc_macro.rs @@ -1,13 +1,11 @@ use crate::base::{self, *}; use crate::proc_macro_server; -use syntax::ast::{self, ItemKind, Attribute, Mac}; -use syntax::attr::{mark_used, mark_known}; +use syntax::ast::{self, ItemKind}; use syntax::errors::{Applicability, FatalError}; use syntax::symbol::sym; use syntax::token; use syntax::tokenstream::{self, TokenStream}; -use syntax::visit::Visitor; use rustc_data_structures::sync::Lrc; use syntax_pos::{Span, DUMMY_SP}; @@ -167,21 +165,6 @@ impl MultiItemModifier for ProcMacroDerive { } } -crate struct MarkAttrs<'a>(crate &'a [ast::Name]); - -impl<'a> Visitor<'a> for MarkAttrs<'a> { - fn visit_attribute(&mut self, attr: &Attribute) { - if let Some(ident) = attr.ident() { - if self.0.contains(&ident.name) { - mark_used(attr); - mark_known(attr); - } - } - } - - fn visit_mac(&mut self, _mac: &Mac) {} -} - crate fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec<ast::Attribute>) -> Vec<ast::Path> { let mut result = Vec::new(); attrs.retain(|attr| { |
