Skip to content

Commit 415fde4

Browse files
intravisit: Fold functionality of IdVisitor into the regular Visitor.
1 parent d9a911d commit 415fde4

File tree

16 files changed

+119
-233
lines changed

16 files changed

+119
-233
lines changed

src/librustc/hir/intravisit.rs

+67-188
Large diffs are not rendered by default.

src/librustc/hir/map/collector.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
197197
fn visit_fn(&mut self, fk: intravisit::FnKind<'ast>, fd: &'ast FnDecl,
198198
b: &'ast Block, s: Span, id: NodeId) {
199199
assert_eq!(self.parent_node, id);
200-
intravisit::walk_fn(self, fk, fd, b, s);
200+
intravisit::walk_fn(self, fk, fd, b, s, id);
201201
}
202202

203203
fn visit_block(&mut self, block: &'ast Block) {

src/librustc/hir/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1362,9 +1362,9 @@ pub enum ViewPath_ {
13621362
/// TraitRef's appear in impls.
13631363
///
13641364
/// resolve maps each TraitRef's ref_id to its defining trait; that's all
1365-
/// that the ref_id is for. The impl_id maps to the "self type" of this impl.
1366-
/// If this impl is an ItemImpl, the impl_id is redundant (it could be the
1367-
/// same as the impl's node id).
1365+
/// that the ref_id is for. Note that ref_id's value is not the NodeId of the
1366+
/// trait being referred to but just a unique NodeId that serves as a key
1367+
/// within the DefMap.
13681368
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
13691369
pub struct TraitRef {
13701370
pub path: Path,

src/librustc/lint/context.rs

+25-11
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ use syntax_pos::Span;
4545
use errors::DiagnosticBuilder;
4646
use hir;
4747
use hir::intravisit as hir_visit;
48-
use hir::intravisit::{IdVisitor, IdVisitingOperation};
4948
use syntax::visit as ast_visit;
5049

5150
/// Information about the registered lints.
@@ -663,9 +662,11 @@ impl<'a, 'tcx> LateContext<'a, 'tcx> {
663662
}
664663

665664
fn visit_ids<F>(&mut self, f: F)
666-
where F: FnOnce(&mut IdVisitor<LateContext>)
665+
where F: FnOnce(&mut IdVisitor)
667666
{
668-
let mut v = IdVisitor::new(self);
667+
let mut v = IdVisitor {
668+
cx: self
669+
};
669670
f(&mut v);
670671
}
671672
}
@@ -779,7 +780,7 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
779780
fn visit_fn(&mut self, fk: hir_visit::FnKind<'v>, decl: &'v hir::FnDecl,
780781
body: &'v hir::Block, span: Span, id: ast::NodeId) {
781782
run_lints!(self, check_fn, late_passes, fk, decl, body, span, id);
782-
hir_visit::walk_fn(self, fk, decl, body, span);
783+
hir_visit::walk_fn(self, fk, decl, body, span, id);
783784
run_lints!(self, check_fn_post, late_passes, fk, decl, body, span, id);
784785
}
785786

@@ -820,7 +821,7 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
820821

821822
fn visit_mod(&mut self, m: &hir::Mod, s: Span, n: ast::NodeId) {
822823
run_lints!(self, check_mod, late_passes, m, s, n);
823-
hir_visit::walk_mod(self, m);
824+
hir_visit::walk_mod(self, m, n);
824825
run_lints!(self, check_mod_post, late_passes, m, s, n);
825826
}
826827

@@ -859,7 +860,7 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
859860
fn visit_trait_item(&mut self, trait_item: &hir::TraitItem) {
860861
self.with_lint_attrs(&trait_item.attrs, |cx| {
861862
run_lints!(cx, check_trait_item, late_passes, trait_item);
862-
cx.visit_ids(|v| v.visit_trait_item(trait_item));
863+
cx.visit_ids(|v| hir_visit::walk_trait_item(v, trait_item));
863864
hir_visit::walk_trait_item(cx, trait_item);
864865
run_lints!(cx, check_trait_item_post, late_passes, trait_item);
865866
});
@@ -868,7 +869,7 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
868869
fn visit_impl_item(&mut self, impl_item: &hir::ImplItem) {
869870
self.with_lint_attrs(&impl_item.attrs, |cx| {
870871
run_lints!(cx, check_impl_item, late_passes, impl_item);
871-
cx.visit_ids(|v| v.visit_impl_item(impl_item));
872+
cx.visit_ids(|v| hir_visit::walk_impl_item(v, impl_item));
872873
hir_visit::walk_impl_item(cx, impl_item);
873874
run_lints!(cx, check_impl_item_post, late_passes, impl_item);
874875
});
@@ -1046,16 +1047,30 @@ impl<'a> ast_visit::Visitor for EarlyContext<'a> {
10461047
}
10471048
}
10481049

1050+
struct IdVisitor<'a, 'b: 'a, 'tcx: 'a+'b> {
1051+
cx: &'a mut LateContext<'b, 'tcx>
1052+
}
1053+
10491054
// Output any lints that were previously added to the session.
1050-
impl<'a, 'tcx> IdVisitingOperation for LateContext<'a, 'tcx> {
1055+
impl<'a, 'b, 'tcx, 'v> hir_visit::Visitor<'v> for IdVisitor<'a, 'b, 'tcx> {
1056+
10511057
fn visit_id(&mut self, id: ast::NodeId) {
1052-
if let Some(lints) = self.sess().lints.borrow_mut().remove(&id) {
1058+
if let Some(lints) = self.cx.sess().lints.borrow_mut().remove(&id) {
10531059
debug!("LateContext::visit_id: id={:?} lints={:?}", id, lints);
10541060
for (lint_id, span, msg) in lints {
1055-
self.span_lint(lint_id.lint, span, &msg[..])
1061+
self.cx.span_lint(lint_id.lint, span, &msg[..])
10561062
}
10571063
}
10581064
}
1065+
1066+
fn visit_trait_item(&mut self, _ti: &hir::TraitItem) {
1067+
// Do not recurse into trait or impl items automatically. These are
1068+
// processed separately by calling hir_visit::walk_trait_item()
1069+
}
1070+
1071+
fn visit_impl_item(&mut self, _ii: &hir::ImplItem) {
1072+
// See visit_trait_item()
1073+
}
10591074
}
10601075

10611076
enum CheckLintNameResult {
@@ -1172,7 +1187,6 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
11721187

11731188
// Visit the whole crate.
11741189
cx.with_lint_attrs(&krate.attrs, |cx| {
1175-
cx.visit_id(ast::CRATE_NODE_ID);
11761190
cx.visit_ids(|v| {
11771191
hir_visit::walk_crate(v, krate);
11781192
});

src/librustc/middle/cstore.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use syntax::parse::token::InternedString;
4444
use syntax_pos::Span;
4545
use rustc_back::target::Target;
4646
use hir;
47-
use hir::intravisit::{IdVisitor, IdVisitingOperation, Visitor};
47+
use hir::intravisit::Visitor;
4848

4949
pub use self::DefLike::{DlDef, DlField, DlImpl};
5050
pub use self::NativeLibraryKind::{NativeStatic, NativeFramework, NativeUnknown};
@@ -292,11 +292,6 @@ impl InlinedItem {
292292
InlinedItem::ImplItem(_, ref ii) => visitor.visit_impl_item(ii),
293293
}
294294
}
295-
296-
pub fn visit_ids<O: IdVisitingOperation>(&self, operation: &mut O) {
297-
let mut id_visitor = IdVisitor::new(operation);
298-
self.visit(&mut id_visitor);
299-
}
300295
}
301296

302297
// FIXME: find a better place for this?

src/librustc/middle/effect.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl<'a, 'tcx> EffectCheckVisitor<'a, 'tcx> {
7979

8080
impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> {
8181
fn visit_fn(&mut self, fn_kind: FnKind<'v>, fn_decl: &'v hir::FnDecl,
82-
block: &'v hir::Block, span: Span, _: ast::NodeId) {
82+
block: &'v hir::Block, span: Span, id: ast::NodeId) {
8383

8484
let (is_item_fn, is_unsafe_fn) = match fn_kind {
8585
FnKind::ItemFn(_, _, unsafety, _, _, _, _) =>
@@ -96,7 +96,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> {
9696
self.unsafe_context = UnsafeContext::new(SafeContext)
9797
}
9898

99-
intravisit::walk_fn(self, fn_kind, fn_decl, block, span);
99+
intravisit::walk_fn(self, fn_kind, fn_decl, block, span, id);
100100

101101
self.unsafe_context = old_unsafe_context
102102
}

src/librustc/middle/liveness.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ fn visit_fn(ir: &mut IrMaps,
390390

391391
// gather up the various local variables, significant expressions,
392392
// and so forth:
393-
intravisit::walk_fn(&mut fn_maps, fk, decl, body, sp);
393+
intravisit::walk_fn(&mut fn_maps, fk, decl, body, sp, id);
394394

395395
// Special nodes and variables:
396396
// - exit_ln represents the end of the fn, either by return or panic

src/librustc_borrowck/borrowck/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ fn borrowck_fn(this: &mut BorrowckCtxt,
197197
decl,
198198
body);
199199

200-
intravisit::walk_fn(this, fk, decl, body, sp);
200+
intravisit::walk_fn(this, fk, decl, body, sp, id);
201201
}
202202

203203
fn build_borrowck_dataflow_data<'a, 'tcx>(this: &mut BorrowckCtxt<'a, 'tcx>,

src/librustc_const_eval/check_match.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use std::iter::{FromIterator, IntoIterator, repeat};
3434

3535
use rustc::hir;
3636
use rustc::hir::{Pat, PatKind};
37-
use rustc::hir::intravisit::{self, IdVisitor, IdVisitingOperation, Visitor, FnKind};
37+
use rustc::hir::intravisit::{self, Visitor, FnKind};
3838
use rustc_back::slice;
3939

4040
use syntax::ast::{self, DUMMY_NODE_ID, NodeId};
@@ -474,7 +474,7 @@ struct RenamingRecorder<'map> {
474474
renaming_map: &'map mut FnvHashMap<(NodeId, Span), NodeId>
475475
}
476476

477-
impl<'map> IdVisitingOperation for RenamingRecorder<'map> {
477+
impl<'v, 'map> Visitor<'v> for RenamingRecorder<'map> {
478478
fn visit_id(&mut self, node_id: NodeId) {
479479
let key = (node_id, self.origin_span);
480480
self.renaming_map.insert(key, self.substituted_node_id);
@@ -529,9 +529,7 @@ impl<'a, 'tcx> Folder for StaticInliner<'a, 'tcx> {
529529
renaming_map: renaming_map,
530530
};
531531

532-
let mut id_visitor = IdVisitor::new(&mut renaming_recorder);
533-
534-
id_visitor.visit_expr(const_expr);
532+
renaming_recorder.visit_expr(const_expr);
535533
}
536534
}
537535
}
@@ -1049,7 +1047,7 @@ fn check_fn(cx: &mut MatchCheckCtxt,
10491047
_ => cx.param_env = ParameterEnvironment::for_item(cx.tcx, fn_id),
10501048
}
10511049

1052-
intravisit::walk_fn(cx, kind, decl, body, sp);
1050+
intravisit::walk_fn(cx, kind, decl, body, sp, fn_id);
10531051

10541052
for input in &decl.inputs {
10551053
check_irrefutable(cx, &input.pat, true);

src/librustc_incremental/calculate_svh.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,9 @@ mod svh_visitor {
384384
SawItem.hash(self.st); visit::walk_item(self, i)
385385
}
386386

387-
fn visit_mod(&mut self, m: &'a Mod, _s: Span, _n: NodeId) {
387+
fn visit_mod(&mut self, m: &'a Mod, _s: Span, n: NodeId) {
388388
debug!("visit_mod: st={:?}", self.st);
389-
SawMod.hash(self.st); visit::walk_mod(self, m)
389+
SawMod.hash(self.st); visit::walk_mod(self, m, n)
390390
}
391391

392392
fn visit_decl(&mut self, d: &'a Decl) {
@@ -405,9 +405,9 @@ mod svh_visitor {
405405
}
406406

407407
fn visit_fn(&mut self, fk: FnKind<'a>, fd: &'a FnDecl,
408-
b: &'a Block, s: Span, _: NodeId) {
408+
b: &'a Block, s: Span, n: NodeId) {
409409
debug!("visit_fn: st={:?}", self.st);
410-
SawFn.hash(self.st); visit::walk_fn(self, fk, fd, b, s)
410+
SawFn.hash(self.st); visit::walk_fn(self, fk, fd, b, s, n)
411411
}
412412

413413
fn visit_trait_item(&mut self, ti: &'a TraitItem) {

src/librustc_metadata/astencode.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc::session::Session;
1818
use rustc::hir;
1919
use rustc::hir::fold;
2020
use rustc::hir::fold::Folder;
21-
use rustc::hir::intravisit::{IdRange, IdRangeComputingVisitor, IdVisitingOperation};
21+
use rustc::hir::intravisit::{Visitor, IdRangeComputingVisitor, IdRange};
2222

2323
use common as c;
2424
use cstore;
@@ -693,7 +693,7 @@ struct SideTableEncodingIdVisitor<'a, 'b:'a, 'c:'a, 'tcx:'c> {
693693
rbml_w: &'a mut Encoder<'b>,
694694
}
695695

696-
impl<'a, 'b, 'c, 'tcx> IdVisitingOperation for
696+
impl<'a, 'b, 'c, 'tcx, 'v> Visitor<'v> for
697697
SideTableEncodingIdVisitor<'a, 'b, 'c, 'tcx> {
698698
fn visit_id(&mut self, id: ast::NodeId) {
699699
encode_side_tables_for_id(self.ecx, self.rbml_w, id)
@@ -704,7 +704,7 @@ fn encode_side_tables_for_ii(ecx: &e::EncodeContext,
704704
rbml_w: &mut Encoder,
705705
ii: &InlinedItem) {
706706
rbml_w.start_tag(c::tag_table as usize);
707-
ii.visit_ids(&mut SideTableEncodingIdVisitor {
707+
ii.visit(&mut SideTableEncodingIdVisitor {
708708
ecx: ecx,
709709
rbml_w: rbml_w
710710
});
@@ -1242,9 +1242,9 @@ fn copy_item_types(dcx: &DecodeContext, ii: &InlinedItem, orig_did: DefId) {
12421242
}
12431243
}
12441244

1245-
fn inlined_item_id_range(v: &InlinedItem) -> IdRange {
1245+
fn inlined_item_id_range(ii: &InlinedItem) -> IdRange {
12461246
let mut visitor = IdRangeComputingVisitor::new();
1247-
v.visit_ids(&mut visitor);
1247+
ii.visit(&mut visitor);
12481248
visitor.result()
12491249
}
12501250

src/librustc_mir/mir_map.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BuildMir<'a, 'tcx> {
250250
build::construct_fn(cx, id, arguments, fn_sig.output, body)
251251
});
252252

253-
intravisit::walk_fn(self, fk, decl, body, span);
253+
intravisit::walk_fn(self, fk, decl, body, span, id);
254254
}
255255
}
256256

src/librustc_passes/consts.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ impl<'a, 'gcx> CheckCrateVisitor<'a, 'gcx> {
158158

159159
let qualif = self.with_mode(mode, |this| {
160160
this.with_euv(Some(fn_id), |euv| euv.walk_fn(fd, b));
161-
intravisit::walk_fn(this, fk, fd, b, s);
161+
intravisit::walk_fn(this, fk, fd, b, s, fn_id);
162162
this.qualif
163163
});
164164

src/librustc_passes/rvalues.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl<'a, 'tcx, 'v> intravisit::Visitor<'v> for RvalueContext<'a, 'tcx> {
4949
let mut euv = euv::ExprUseVisitor::new(&mut delegate, &infcx);
5050
euv.walk_fn(fd, b);
5151
});
52-
intravisit::walk_fn(self, fk, fd, b, s)
52+
intravisit::walk_fn(self, fk, fd, b, s, fn_id)
5353
}
5454
}
5555

src/librustc_privacy/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EmbargoVisitor<'a, 'tcx> {
291291
}
292292
}
293293

294-
intravisit::walk_mod(self, m);
294+
intravisit::walk_mod(self, m, id);
295295
}
296296

297297
fn visit_macro_def(&mut self, md: &'v hir::MacroDef) {

src/librustc_typeck/check/upvar.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ impl<'a, 'gcx, 'tcx, 'v> Visitor<'v> for AdjustBorrowKind<'a, 'gcx, 'tcx> {
503503
span: Span,
504504
id: ast::NodeId)
505505
{
506-
intravisit::walk_fn(self, fn_kind, decl, body, span);
506+
intravisit::walk_fn(self, fn_kind, decl, body, span, id);
507507
self.analyze_closure(id, span, decl, body);
508508
}
509509
}

0 commit comments

Comments
 (0)