Skip to content

Commit 0c37d4b

Browse files
committed
refactoring
1 parent 84c3f89 commit 0c37d4b

File tree

3 files changed

+111
-141
lines changed

3 files changed

+111
-141
lines changed

src/librustc/hir/map/collector.rs

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ impl<'ast> NodeCollector<'ast> {
7070
let entry = MapEntry::from_node(self.parent_node, node);
7171
self.insert_entry(id, entry);
7272
}
73+
74+
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_id: NodeId, f: F) {
75+
let parent_node = self.parent_node;
76+
self.parent_node = parent_id;
77+
f(self);
78+
self.parent_node = parent_node;
79+
}
7380
}
7481

7582
impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
@@ -86,51 +93,48 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
8693

8794
self.insert(i.id, NodeItem(i));
8895

89-
let parent_node = self.parent_node;
90-
self.parent_node = i.id;
91-
92-
match i.node {
93-
ItemEnum(ref enum_definition, _) => {
94-
for v in &enum_definition.variants {
95-
self.insert(v.node.data.id(), NodeVariant(v));
96+
self.with_parent(i.id, |this| {
97+
match i.node {
98+
ItemEnum(ref enum_definition, _) => {
99+
for v in &enum_definition.variants {
100+
this.insert(v.node.data.id(), NodeVariant(v));
101+
}
96102
}
97-
}
98-
ItemStruct(ref struct_def, _) => {
99-
// If this is a tuple-like struct, register the constructor.
100-
if !struct_def.is_struct() {
101-
self.insert(struct_def.id(), NodeStructCtor(struct_def));
103+
ItemStruct(ref struct_def, _) => {
104+
// If this is a tuple-like struct, register the constructor.
105+
if !struct_def.is_struct() {
106+
this.insert(struct_def.id(), NodeStructCtor(struct_def));
107+
}
102108
}
103-
}
104-
ItemTrait(_, _, ref bounds, _) => {
105-
for b in bounds.iter() {
106-
if let TraitTyParamBound(ref t, TraitBoundModifier::None) = *b {
107-
self.insert(t.trait_ref.ref_id, NodeItem(i));
109+
ItemTrait(_, _, ref bounds, _) => {
110+
for b in bounds.iter() {
111+
if let TraitTyParamBound(ref t, TraitBoundModifier::None) = *b {
112+
this.insert(t.trait_ref.ref_id, NodeItem(i));
113+
}
108114
}
109115
}
110-
}
111-
ItemUse(ref view_path) => {
112-
match view_path.node {
113-
ViewPathList(_, ref paths) => {
114-
for path in paths {
115-
self.insert(path.node.id(), NodeItem(i));
116+
ItemUse(ref view_path) => {
117+
match view_path.node {
118+
ViewPathList(_, ref paths) => {
119+
for path in paths {
120+
this.insert(path.node.id(), NodeItem(i));
121+
}
116122
}
123+
_ => ()
117124
}
118-
_ => ()
119125
}
126+
_ => {}
120127
}
121-
_ => {}
122-
}
123-
intravisit::walk_item(self, i);
124-
self.parent_node = parent_node;
128+
intravisit::walk_item(this, i);
129+
});
125130
}
126131

127132
fn visit_foreign_item(&mut self, foreign_item: &'ast ForeignItem) {
128133
self.insert(foreign_item.id, NodeForeignItem(foreign_item));
129134

130-
let parent_node = self.parent_node;
131-
self.parent_node = foreign_item.id;
132-
intravisit::walk_foreign_item(self, foreign_item);
133-
self.parent_node = parent_node;
135+
self.with_parent(foreign_item.id, |this| {
136+
intravisit::walk_foreign_item(this, foreign_item);
137+
});
134138
}
135139

136140
fn visit_generics(&mut self, generics: &'ast Generics) {
@@ -144,50 +148,42 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
144148
fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
145149
self.insert(ti.id, NodeTraitItem(ti));
146150

147-
let parent_node = self.parent_node;
148-
self.parent_node = ti.id;
149-
150-
intravisit::walk_trait_item(self, ti);
151-
152-
self.parent_node = parent_node;
151+
self.with_parent(ti.id, |this| {
152+
intravisit::walk_trait_item(this, ti);
153+
});
153154
}
154155

155156
fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
156157
self.insert(ii.id, NodeImplItem(ii));
157158

158-
let parent_node = self.parent_node;
159-
self.parent_node = ii.id;
160-
161-
intravisit::walk_impl_item(self, ii);
162-
163-
self.parent_node = parent_node;
159+
self.with_parent(ii.id, |this| {
160+
intravisit::walk_impl_item(this, ii);
161+
});
164162
}
165163

166164
fn visit_pat(&mut self, pat: &'ast Pat) {
167165
self.insert(pat.id, NodeLocal(pat));
168166

169-
let parent_node = self.parent_node;
170-
self.parent_node = pat.id;
171-
intravisit::walk_pat(self, pat);
172-
self.parent_node = parent_node;
167+
self.with_parent(pat.id, |this| {
168+
intravisit::walk_pat(this, pat);
169+
});
173170
}
174171

175172
fn visit_expr(&mut self, expr: &'ast Expr) {
176173
self.insert(expr.id, NodeExpr(expr));
177174

178-
let parent_node = self.parent_node;
179-
self.parent_node = expr.id;
180-
intravisit::walk_expr(self, expr);
181-
self.parent_node = parent_node;
175+
self.with_parent(expr.id, |this| {
176+
intravisit::walk_expr(this, expr);
177+
});
182178
}
183179

184180
fn visit_stmt(&mut self, stmt: &'ast Stmt) {
185181
let id = stmt.node.id();
186182
self.insert(id, NodeStmt(stmt));
187-
let parent_node = self.parent_node;
188-
self.parent_node = id;
189-
intravisit::walk_stmt(self, stmt);
190-
self.parent_node = parent_node;
183+
184+
self.with_parent(id, |this| {
185+
intravisit::walk_stmt(this, stmt);
186+
});
191187
}
192188

193189
fn visit_fn(&mut self, fk: intravisit::FnKind<'ast>, fd: &'ast FnDecl,
@@ -198,10 +194,9 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
198194

199195
fn visit_block(&mut self, block: &'ast Block) {
200196
self.insert(block.id, NodeBlock(block));
201-
let parent_node = self.parent_node;
202-
self.parent_node = block.id;
203-
intravisit::walk_block(self, block);
204-
self.parent_node = parent_node;
197+
self.with_parent(block.id, |this| {
198+
intravisit::walk_block(this, block);
199+
});
205200
}
206201

207202
fn visit_lifetime(&mut self, lifetime: &'ast Lifetime) {

src/librustc/hir/map/def_collector.rs

Lines changed: 54 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,14 @@ use syntax::ast::*;
1616
use syntax::visit;
1717

1818
/// Creates def ids for nodes in the HIR.
19-
pub struct DefCollector<'ast> {
20-
pub krate: &'ast Crate,
19+
pub struct DefCollector {
2120
pub definitions: Definitions,
2221
pub parent_def: Option<DefIndex>,
2322
}
2423

25-
impl<'ast> DefCollector<'ast> {
26-
pub fn root(krate: &'ast Crate) -> DefCollector<'ast> {
24+
impl DefCollector {
25+
pub fn root() -> DefCollector {
2726
let mut collector = DefCollector {
28-
krate: krate,
2927
definitions: Definitions::new(),
3028
parent_def: None,
3129
};
@@ -37,14 +35,12 @@ impl<'ast> DefCollector<'ast> {
3735
collector
3836
}
3937

40-
pub fn extend(krate: &'ast Crate,
41-
parent_node: NodeId,
38+
pub fn extend(parent_node: NodeId,
4239
parent_def_path: DefPath,
4340
parent_def_id: DefId,
4441
definitions: Definitions)
45-
-> DefCollector<'ast> {
42+
-> DefCollector {
4643
let mut collector = DefCollector {
47-
krate: krate,
4844
parent_def: None,
4945
definitions: definitions,
5046
};
@@ -78,9 +74,16 @@ impl<'ast> DefCollector<'ast> {
7874
-> DefIndex {
7975
self.definitions.create_def_with_parent(parent, node_id, data)
8076
}
77+
78+
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: DefIndex, f: F) {
79+
let parent = self.parent_def;
80+
self.parent_def = Some(parent_def);
81+
f(self);
82+
self.parent_def = parent;
83+
}
8184
}
8285

83-
impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
86+
impl<'ast> visit::Visitor<'ast> for DefCollector {
8487
fn visit_item(&mut self, i: &'ast Item) {
8588
debug!("visit_item: {:?}", i);
8689

@@ -98,60 +101,55 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
98101
ItemKind::Mac(..) => DefPathData::MacroDef(i.ident.name),
99102
ItemKind::Use(..) => DefPathData::Misc,
100103
};
101-
102104
let def = self.create_def(i.id, def_data);
103105

104-
let parent_def = self.parent_def;
105-
self.parent_def = Some(def);
106-
107-
match i.node {
108-
ItemKind::Enum(ref enum_definition, _) => {
109-
for v in &enum_definition.variants {
110-
let variant_def_index =
111-
self.create_def(v.node.data.id(),
112-
DefPathData::EnumVariant(v.node.name.name));
113-
114-
for field in v.node.data.fields() {
115-
if let Some(ident) = field.ident {
116-
self.create_def_with_parent(Some(variant_def_index),
117-
field.id,
118-
DefPathData::Field(ident.name));
106+
self.with_parent(def, |this| {
107+
match i.node {
108+
ItemKind::Enum(ref enum_definition, _) => {
109+
for v in &enum_definition.variants {
110+
let variant_def_index =
111+
this.create_def(v.node.data.id(),
112+
DefPathData::EnumVariant(v.node.name.name));
113+
114+
for field in v.node.data.fields() {
115+
if let Some(ident) = field.ident {
116+
this.create_def_with_parent(Some(variant_def_index),
117+
field.id,
118+
DefPathData::Field(ident.name));
119+
}
119120
}
120121
}
121122
}
122-
}
123-
ItemKind::Struct(ref struct_def, _) => {
124-
// If this is a tuple-like struct, register the constructor.
125-
if !struct_def.is_struct() {
126-
self.create_def(struct_def.id(),
127-
DefPathData::StructCtor);
128-
}
123+
ItemKind::Struct(ref struct_def, _) => {
124+
// If this is a tuple-like struct, register the constructor.
125+
if !struct_def.is_struct() {
126+
this.create_def(struct_def.id(),
127+
DefPathData::StructCtor);
128+
}
129129

130-
for field in struct_def.fields() {
131-
if let Some(ident) = field.ident {
132-
self.create_def(field.id, DefPathData::Field(ident.name));
130+
for field in struct_def.fields() {
131+
if let Some(ident) = field.ident {
132+
this.create_def(field.id, DefPathData::Field(ident.name));
133+
}
133134
}
134135
}
136+
_ => {}
135137
}
136-
_ => {}
137-
}
138-
visit::walk_item(self, i);
139-
self.parent_def = parent_def;
138+
visit::walk_item(this, i);
139+
});
140140
}
141141

142142
fn visit_foreign_item(&mut self, foreign_item: &'ast ForeignItem) {
143143
let def = self.create_def(foreign_item.id, DefPathData::ValueNs(foreign_item.ident.name));
144144

145-
let parent_def = self.parent_def;
146-
self.parent_def = Some(def);
147-
visit::walk_foreign_item(self, foreign_item);
148-
self.parent_def = parent_def;
145+
self.with_parent(def, |this| {
146+
visit::walk_foreign_item(this, foreign_item);
147+
});
149148
}
150149

151150
fn visit_generics(&mut self, generics: &'ast Generics) {
152151
for ty_param in generics.ty_params.iter() {
153-
self.create_def(ty_param.id,
154-
DefPathData::TypeParam(ty_param.ident.name));
152+
self.create_def(ty_param.id, DefPathData::TypeParam(ty_param.ident.name));
155153
}
156154

157155
visit::walk_generics(self, generics);
@@ -165,20 +163,13 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
165163
};
166164

167165
let def = self.create_def(ti.id, def_data);
168-
169-
let parent_def = self.parent_def;
170-
self.parent_def = Some(def);
171-
172-
match ti.node {
173-
TraitItemKind::Const(_, Some(ref expr)) => {
174-
self.create_def(expr.id, DefPathData::Initializer);
166+
self.with_parent(def, |this| {
167+
if let TraitItemKind::Const(_, Some(ref expr)) = ti.node {
168+
this.create_def(expr.id, DefPathData::Initializer);
175169
}
176-
_ => { }
177-
}
178-
179-
visit::walk_trait_item(self, ti);
180170

181-
self.parent_def = parent_def;
171+
visit::walk_trait_item(this, ti);
172+
});
182173
}
183174

184175
fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
@@ -190,20 +181,13 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
190181
};
191182

192183
let def = self.create_def(ii.id, def_data);
193-
194-
let parent_def = self.parent_def;
195-
self.parent_def = Some(def);
196-
197-
match ii.node {
198-
ImplItemKind::Const(_, ref expr) => {
199-
self.create_def(expr.id, DefPathData::Initializer);
184+
self.with_parent(def, |this| {
185+
if let ImplItemKind::Const(_, ref expr) = ii.node {
186+
this.create_def(expr.id, DefPathData::Initializer);
200187
}
201-
_ => { }
202-
}
203-
204-
visit::walk_impl_item(self, ii);
205188

206-
self.parent_def = parent_def;
189+
visit::walk_impl_item(this, ii);
190+
});
207191
}
208192

209193
fn visit_pat(&mut self, pat: &'ast Pat) {
@@ -234,14 +218,6 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
234218
self.parent_def = parent_def;
235219
}
236220

237-
fn visit_stmt(&mut self, stmt: &'ast Stmt) {
238-
visit::walk_stmt(self, stmt);
239-
}
240-
241-
fn visit_block(&mut self, block: &'ast Block) {
242-
visit::walk_block(self, block);
243-
}
244-
245221
fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
246222
self.create_def(def.lifetime.id, DefPathData::LifetimeDef(def.lifetime.name));
247223
}

0 commit comments

Comments
 (0)