Skip to content

Commit cc17dbb

Browse files
committed
syntax: Use MultiItemModifier for built-in derives
1 parent 4419af8 commit cc17dbb

File tree

15 files changed

+82
-85
lines changed

15 files changed

+82
-85
lines changed

src/libsyntax/ext/base.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pub use SyntaxExtension::*;
22

3-
use crate::ast::{self, Attribute, Name, PatKind, MetaItem};
3+
use crate::ast::{self, Attribute, Name, PatKind};
44
use crate::attr::HasAttrs;
55
use crate::source_map::{SourceMap, Spanned, respan};
66
use crate::edition::Edition;
@@ -516,9 +516,6 @@ impl MacResult for DummyResult {
516516
}
517517
}
518518

519-
pub type BuiltinDeriveFn =
520-
for<'cx> fn(&'cx mut ExtCtxt<'_>, Span, &MetaItem, &Annotatable, &mut dyn FnMut(Annotatable));
521-
522519
/// Represents different kinds of macro invocations that can be resolved.
523520
#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
524521
pub enum MacroKind {
@@ -604,7 +601,7 @@ pub enum SyntaxExtension {
604601
Vec<Symbol> /* inert attribute names */, Edition),
605602

606603
/// An attribute-like procedural macro that derives a builtin trait.
607-
BuiltinDerive(BuiltinDeriveFn),
604+
BuiltinDerive(Box<dyn MultiItemModifier + sync::Sync + sync::Send>),
608605

609606
/// A declarative macro, e.g., `macro m() {}`.
610607
DeclMacro {

src/libsyntax/ext/expand.rs

+20-20
Original file line numberDiff line numberDiff line change
@@ -893,29 +893,29 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
893893
edition: ext.edition(self.cx.parse_sess.edition),
894894
};
895895

896-
match *ext {
897-
ProcMacroDerive(ref ext, ..) => {
898-
invoc.expansion_data.mark.set_expn_info(expn_info);
899-
let span = span.with_ctxt(self.cx.backtrace());
900-
let dummy = ast::MetaItem { // FIXME(jseyfried) avoid this
901-
path: Path::from_ident(Ident::invalid()),
902-
span: DUMMY_SP,
903-
node: ast::MetaItemKind::Word,
896+
match ext {
897+
ProcMacroDerive(expander, ..) | BuiltinDerive(expander) => {
898+
let meta = match ext {
899+
ProcMacroDerive(..) => ast::MetaItem { // FIXME(jseyfried) avoid this
900+
path: Path::from_ident(Ident::invalid()),
901+
span: DUMMY_SP,
902+
node: ast::MetaItemKind::Word,
903+
},
904+
_ => {
905+
expn_info.allow_internal_unstable = Some(vec![
906+
sym::rustc_attrs,
907+
Symbol::intern("derive_clone_copy"),
908+
Symbol::intern("derive_eq"),
909+
// RustcDeserialize and RustcSerialize
910+
Symbol::intern("libstd_sys_internals"),
911+
].into());
912+
attr.meta()?
913+
}
904914
};
905-
let items = ext.expand(self.cx, span, &dummy, item);
906-
Some(invoc.fragment_kind.expect_from_annotatables(items))
907-
}
908-
BuiltinDerive(func) => {
909-
expn_info.allow_internal_unstable = Some(vec![
910-
sym::rustc_attrs,
911-
Symbol::intern("derive_clone_copy"),
912-
Symbol::intern("derive_eq"),
913-
Symbol::intern("libstd_sys_internals"), // RustcDeserialize and RustcSerialize
914-
].into());
915+
915916
invoc.expansion_data.mark.set_expn_info(expn_info);
916917
let span = span.with_ctxt(self.cx.backtrace());
917-
let mut items = Vec::new();
918-
func(self.cx, span, &attr.meta()?, &item, &mut |a| items.push(a));
918+
let items = expander.expand(self.cx, span, &meta, item);
919919
Some(invoc.fragment_kind.expect_from_annotatables(items))
920920
}
921921
_ => {

src/libsyntax_ext/deriving/bounds.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@ use syntax_pos::Span;
99
pub fn expand_deriving_unsafe_bound(cx: &mut ExtCtxt<'_>,
1010
span: Span,
1111
_: &MetaItem,
12-
_: &Annotatable,
13-
_: &mut dyn FnMut(Annotatable)) {
12+
_: Annotatable)
13+
-> Vec<Annotatable> {
1414
cx.span_err(span, "this unsafe trait should be implemented explicitly");
15+
Vec::new()
1516
}
1617

1718
pub fn expand_deriving_copy(cx: &mut ExtCtxt<'_>,
1819
span: Span,
1920
mitem: &MetaItem,
20-
item: &Annotatable,
21-
push: &mut dyn FnMut(Annotatable)) {
21+
ref item: Annotatable)
22+
-> Vec<Annotatable> {
2223
let trait_def = TraitDef {
2324
span,
2425
attributes: Vec::new(),
@@ -31,5 +32,5 @@ pub fn expand_deriving_copy(cx: &mut ExtCtxt<'_>,
3132
associated_types: Vec::new(),
3233
};
3334

34-
trait_def.expand(cx, mitem, item, push);
35+
trait_def.expand(cx, mitem, item)
3536
}

src/libsyntax_ext/deriving/clone.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use syntax_pos::Span;
1313
pub fn expand_deriving_clone(cx: &mut ExtCtxt<'_>,
1414
span: Span,
1515
mitem: &MetaItem,
16-
item: &Annotatable,
17-
push: &mut dyn FnMut(Annotatable)) {
16+
ref item: Annotatable)
17+
-> Vec<Annotatable> {
1818
// check if we can use a short form
1919
//
2020
// the short form is `fn clone(&self) -> Self { *self }`
@@ -100,7 +100,7 @@ pub fn expand_deriving_clone(cx: &mut ExtCtxt<'_>,
100100
associated_types: Vec::new(),
101101
};
102102

103-
trait_def.expand_ext(cx, mitem, item, push, is_shallow)
103+
trait_def.expand_ext(cx, mitem, item, is_shallow)
104104
}
105105

106106
fn cs_clone_shallow(name: &str,

src/libsyntax_ext/deriving/cmp/eq.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use syntax_pos::Span;
1212
pub fn expand_deriving_eq(cx: &mut ExtCtxt<'_>,
1313
span: Span,
1414
mitem: &MetaItem,
15-
item: &Annotatable,
16-
push: &mut dyn FnMut(Annotatable)) {
15+
ref item: Annotatable)
16+
-> Vec<Annotatable> {
1717
let inline = cx.meta_word(span, sym::inline);
1818
let hidden = cx.meta_list_item_word(span, sym::hidden);
1919
let doc = cx.meta_list(span, sym::doc, vec![hidden]);
@@ -41,7 +41,7 @@ pub fn expand_deriving_eq(cx: &mut ExtCtxt<'_>,
4141
}],
4242
associated_types: Vec::new(),
4343
};
44-
trait_def.expand_ext(cx, mitem, item, push, true)
44+
trait_def.expand_ext(cx, mitem, item, true)
4545
}
4646

4747
fn cs_total_eq_assert(cx: &mut ExtCtxt<'_>,

src/libsyntax_ext/deriving/cmp/ord.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use syntax_pos::Span;
1212
pub fn expand_deriving_ord(cx: &mut ExtCtxt<'_>,
1313
span: Span,
1414
mitem: &MetaItem,
15-
item: &Annotatable,
16-
push: &mut dyn FnMut(Annotatable)) {
15+
ref item: Annotatable)
16+
-> Vec<Annotatable> {
1717
let inline = cx.meta_word(span, sym::inline);
1818
let attrs = vec![cx.attribute(span, inline)];
1919
let trait_def = TraitDef {
@@ -40,7 +40,7 @@ pub fn expand_deriving_ord(cx: &mut ExtCtxt<'_>,
4040
associated_types: Vec::new(),
4141
};
4242

43-
trait_def.expand(cx, mitem, item, push)
43+
trait_def.expand(cx, mitem, item)
4444
}
4545

4646

src/libsyntax_ext/deriving/cmp/partial_eq.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use syntax_pos::Span;
1212
pub fn expand_deriving_partial_eq(cx: &mut ExtCtxt<'_>,
1313
span: Span,
1414
mitem: &MetaItem,
15-
item: &Annotatable,
16-
push: &mut dyn FnMut(Annotatable)) {
15+
ref item: Annotatable)
16+
-> Vec<Annotatable> {
1717
// structures are equal if all fields are equal, and non equal, if
1818
// any fields are not equal or if the enum variants are different
1919
fn cs_op(cx: &mut ExtCtxt<'_>,
@@ -99,5 +99,5 @@ pub fn expand_deriving_partial_eq(cx: &mut ExtCtxt<'_>,
9999
methods,
100100
associated_types: Vec::new(),
101101
};
102-
trait_def.expand(cx, mitem, item, push)
102+
trait_def.expand(cx, mitem, item)
103103
}

src/libsyntax_ext/deriving/cmp/partial_ord.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use syntax_pos::Span;
1414
pub fn expand_deriving_partial_ord(cx: &mut ExtCtxt<'_>,
1515
span: Span,
1616
mitem: &MetaItem,
17-
item: &Annotatable,
18-
push: &mut dyn FnMut(Annotatable)) {
17+
ref item: Annotatable)
18+
-> Vec<Annotatable> {
1919
macro_rules! md {
2020
($name:expr, $op:expr, $equal:expr) => { {
2121
let inline = cx.meta_word(span, sym::inline);
@@ -83,7 +83,7 @@ pub fn expand_deriving_partial_ord(cx: &mut ExtCtxt<'_>,
8383
methods,
8484
associated_types: Vec::new(),
8585
};
86-
trait_def.expand(cx, mitem, item, push)
86+
trait_def.expand(cx, mitem, item)
8787
}
8888

8989
#[derive(Copy, Clone)]

src/libsyntax_ext/deriving/debug.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use syntax_pos::{DUMMY_SP, Span};
1515
pub fn expand_deriving_debug(cx: &mut ExtCtxt<'_>,
1616
span: Span,
1717
mitem: &MetaItem,
18-
item: &Annotatable,
19-
push: &mut dyn FnMut(Annotatable)) {
18+
ref item: Annotatable)
19+
-> Vec<Annotatable> {
2020
// &mut ::std::fmt::Formatter
2121
let fmtr = Ptr(Box::new(Literal(path_std!(cx, fmt::Formatter))),
2222
Borrowed(None, ast::Mutability::Mutable));
@@ -44,7 +44,7 @@ pub fn expand_deriving_debug(cx: &mut ExtCtxt<'_>,
4444
}],
4545
associated_types: Vec::new(),
4646
};
47-
trait_def.expand(cx, mitem, item, push)
47+
trait_def.expand(cx, mitem, item)
4848
}
4949

5050
/// We use the debug builders to do the heavy lifting here

src/libsyntax_ext/deriving/decodable.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@ use syntax_pos::Span;
1616
pub fn expand_deriving_rustc_decodable(cx: &mut ExtCtxt<'_>,
1717
span: Span,
1818
mitem: &MetaItem,
19-
item: &Annotatable,
20-
push: &mut dyn FnMut(Annotatable)) {
21-
expand_deriving_decodable_imp(cx, span, mitem, item, push, "rustc_serialize")
19+
item: Annotatable)
20+
-> Vec<Annotatable> {
21+
expand_deriving_decodable_imp(cx, span, mitem, item, "rustc_serialize")
2222
}
2323

2424
pub fn expand_deriving_decodable(cx: &mut ExtCtxt<'_>,
2525
span: Span,
2626
mitem: &MetaItem,
27-
item: &Annotatable,
28-
push: &mut dyn FnMut(Annotatable)) {
27+
item: Annotatable)
28+
-> Vec<Annotatable> {
2929
warn_if_deprecated(cx, span, "Decodable");
30-
expand_deriving_decodable_imp(cx, span, mitem, item, push, "serialize")
30+
expand_deriving_decodable_imp(cx, span, mitem, item, "serialize")
3131
}
3232

3333
fn expand_deriving_decodable_imp(cx: &mut ExtCtxt<'_>,
3434
span: Span,
3535
mitem: &MetaItem,
36-
item: &Annotatable,
37-
push: &mut dyn FnMut(Annotatable),
38-
krate: &'static str) {
36+
ref item: Annotatable,
37+
krate: &'static str)
38+
-> Vec<Annotatable> {
3939
let typaram = &*deriving::hygienic_type_parameter(item, "__D");
4040

4141
let trait_def = TraitDef {
@@ -76,7 +76,7 @@ fn expand_deriving_decodable_imp(cx: &mut ExtCtxt<'_>,
7676
associated_types: Vec::new(),
7777
};
7878

79-
trait_def.expand(cx, mitem, item, push)
79+
trait_def.expand(cx, mitem, item)
8080
}
8181

8282
fn decodable_substructure(cx: &mut ExtCtxt<'_>,

src/libsyntax_ext/deriving/default.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use syntax_pos::Span;
1313
pub fn expand_deriving_default(cx: &mut ExtCtxt<'_>,
1414
span: Span,
1515
mitem: &MetaItem,
16-
item: &Annotatable,
17-
push: &mut dyn FnMut(Annotatable)) {
16+
ref item: Annotatable)
17+
-> Vec<Annotatable> {
1818
let inline = cx.meta_word(span, sym::inline);
1919
let attrs = vec![cx.attribute(span, inline)];
2020
let trait_def = TraitDef {
@@ -40,7 +40,7 @@ pub fn expand_deriving_default(cx: &mut ExtCtxt<'_>,
4040
}],
4141
associated_types: Vec::new(),
4242
};
43-
trait_def.expand(cx, mitem, item, push)
43+
trait_def.expand(cx, mitem, item)
4444
}
4545

4646
fn default_substructure(cx: &mut ExtCtxt<'_>,

src/libsyntax_ext/deriving/encodable.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,26 @@ use syntax_pos::Span;
9797
pub fn expand_deriving_rustc_encodable(cx: &mut ExtCtxt<'_>,
9898
span: Span,
9999
mitem: &MetaItem,
100-
item: &Annotatable,
101-
push: &mut dyn FnMut(Annotatable)) {
102-
expand_deriving_encodable_imp(cx, span, mitem, item, push, "rustc_serialize")
100+
item: Annotatable)
101+
-> Vec<Annotatable> {
102+
expand_deriving_encodable_imp(cx, span, mitem, item, "rustc_serialize")
103103
}
104104

105105
pub fn expand_deriving_encodable(cx: &mut ExtCtxt<'_>,
106106
span: Span,
107107
mitem: &MetaItem,
108-
item: &Annotatable,
109-
push: &mut dyn FnMut(Annotatable)) {
108+
item: Annotatable)
109+
-> Vec<Annotatable> {
110110
warn_if_deprecated(cx, span, "Encodable");
111-
expand_deriving_encodable_imp(cx, span, mitem, item, push, "serialize")
111+
expand_deriving_encodable_imp(cx, span, mitem, item, "serialize")
112112
}
113113

114114
fn expand_deriving_encodable_imp(cx: &mut ExtCtxt<'_>,
115115
span: Span,
116116
mitem: &MetaItem,
117-
item: &Annotatable,
118-
push: &mut dyn FnMut(Annotatable),
119-
krate: &'static str) {
117+
ref item: Annotatable,
118+
krate: &'static str)
119+
-> Vec<Annotatable> {
120120
let typaram = &*deriving::hygienic_type_parameter(item, "__S");
121121

122122
let trait_def = TraitDef {
@@ -159,7 +159,7 @@ fn expand_deriving_encodable_imp(cx: &mut ExtCtxt<'_>,
159159
associated_types: Vec::new(),
160160
};
161161

162-
trait_def.expand(cx, mitem, item, push)
162+
trait_def.expand(cx, mitem, item)
163163
}
164164

165165
fn encodable_substructure(cx: &mut ExtCtxt<'_>,

src/libsyntax_ext/deriving/generic/mod.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -388,17 +388,17 @@ impl<'a> TraitDef<'a> {
388388
pub fn expand(self,
389389
cx: &mut ExtCtxt<'_>,
390390
mitem: &ast::MetaItem,
391-
item: &'a Annotatable,
392-
push: &mut dyn FnMut(Annotatable)) {
393-
self.expand_ext(cx, mitem, item, push, false);
391+
item: &'a Annotatable)
392+
-> Vec<Annotatable> {
393+
self.expand_ext(cx, mitem, item, false)
394394
}
395395

396396
pub fn expand_ext(self,
397397
cx: &mut ExtCtxt<'_>,
398398
mitem: &ast::MetaItem,
399399
item: &'a Annotatable,
400-
push: &mut dyn FnMut(Annotatable),
401-
from_scratch: bool) {
400+
from_scratch: bool)
401+
-> Vec<Annotatable> {
402402
match *item {
403403
Annotatable::Item(ref item) => {
404404
let is_packed = item.attrs.iter().any(|attr| {
@@ -422,7 +422,7 @@ impl<'a> TraitDef<'a> {
422422
// Non-ADT derive is an error, but it should have been
423423
// set earlier; see
424424
// libsyntax/ext/expand.rs:MacroExpander::expand()
425-
return;
425+
return Vec::new();
426426
}
427427
};
428428
let is_always_copy =
@@ -453,7 +453,7 @@ impl<'a> TraitDef<'a> {
453453
} else {
454454
cx.span_err(mitem.span,
455455
"this trait cannot be derived for unions");
456-
return;
456+
return Vec::new();
457457
}
458458
}
459459
_ => unreachable!(),
@@ -468,13 +468,13 @@ impl<'a> TraitDef<'a> {
468468
.contains(&a.name_or_empty())
469469
})
470470
.cloned());
471-
push(Annotatable::Item(P(ast::Item { attrs: attrs, ..(*newitem).clone() })))
471+
vec![Annotatable::Item(P(ast::Item { attrs: attrs, ..(*newitem).clone() }))]
472472
}
473473
_ => {
474474
// Non-Item derive is an error, but it should have been
475475
// set earlier; see
476476
// libsyntax/ext/expand.rs:MacroExpander::expand()
477-
return;
477+
Vec::new()
478478
}
479479
}
480480
}

0 commit comments

Comments
 (0)