diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-04-05 10:49:14 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-05 10:49:14 -0500 |
| commit | 46492ffabd7194bb134035cadcd66d47f1b97db8 (patch) | |
| tree | f361c33cc5f7794ae707b5ed1d60fff877000575 /src/libsyntax/fold.rs | |
| parent | b0bd9a771e81740da7e4a7a2f5a6dfecce10c699 (diff) | |
| parent | 5d74990cebb82b9573ea6a9d509bb8e05fd6681e (diff) | |
| download | rust-46492ffabd7194bb134035cadcd66d47f1b97db8.tar.gz rust-46492ffabd7194bb134035cadcd66d47f1b97db8.zip | |
Rollup merge of #49350 - abonander:macros-in-extern, r=petrochenkov
Expand macros in `extern {}` blocks
This permits macro and proc-macro and attribute invocations (the latter only with the `proc_macro` feature of course) in `extern {}` blocks, gated behind a new `macros_in_extern` feature.
A tracking issue is now open at #49476
closes #48747
Diffstat (limited to 'src/libsyntax/fold.rs')
| -rw-r--r-- | src/libsyntax/fold.rs | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index e702bf56e7f..1bee67bf360 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -60,10 +60,14 @@ pub trait Folder : Sized { noop_fold_use_tree(use_tree, self) } - fn fold_foreign_item(&mut self, ni: ForeignItem) -> ForeignItem { + fn fold_foreign_item(&mut self, ni: ForeignItem) -> SmallVector<ForeignItem> { noop_fold_foreign_item(ni, self) } + fn fold_foreign_item_simple(&mut self, ni: ForeignItem) -> ForeignItem { + noop_fold_foreign_item_simple(ni, self) + } + fn fold_item(&mut self, i: P<Item>) -> SmallVector<P<Item>> { noop_fold_item(i, self) } @@ -414,7 +418,7 @@ pub fn noop_fold_foreign_mod<T: Folder>(ForeignMod {abi, items}: ForeignMod, fld: &mut T) -> ForeignMod { ForeignMod { abi, - items: items.move_map(|x| fld.fold_foreign_item(x)), + items: items.move_flat_map(|x| fld.fold_foreign_item(x)), } } @@ -648,6 +652,10 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T) token::NtArg(arg) => token::NtArg(fld.fold_arg(arg)), token::NtVis(vis) => token::NtVis(fld.fold_vis(vis)), token::NtLifetime(lifetime) => token::NtLifetime(fld.fold_lifetime(lifetime)), + token::NtForeignItem(ni) => + token::NtForeignItem(fld.fold_foreign_item(ni) + // see reasoning above + .expect_one("expected fold to produce exactly one item")), } } @@ -1072,7 +1080,12 @@ pub fn noop_fold_item_simple<T: Folder>(Item {id, ident, attrs, node, vis, span, } } -pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem { +pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) +-> SmallVector<ForeignItem> { + SmallVector::one(folder.fold_foreign_item_simple(ni)) +} + +pub fn noop_fold_foreign_item_simple<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem { ForeignItem { id: folder.new_id(ni.id), vis: folder.fold_vis(ni.vis), @@ -1086,6 +1099,7 @@ pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> For ForeignItemKind::Static(folder.fold_ty(t), m) } ForeignItemKind::Ty => ForeignItemKind::Ty, + ForeignItemKind::Macro(mac) => ForeignItemKind::Macro(folder.fold_mac(mac)), }, span: folder.new_span(ni.span) } |
