Skip to content

Commit f0310e0

Browse files
committed
Rollup merge of rust-lang#34213 - josephDunne:trait_item_macros, r=jseyfried
**syntax-[breaking-change]** cc rust-lang#31645 New `TraitItemKind::Macro` variant This change adds support for macro expansion inside trait items by adding the new `TraitItemKind::Macro` and associated parsing code.
2 parents b8214dc + dc3d878 commit f0310e0

File tree

15 files changed

+240
-88
lines changed

15 files changed

+240
-88
lines changed

src/librustc/hir/lowering.rs

+1
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ impl<'a> LoweringContext<'a> {
683683
hir::TypeTraitItem(this.lower_bounds(bounds),
684684
default.as_ref().map(|x| this.lower_ty(x)))
685685
}
686+
TraitItemKind::Macro(..) => panic!("Shouldn't exist any more"),
686687
},
687688
span: i.span,
688689
}

src/librustc/hir/map/def_collector.rs

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
204204
TraitItemKind::Method(..) | TraitItemKind::Const(..) =>
205205
DefPathData::ValueNs(ti.ident.name),
206206
TraitItemKind::Type(..) => DefPathData::TypeNs(ti.ident.name),
207+
TraitItemKind::Macro(..) => DefPathData::MacroDef(ti.ident.name),
207208
};
208209

209210
let def = self.create_def(ti.id, def_data);

src/librustc_resolve/build_reduced_graph.rs

+1
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ impl<'b> Resolver<'b> {
313313
(Def::Method(item_def_id), ValueNS)
314314
}
315315
TraitItemKind::Type(..) => (Def::AssociatedTy(def_id, item_def_id), TypeNS),
316+
TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
316317
};
317318

318319
self.define(module_parent, item.ident.name, ns, (def, item.span, vis));

src/librustc_resolve/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,7 @@ impl<'a> Resolver<'a> {
16371637
visit::walk_trait_item(this, trait_item)
16381638
});
16391639
}
1640+
TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
16401641
};
16411642
}
16421643
});

src/librustc_save_analysis/dump_visitor.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,8 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
12151215
trait_item.span);
12161216
}
12171217
ast::TraitItemKind::Const(_, None) |
1218-
ast::TraitItemKind::Type(..) => {}
1218+
ast::TraitItemKind::Type(..) |
1219+
ast::TraitItemKind::Macro(_) => {}
12191220
}
12201221
}
12211222

src/libsyntax/ast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,7 @@ pub enum TraitItemKind {
14301430
Const(P<Ty>, Option<P<Expr>>),
14311431
Method(MethodSig, Option<P<Block>>),
14321432
Type(TyParamBounds, Option<P<Ty>>),
1433+
Macro(Mac),
14331434
}
14341435

14351436
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]

src/libsyntax/ext/base.rs

+18
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ pub trait MacResult {
241241
None
242242
}
243243

