Skip to content

Commit 399da7b

Browse files
committed
expansion: Improve searchability for AstFragments methods
1 parent a127264 commit 399da7b

File tree

2 files changed

+65
-48
lines changed

2 files changed

+65
-48
lines changed

src/libsyntax/ext/expand.rs

Lines changed: 60 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,41 @@ use std::rc::Rc;
4141
use std::path::PathBuf;
4242

4343
macro_rules! ast_fragments {
44-
($($kind:ident: $ty:ty [$($vec:ident, $ty_elt:ty)*], $kind_name:expr, .$make:ident,
45-
$(.$fold:ident)* $(lift .$fold_elt:ident)*,
46-
$(.$visit:ident)* $(lift .$visit_elt:ident)*;)*) => {
44+
(
45+
$($Kind:ident($AstTy:ty) {
46+
$kind_name:expr;
47+
$(one fn $fold_ast:ident; fn $visit_ast:ident;)?
48+
$(many fn $fold_ast_elt:ident; fn $visit_ast_elt:ident;)?
49+
fn $make_ast:ident;
50+
})*
51+
) => {
4752
/// A fragment of AST that can be produced by a single macro expansion.
4853
/// Can also serve as an input and intermediate result for macro expansion operations.
49-
pub enum AstFragment { OptExpr(Option<P<ast::Expr>>), $( $kind($ty), )* }
54+
pub enum AstFragment {
55+
OptExpr(Option<P<ast::Expr>>),
56+
$($Kind($AstTy),)*
57+
}
5058

5159
/// "Discriminant" of an AST fragment.
5260
#[derive(Copy, Clone, PartialEq, Eq)]
53-
pub enum AstFragmentKind { OptExpr, $( $kind, )* }
61+
pub enum AstFragmentKind {
62+
OptExpr,
63+
$($Kind,)*
64+
}
5465

5566
impl AstFragmentKind {
5667
pub fn name(self) -> &'static str {
5768
match self {
5869
AstFragmentKind::OptExpr => "expression",
59-
$( AstFragmentKind::$kind => $kind_name, )*
70+
$(AstFragmentKind::$Kind => $kind_name,)*
6071
}
6172
}
6273

6374
fn make_from<'a>(self, result: Box<MacResult + 'a>) -> Option<AstFragment> {
6475
match self {
6576
AstFragmentKind::OptExpr =>
6677
result.make_expr().map(Some).map(AstFragment::OptExpr),
67-
$( AstFragmentKind::$kind => result.$make().map(AstFragment::$kind), )*
78+
$(AstFragmentKind::$Kind => result.$make_ast().map(AstFragment::$Kind),)*
6879
}
6980
}
7081
}
@@ -76,70 +87,75 @@ macro_rules! ast_fragments {
7687
_ => panic!("AstFragment::make_* called on the wrong kind of fragment"),
7788
}
7889
}
79-
$( pub fn $make(self) -> $ty {
90+
91+
$(pub fn $make_ast(self) -> $AstTy {
8092
match self {
81-
AstFragment::$kind(ast) => ast,
93+
AstFragment::$Kind(ast) => ast,
8294
_ => panic!("AstFragment::make_* called on the wrong kind of fragment"),
8395
}
84-
} )*
96+
})*
8597

8698
pub fn fold_with<F: Folder>(self, folder: &mut F) -> Self {
87-
use self::AstFragment::*;
8899
match self {
89-
OptExpr(expr) => OptExpr(expr.and_then(|expr| folder.fold_opt_expr(expr))),
90-
$($( $kind(ast) => $kind(folder.$fold(ast)), )*)*
91-
$($( $kind(ast) => {
92-
$kind(ast.into_iter().flat_map(|ast| folder.$fold_elt(ast)).collect())
93-
}, )*)*
100+
AstFragment::OptExpr(expr) =>
101+
AstFragment::OptExpr(expr.and_then(|expr| folder.fold_opt_expr(expr))),
102+
$($(AstFragment::$Kind(ast) =>
103+
AstFragment::$Kind(folder.$fold_ast(ast)),)?)*
104+
$($(AstFragment::$Kind(ast) =>
105+
AstFragment::$Kind(ast.into_iter()
106+
.flat_map(|ast| folder.$fold_ast_elt(ast))
107+
.collect()),)?)*
94108
}
95109
}
96110

97111
pub fn visit_with<'a, V: Visitor<'a>>(&'a self, visitor: &mut V) {
98112
match *self {
99113
AstFragment::OptExpr(Some(ref expr)) => visitor.visit_expr(expr),
100114
AstFragment::OptExpr(None) => {}
101-
$($( AstFragment::$kind(ref ast) => visitor.$visit(ast), )*)*
102-
$($( AstFragment::$kind(ref ast) => for ast in &ast[..] {
103-
visitor.$visit_elt(ast);
104-
}, )*)*
115+
$($(AstFragment::$Kind(ref ast) => visitor.$visit_ast(ast),)?)*
116+
$($(AstFragment::$Kind(ref ast) => for ast_elt in &ast[..] {
117+
visitor.$visit_ast_elt(ast_elt);
118+
})?)*
105119
}
106120
}
107121
}
108122

