Skip to content

Commit fc9ecae

Browse files
committed
Modify the callback to be run from a macro
1 parent fdba872 commit fc9ecae

File tree

1 file changed

+17
-30
lines changed

1 file changed

+17
-30
lines changed

src/librustc_resolve/lib.rs

+17-30
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ mod record_exports;
108108
mod build_reduced_graph;
109109
mod resolve_imports;
110110

111+
// Perform the callback, not walking deeper if the return is true
112+
macro_rules! execute_callback {
113+
($node: expr, $walker: expr) => (
114+
if let Some(ref callback) = $walker.callback {
115+
if callback($node, &mut $walker.resolved) {
116+
return;
117+
}
118+
}
119+
)
120+
}
121+
111122
pub enum ResolutionError<'a> {
112123
/// error E0401: can't use type parameters from outer function
113124
TypeParametersFromOuterFunction,
@@ -445,38 +456,22 @@ enum NameDefinition {
445456

446457
impl<'a, 'v, 'tcx> Visitor<'v> for Resolver<'a, 'tcx> {
447458
fn visit_item(&mut self, item: &Item) {
448-
if let Some(ref callback) = self.callback {
449-
if callback(ast_map::Node::NodeItem(item), &mut self.resolved) {
450-
return;
451-
}
452-
}
459+
execute_callback!(ast_map::Node::NodeItem(item), self);
453460
self.resolve_item(item);
454461
}
455462
fn visit_arm(&mut self, arm: &Arm) {
456463
self.resolve_arm(arm);
457464
}
458465
fn visit_block(&mut self, block: &Block) {
459-
if let Some(ref callback) = self.callback {
460-
if callback(ast_map::Node::NodeBlock(block), &mut self.resolved) {
461-
return;
462-
}
463-
}
466+
execute_callback!(ast_map::Node::NodeBlock(block), self);
464467
self.resolve_block(block);
465468
}
466469
fn visit_expr(&mut self, expr: &Expr) {
467-
if let Some(ref callback) = self.callback {
468-
if callback(ast_map::Node::NodeExpr(expr), &mut self.resolved) {
469-
return;
470-
}
471-
}
470+
execute_callback!(ast_map::Node::NodeExpr(expr), self);
472471
self.resolve_expr(expr);
473472
}
474473
fn visit_local(&mut self, local: &Local) {
475-
if let Some(ref callback) = self.callback {
476-
if callback(ast_map::Node::NodeLocal(&*local.pat), &mut self.resolved) {
477-
return;
478-
}
479-
}
474+
execute_callback!(ast_map::Node::NodeLocal(&*local.pat), self);
480475
self.resolve_local(local);
481476
}
482477
fn visit_ty(&mut self, ty: &Ty) {
@@ -495,11 +490,7 @@ impl<'a, 'v, 'tcx> Visitor<'v> for Resolver<'a, 'tcx> {
495490
visit::walk_poly_trait_ref(self, tref, m);
496491
}
497492
fn visit_variant(&mut self, variant: &ast::Variant, generics: &Generics) {
498-
if let Some(ref callback) = self.callback {
499-
if callback(ast_map::Node::NodeVariant(variant), &mut self.resolved) {
500-
return;
501-
}
502-
}
493+
execute_callback!(ast_map::Node::NodeVariant(variant), self);
503494
if let Some(ref dis_expr) = variant.node.disr_expr {
504495
// resolve the discriminator expr as a constant
505496
self.with_constant_rib(|this| {
@@ -523,11 +514,7 @@ impl<'a, 'v, 'tcx> Visitor<'v> for Resolver<'a, 'tcx> {
523514
}
524515
}
525516
fn visit_foreign_item(&mut self, foreign_item: &ast::ForeignItem) {
526-
if let Some(ref callback) = self.callback {
527-
if callback(ast_map::Node::NodeForeignItem(foreign_item), &mut self.resolved) {
528-
return;
529-
}
530-
}
517+
execute_callback!(ast_map::Node::NodeForeignItem(foreign_item), self);
531518
let type_parameters = match foreign_item.node {
532519
ForeignItemFn(_, ref generics) => {
533520
HasTypeParameters(generics, FnSpace, ItemRibKind)

0 commit comments

Comments
 (0)