244+
/// Create zero or more trait items.
245+
fn make_trait_items(self: Box<Self>) -> Option<SmallVector<ast::TraitItem>> {
246+
None
247+
}
248+
244249
/// Create a pattern.
245250
fn make_pat(self: Box<Self>) -> Option<P<ast::Pat>> {
246251
None
@@ -288,6 +293,7 @@ make_MacEager! {
288293
pat: P<ast::Pat>,
289294
items: SmallVector<P<ast::Item>>,
290295
impl_items: SmallVector<ast::ImplItem>,
296+
trait_items: SmallVector<ast::TraitItem>,
291297
stmts: SmallVector<ast::Stmt>,
292298
ty: P<ast::Ty>,
293299
}
@@ -305,6 +311,10 @@ impl MacResult for MacEager {
305311
self.impl_items
306312
}
307313

314+
fn make_trait_items(self: Box<Self>) -> Option<SmallVector<ast::TraitItem>> {
315+
self.trait_items
316+
}
317+
308318
fn make_stmts(self: Box<Self>) -> Option<SmallVector<ast::Stmt>> {
309319
match self.stmts.as_ref().map_or(0, |s| s.len()) {
310320
0 => make_stmts_default!(self),
@@ -413,6 +423,14 @@ impl MacResult for DummyResult {
413423
}
414424
}
415425

426+
fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVector<ast::TraitItem>> {
427+
if self.expr_only {
428+
None
429+
} else {
430+
Some(SmallVector::zero())
431+
}
432+
}
433+
416434
fn make_stmts(self: Box<DummyResult>) -> Option<SmallVector<ast::Stmt>> {
417435
Some(SmallVector::one(
418436
codemap::respan(self.span,

src/libsyntax/ext/expand.rs

+33-20
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,11 @@ impl_macro_generable! {
8181
"statement", .make_stmts, lift .fold_stmt, lift .visit_stmt, |_span| SmallVector::zero();
8282
SmallVector<P<ast::Item>>:
8383
"item", .make_items, lift .fold_item, lift .visit_item, |_span| SmallVector::zero();
84+
SmallVector<ast::TraitItem>:
85+
"trait item", .make_trait_items, lift .fold_trait_item, lift .visit_trait_item,
86+
|_span| SmallVector::zero();
8487
SmallVector<ast::ImplItem>:
85-
"impl item", .make_impl_items, lift .fold_impl_item, lift .visit_impl_item,
88+
"impl item", .make_impl_items, lift .fold_impl_item, lift .visit_impl_item,
8689
|_span| SmallVector::zero();
8790
}
8891

@@ -754,25 +757,10 @@ fn expand_multi_modified(a: Annotatable, fld: &mut MacroExpander) -> SmallVector
754757
_ => noop_fold_item(it, fld),
755758
}.into_iter().map(|i| Annotatable::Item(i)).collect(),
756759

757-
Annotatable::TraitItem(it) => match it.node {
758-
ast::TraitItemKind::Method(_, Some(_)) => {
759-
let ti = it.unwrap();
760-
SmallVector::one(ast::TraitItem {
761-
id: ti.id,
762-
ident: ti.ident,
763-
attrs: ti.attrs,
764-
node: match ti.node {
765-
ast::TraitItemKind::Method(sig, Some(body)) => {
766-
let (sig, body) = expand_and_rename_method(sig, body, fld);
767-
ast::TraitItemKind::Method(sig, Some(body))
768-
}
769-
_ => unreachable!()
770-
},
771-
span: ti.span,
772-
})
773-
}
774-
_ => fold::noop_fold_trait_item(it.unwrap(), fld)
775-
}.into_iter().map(|ti| Annotatable::TraitItem(P(ti))).collect(),
760+
Annotatable::TraitItem(it) => {
761+
expand_trait_item(it.unwrap(), fld).into_iter().
762+
map(|it| Annotatable::TraitItem(P(it))).collect()
763+
}
776764

777765
Annotatable::ImplItem(ii) => {
778766
expand_impl_item(ii.unwrap(), fld).into_iter().
@@ -900,6 +888,31 @@ fn expand_impl_item(ii: ast::ImplItem, fld: &mut MacroExpander)
900888
}
901889
}
902890

891+
fn expand_trait_item(ti: ast::TraitItem, fld: &mut MacroExpander)
892+
-> SmallVector<ast::TraitItem> {
893+
match ti.node {
894+
ast::TraitItemKind::Method(_, Some(_)) => {
895+
SmallVector::one(ast::TraitItem {
896+
id: ti.id,
897+
ident: ti.ident,
898+
attrs: ti.attrs,
899+
node: match ti.node {
900+
ast::TraitItemKind::Method(sig, Some(body)) => {
901+
let (sig, body) = expand_and_rename_method(sig, body, fld);
902+
ast::TraitItemKind::Method(sig, Some(body))
903+
}
904+
_ => unreachable!()
905+
},
906+
span: ti.span,
907+
})
908+
}
909+
ast::TraitItemKind::Macro(mac) => {
910+
expand_mac_invoc(mac, None, ti.attrs, ti.span, fld)
911+
}
912+
_ => fold::noop_fold_trait_item(ti, fld)
913+
}
914+
}
915+
903916
/// Given a fn_decl and a block and a MacroExpander, expand the fn_decl, then use the
904917
/// PatIdents in its arguments to perform renaming in the FnDecl and
905918
/// the block, returning both the new FnDecl and the new Block.

src/libsyntax/ext/tt/macro_rules.rs

+15
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,21 @@ impl<'a> MacResult for ParserAnyMacro<'a> {
100100
Some(ret)
101101
}
102102

103+
fn make_trait_items(self: Box<ParserAnyMacro<'a>>)
104+
-> Option<SmallVector<ast::TraitItem>> {
105+
let mut ret = SmallVector::zero();
106+
loop {
107+
let mut parser = self.parser.borrow_mut();
108+
match parser.token {
109+
token::Eof => break,
110+
_ => ret.push(panictry!(parser.parse_trait_item()))
111+
}
112+
}
113+
self.ensure_complete_parse(false, "item");
114+
Some(ret)
115+
}
116+
117+
103118
fn make_stmts(self: Box<ParserAnyMacro<'a>>)
104119
-> Option<SmallVector<ast::Stmt>> {
105120
let mut ret = SmallVector::zero();

src/libsyntax/fold.rs

+3
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,9 @@ pub fn noop_fold_trait_item<T: Folder>(i: TraitItem, folder: &mut T)
945945
TraitItemKind::Type(folder.fold_bounds(bounds),
946946
default.map(|x| folder.fold_ty(x)))
947947
}
948+
ast::TraitItemKind::Macro(mac) => {
949+
TraitItemKind::Macro(folder.fold_mac(mac))
950+
}
948951
},
949952
span: folder.new_span(i.span)
950953
})

0 commit comments

Comments
 (0)