109123
impl<'a, 'b> Folder for MacroExpander<'a, 'b> {
110124
fn fold_opt_expr(&mut self, expr: P<ast::Expr>) -> Option<P<ast::Expr>> {
111-
self.expand(AstFragment::OptExpr(Some(expr))).make_opt_expr()
125+
self.expand_fragment(AstFragment::OptExpr(Some(expr))).make_opt_expr()
112126
}
113-
$($(fn $fold(&mut self, node: $ty) -> $ty {
114-
self.expand(AstFragment::$kind(node)).$make()
115-
})*)*
116-
$($(fn $fold_elt(&mut self, node: $ty_elt) -> $ty {
117-
self.expand(AstFragment::$kind(SmallVector::one(node))).$make()
118-
})*)*
127+
$($(fn $fold_ast(&mut self, ast: $AstTy) -> $AstTy {
128+
self.expand_fragment(AstFragment::$Kind(ast)).$make_ast()
129+
})?)*
130+
$($(fn $fold_ast_elt(&mut self, ast_elt: <$AstTy as IntoIterator>::Item) -> $AstTy {
131+
self.expand_fragment(AstFragment::$Kind(SmallVector::one(ast_elt))).$make_ast()
132+
})?)*
119133
}
120134

121135
impl<'a> MacResult for ::ext::tt::macro_rules::ParserAnyMacro<'a> {
122-
$(fn $make(self: Box<::ext::tt::macro_rules::ParserAnyMacro<'a>>) -> Option<$ty> {
123-
Some(self.make(AstFragmentKind::$kind).$make())
136+
$(fn $make_ast(self: Box<::ext::tt::macro_rules::ParserAnyMacro<'a>>)
137+
-> Option<$AstTy> {
138+
Some(self.make(AstFragmentKind::$Kind).$make_ast())
124139
})*
125140
}
126141
}
127142
}
128143

129144
ast_fragments! {
130-
Expr: P<ast::Expr> [], "expression", .make_expr, .fold_expr, .visit_expr;
131-
Pat: P<ast::Pat> [], "pattern", .make_pat, .fold_pat, .visit_pat;
132-
Ty: P<ast::Ty> [], "type", .make_ty, .fold_ty, .visit_ty;
133-
Stmts: SmallVector<ast::Stmt> [SmallVector, ast::Stmt],
134-
"statement", .make_stmts, lift .fold_stmt, lift .visit_stmt;
135-
Items: SmallVector<P<ast::Item>> [SmallVector, P<ast::Item>],
136-
"item", .make_items, lift .fold_item, lift .visit_item;
137-
TraitItems: SmallVector<ast::TraitItem> [SmallVector, ast::TraitItem],
138-
"trait item", .make_trait_items, lift .fold_trait_item, lift .visit_trait_item;
139-
ImplItems: SmallVector<ast::ImplItem> [SmallVector, ast::ImplItem],
140-
"impl item", .make_impl_items, lift .fold_impl_item, lift .visit_impl_item;
141-
ForeignItems: SmallVector<ast::ForeignItem> [SmallVector, ast::ForeignItem],
142-
"foreign item", .make_foreign_items, lift .fold_foreign_item, lift .visit_foreign_item;
145+
Expr(P<ast::Expr>) { "expression"; one fn fold_expr; fn visit_expr; fn make_expr; }
146+
Pat(P<ast::Pat>) { "pattern"; one fn fold_pat; fn visit_pat; fn make_pat; }
147+
Ty(P<ast::Ty>) { "type"; one fn fold_ty; fn visit_ty; fn make_ty; }
148+
Stmts(SmallVector<ast::Stmt>) { "statement"; many fn fold_stmt; fn visit_stmt; fn make_stmts; }
149+
Items(SmallVector<P<ast::Item>>) { "item"; many fn fold_item; fn visit_item; fn make_items; }
150+
TraitItems(SmallVector<ast::TraitItem>) {
151+
"trait item"; many fn fold_trait_item; fn visit_trait_item; fn make_trait_items;
152+
}
153+
ImplItems(SmallVector<ast::ImplItem>) {
154+
"impl item"; many fn fold_impl_item; fn visit_impl_item; fn make_impl_items;
155+
}
156+
ForeignItems(SmallVector<ast::ForeignItem>) {
157+
"foreign item"; many fn fold_foreign_item; fn visit_foreign_item; fn make_foreign_items;
158+
}
143159
}
144160

145161
impl AstFragmentKind {
@@ -261,7 +277,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
261277
tokens: None,
262278
})));
263279

264-
match self.expand(krate_item).make_items().pop().map(P::into_inner) {
280+
match self.expand_fragment(krate_item).make_items().pop().map(P::into_inner) {
265281
Some(ast::Item { attrs, node: ast::ItemKind::Mod(module), .. }) => {
266282
krate.attrs = attrs;
267283
krate.module = module;
@@ -281,7 +297,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
281297
}
282298

283299
// Fully expand all macro invocations in this AST fragment.
284-
fn expand(&mut self, input_fragment: AstFragment) -> AstFragment {
300+
fn expand_fragment(&mut self, input_fragment: AstFragment) -> AstFragment {
285301
let orig_expansion_data = self.cx.current_expansion.clone();
286302
self.cx.current_expansion.depth = 0;
287303

src/libsyntax/lib.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
html_root_url = "https://doc.rust-lang.org/nightly/",
2020
test(attr(deny(warnings))))]
2121

22-
#![feature(unicode_internals)]
23-
#![feature(rustc_diagnostic_macros)]
24-
#![feature(slice_sort_by_cached_key)]
2522
#![feature(const_atomic_usize_new)]
23+
#![feature(crate_visibility_modifier)]
24+
#![feature(macro_at_most_once_rep)]
2625
#![feature(rustc_attrs)]
26+
#![feature(rustc_diagnostic_macros)]
27+
#![feature(slice_sort_by_cached_key)]
2728
#![feature(str_escape)]
28-
#![feature(crate_visibility_modifier)]
29+
#![feature(unicode_internals)]
2930

3031
#![recursion_limit="256"]
3132

0 commit comments

Comments
 (0)