resolve/expand: Improve attribute expansion on macro definitions and calls

This commit is contained in:
Vadim Petrochenkov 2020-12-31 17:59:09 +03:00
parent 46c35c76fe
commit d81c1946c6
8 changed files with 63 additions and 40 deletions

View file

@ -1543,13 +1543,8 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
}
fn visit_item_kind(&mut self, item: &mut ast::ItemKind) {
match item {
ast::ItemKind::MacroDef(..) => {}
_ => {
self.cfg.configure_item_kind(item);
noop_visit_item_kind(item, self);
}
}
self.cfg.configure_item_kind(item);
noop_visit_item_kind(item, self);
}
fn flat_map_generic_param(

View file

@ -258,12 +258,9 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> {
fn flat_map_item(&mut self, item: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> {
match item.kind {
ast::ItemKind::MacCall(_) => return self.remove(item.id).make_items(),
ast::ItemKind::MacroDef(_) => return smallvec![item],
_ => {}
ast::ItemKind::MacCall(_) => self.remove(item.id).make_items(),
_ => noop_flat_map_item(item, self),
}
noop_flat_map_item(item, self)
}
fn flat_map_trait_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> {

View file

@ -1298,26 +1298,31 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
method!(visit_ty: ast::Ty, ast::TyKind::MacCall, walk_ty);
fn visit_item(&mut self, item: &'b Item) {
let macro_use = match item.kind {
let orig_module_scope = self.parent_scope.module;
self.parent_scope.macro_rules = match item.kind {
ItemKind::MacroDef(..) => {
self.parent_scope.macro_rules = self.define_macro(item);
return;
let macro_rules_scope = self.define_macro(item);
visit::walk_item(self, item);
macro_rules_scope
}
ItemKind::MacCall(..) => {
self.parent_scope.macro_rules = self.visit_invoc_in_module(item.id);
return;
let macro_rules_scope = self.visit_invoc_in_module(item.id);
visit::walk_item(self, item);
macro_rules_scope
}
_ => {
let orig_macro_rules_scope = self.parent_scope.macro_rules;
self.build_reduced_graph_for_item(item);
visit::walk_item(self, item);
match item.kind {
ItemKind::Mod(..) if self.contains_macro_use(&item.attrs) => {
self.parent_scope.macro_rules
}
_ => orig_macro_rules_scope,
}
}
ItemKind::Mod(..) => self.contains_macro_use(&item.attrs),
_ => false,
};
let orig_current_module = self.parent_scope.module;
let orig_current_macro_rules_scope = self.parent_scope.macro_rules;
self.build_reduced_graph_for_item(item);
visit::walk_item(self, item);
self.parent_scope.module = orig_current_module;
if !macro_use {
self.parent_scope.macro_rules = orig_current_macro_rules_scope;
}
self.parent_scope.module = orig_module_scope;
}
fn visit_stmt(&mut self, stmt: &'b ast::Stmt) {

View file

@ -91,7 +91,10 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
DefPathData::ValueNs(i.ident.name)
}
ItemKind::MacroDef(..) => DefPathData::MacroNs(i.ident.name),
ItemKind::MacCall(..) => return self.visit_macro_invoc(i.id),
ItemKind::MacCall(..) => {
visit::walk_item(self, i);
return self.visit_macro_invoc(i.id);
}
ItemKind::GlobalAsm(..) => DefPathData::Misc,
ItemKind::Use(..) => {
return visit::walk_item(self, i);

View file

@ -0,0 +1,15 @@
#![feature(extended_key_value_attributes)]
#![feature(rustc_attrs)]
#[rustc_dummy = stringify!(a)] // OK
macro_rules! bar {
() => {};
}
// FIXME?: `bar` here expands before `stringify` has a chance to expand.
// `#[rustc_dummy = ...]` is validated and dropped during expansion of `bar`,
// the "unexpected token" errors comes from the validation.
#[rustc_dummy = stringify!(b)] //~ ERROR unexpected token: `stringify!(b)`
bar!();
fn main() {}

View file

@ -0,0 +1,8 @@
error: unexpected token: `stringify!(b)`
--> $DIR/key-value-expansion-on-mac.rs:12:17
|
LL | #[rustc_dummy = stringify!(b)]
| ^^^^^^^^^^^^^
error: aborting due to previous error

View file

@ -172,12 +172,6 @@ warning: unknown lint: `x5100`
LL | #[deny(x5100)] impl S { }
| ^^^^^
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:438:1
|
LL | #[macro_escape]
| ^^^^^^^^^^^^^^^
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:441:17
|
@ -186,6 +180,12 @@ LL | mod inner { #![macro_escape] }
|
= help: try an outer attribute: `#[macro_use]`
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:438:1
|
LL | #[macro_escape]
| ^^^^^^^^^^^^^^^
warning: use of deprecated attribute `plugin_registrar`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:228:17
|

View file

@ -1,8 +1,8 @@
error: arguments to `macro_use` are not allowed here
--> $DIR/issue-43106-gating-of-macro_use.rs:6:1
--> $DIR/issue-43106-gating-of-macro_use.rs:12:17
|
LL | #![macro_use(my_macro)]
| ^^^^^^^^^^^^^^^^^^^^^^^
LL | mod inner { #![macro_use(my_macro)] }
| ^^^^^^^^^^^^^^^^^^^^^^^
error: arguments to `macro_use` are not allowed here
--> $DIR/issue-43106-gating-of-macro_use.rs:9:1
@ -11,10 +11,10 @@ LL | #[macro_use(my_macro)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: arguments to `macro_use` are not allowed here
--> $DIR/issue-43106-gating-of-macro_use.rs:12:17
--> $DIR/issue-43106-gating-of-macro_use.rs:6:1
|
LL | mod inner { #![macro_use(my_macro)] }
| ^^^^^^^^^^^^^^^^^^^^^^^
LL | #![macro_use(my_macro)]
| ^^^^^^^^^^^^^^^^^^^^^^^
error: malformed `macro_use` attribute input
--> $DIR/issue-43106-gating-of-macro_use.rs:15:5