Skip to content

Commit 4f3ac47

Browse files
committed
---
yaml --- r: 223477 b: refs/heads/beta c: 15dcb5b h: refs/heads/master i: 223475: 919867c v: v3
1 parent 628e4cd commit 4f3ac47

File tree

3 files changed

+118
-114
lines changed

3 files changed

+118
-114
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: b23ddc60e9fcb188421060a83f1af2b815fc60e2
26+
refs/heads/beta: 15dcb5bfc51753aad5527888ec5a1c9381e8d1e1
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: 938f5d7af401e2d8238522fed4a612943b6e77fd
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/src/librustc/ast_map/mod.rs

Lines changed: 109 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,19 @@ enum MapEntry<'ast> {
130130
NotPresent,
131131

132132
/// All the node types, with a parent and scope ID.
133-
EntryItem(NodeId, NodeId, &'ast Item),
134-
EntryForeignItem(NodeId, NodeId, &'ast ForeignItem),
135-
EntryTraitItem(NodeId, NodeId, &'ast TraitItem),
136-
EntryImplItem(NodeId, NodeId, &'ast ImplItem),
137-
EntryVariant(NodeId, NodeId, &'ast Variant),
138-
EntryExpr(NodeId, NodeId, &'ast Expr),
139-
EntryStmt(NodeId, NodeId, &'ast Stmt),
140-
EntryArg(NodeId, NodeId, &'ast Pat),
141-
EntryLocal(NodeId, NodeId, &'ast Pat),
142-
EntryPat(NodeId, NodeId, &'ast Pat),
143-
EntryBlock(NodeId, NodeId, &'ast Block),
144-
EntryStructCtor(NodeId, NodeId, &'ast StructDef),
145-
EntryLifetime(NodeId, NodeId, &'ast Lifetime),
133+
EntryItem(NodeId, &'ast Item),
134+
EntryForeignItem(NodeId, &'ast ForeignItem),
135+
EntryTraitItem(NodeId, &'ast TraitItem),
136+
EntryImplItem(NodeId, &'ast ImplItem),
137+
EntryVariant(NodeId, &'ast Variant),
138+
EntryExpr(NodeId, &'ast Expr),
139+
EntryStmt(NodeId, &'ast Stmt),
140+
EntryArg(NodeId, &'ast Pat),
141+
EntryLocal(NodeId, &'ast Pat),
142+
EntryPat(NodeId, &'ast Pat),
143+
EntryBlock(NodeId, &'ast Block),
144+
EntryStructCtor(NodeId, &'ast StructDef),
145+
EntryLifetime(NodeId, &'ast Lifetime),
146146

147147
/// Roots for node trees.
148148
RootCrate,
@@ -162,77 +162,58 @@ struct InlinedParent {
162162
}
163163

164164
impl<'ast> MapEntry<'ast> {
165-
fn from_node(p: NodeId, s: NodeId, node: Node<'ast>) -> MapEntry<'ast> {
165+
fn from_node(s: NodeId, node: Node<'ast>) -> MapEntry<'ast> {
166166
match node {
167-
NodeItem(n) => EntryItem(p, s, n),
168-
NodeForeignItem(n) => EntryForeignItem(p, s, n),
169-
NodeTraitItem(n) => EntryTraitItem(p, s, n),
170-
NodeImplItem(n) => EntryImplItem(p, s, n),
171-
NodeVariant(n) => EntryVariant(p, s, n),
172-
NodeExpr(n) => EntryExpr(p, s, n),
173-
NodeStmt(n) => EntryStmt(p, s, n),
174-
NodeArg(n) => EntryArg(p, s, n),
175-
NodeLocal(n) => EntryLocal(p, s, n),
176-
NodePat(n) => EntryPat(p, s, n),
177-
NodeBlock(n) => EntryBlock(p, s, n),
178-
NodeStructCtor(n) => EntryStructCtor(p, s, n),
179-
NodeLifetime(n) => EntryLifetime(p, s, n)
167+
NodeItem(n) => EntryItem(s, n),
168+
NodeForeignItem(n) => EntryForeignItem(s, n),
169+
NodeTraitItem(n) => EntryTraitItem(s, n),
170+
NodeImplItem(n) => EntryImplItem(s, n),
171+
NodeVariant(n) => EntryVariant(s, n),
172+
NodeExpr(n) => EntryExpr(s, n),
173+
NodeStmt(n) => EntryStmt(s, n),
174+
NodeArg(n) => EntryArg(s, n),
175+
NodeLocal(n) => EntryLocal(s, n),
176+
NodePat(n) => EntryPat(s, n),
177+
NodeBlock(n) => EntryBlock(s, n),
178+
NodeStructCtor(n) => EntryStructCtor(s, n),
179+
NodeLifetime(n) => EntryLifetime(s, n)
180180
}
181181
}
182182

183-
fn parent(self) -> Option<NodeId> {
184-
Some(match self {
185-
EntryItem(id, _, _) => id,
186-
EntryForeignItem(id, _, _) => id,
187-
EntryTraitItem(id, _, _) => id,
188-
EntryImplItem(id, _, _) => id,
189-
EntryVariant(id, _, _) => id,
190-
EntryExpr(id, _, _) => id,
191-
EntryStmt(id, _, _) => id,
192-
EntryArg(id, _, _) => id,
193-
EntryLocal(id, _, _) => id,
194-
EntryPat(id, _, _) => id,
195-
EntryBlock(id, _, _) => id,
196-
EntryStructCtor(id, _, _) => id,
197-
EntryLifetime(id, _, _) => id,
198-
_ => return None
199-
})
200-
}
201-
202183
fn parent_node(self) -> Option<NodeId> {
203184
Some(match self {
204-
EntryItem(_, id, _) => id,
205-
EntryForeignItem(_, id, _) => id,
206-
EntryTraitItem(_, id, _) => id,
207-
EntryImplItem(_, id, _) => id,
208-
EntryVariant(_, id, _) => id,
209-
EntryExpr(_, id, _) => id,
210-
EntryStmt(_, id, _) => id,
211-
EntryArg(_, id, _) => id,
212-
EntryLocal(_, id, _) => id,
213-
EntryPat(_, id, _) => id,
214-
EntryBlock(_, id, _) => id,
215-
EntryStructCtor(_, id, _) => id,
216-
EntryLifetime(_, id, _) => id,
185+
EntryItem(id, _) => id,
186+
EntryForeignItem(id, _) => id,
187+
EntryTraitItem(id, _) => id,
188+
EntryImplItem(id, _) => id,
189+
EntryVariant(id, _) => id,
190+
EntryExpr(id, _) => id,
191+
EntryStmt(id, _) => id,
192+
EntryArg(id, _) => id,
193+
EntryLocal(id, _) => id,
194+
EntryPat(id, _) => id,
195+
EntryBlock(id, _) => id,
196+
EntryStructCtor(id, _) => id,
197+
EntryLifetime(id, _) => id,
217198
_ => return None
218199
})
219200
}
220201

221202
fn to_node(self) -> Option<Node<'ast>> {
222203
Some(match self {
223-
EntryItem(_, _, n) => NodeItem(n),
224-
EntryForeignItem(_, _, n) => NodeForeignItem(n),
225-
EntryTraitItem(_, _, n) => NodeTraitItem(n),
226-
EntryImplItem(_, _, n) => NodeImplItem(n),
227-
EntryVariant(_, _, n) => NodeVariant(n),
228-
EntryExpr(_, _, n) => NodeExpr(n),
229-
EntryStmt(_, _, n) => NodeStmt(n),
230-
EntryArg(_, _, n) => NodeArg(n),
231-
EntryLocal(_, _, n) => NodeLocal(n),
232-
EntryPat(_, _, n) => NodePat(n),
233-
EntryBlock(_, _, n) => NodeBlock(n),
234-
EntryStructCtor(_, _, n) => NodeStructCtor(n),
235-
EntryLifetime(_, _, n) => NodeLifetime(n),
204+
EntryItem(_, n) => NodeItem(n),
205+
EntryForeignItem(_, n) => NodeForeignItem(n),
206+
EntryTraitItem(_, n) => NodeTraitItem(n),
207+
EntryImplItem(_, n) => NodeImplItem(n),
208+
EntryVariant(_, n) => NodeVariant(n),
209+
EntryExpr(_, n) => NodeExpr(n),
210+
EntryStmt(_, n) => NodeStmt(n),
211+
EntryArg(_, n) => NodeArg(n),
212+
EntryLocal(_, n) => NodeLocal(n),
213+
EntryPat(_, n) => NodePat(n),
214+
EntryBlock(_, n) => NodeBlock(n),
215+
EntryStructCtor(_, n) => NodeStructCtor(n),
216+
EntryLifetime(_, n) => NodeLifetime(n),
236217
_ => return None
237218
})
238219
}
@@ -306,7 +287,37 @@ impl<'ast> Map<'ast> {
306287
/// Retrieve the parent NodeId for `id`, or `id` itself if no
307288
/// parent is registered in this map.
308289
pub fn get_parent(&self, id: NodeId) -> NodeId {
309-
self.find_entry(id).and_then(|x| x.parent()).unwrap_or(id)
290+
let mut id = id;
291+
loop {
292+
let parent_node = self.get_parent_node(id);
293+
if parent_node == 0 {
294+
return parent_node;
295+
}
296+
if parent_node == id {
297+
return id;
298+
}
299+
300+
let node = self.find_entry(parent_node);
301+
if node.is_none() {
302+
return id;
303+
}
304+
let node = node.unwrap().to_node();
305+
match node {
306+
Some(node) => match node {
307+
NodeItem(_) |
308+
NodeForeignItem(_) |
309+
NodeTraitItem(_) |
310+
NodeImplItem(_) => {
311+
return parent_node;
312+
}
313+
_ => {}
314+
},
315+
None => {
316+
return parent_node;
317+
}
318+
}
319+
id = parent_node;
320+
}
310321
}
311322

312323
/// Similar to get_parent, returns the parent node id or id if there is no
@@ -334,6 +345,10 @@ impl<'ast> Map<'ast> {
334345
return None;
335346
}
336347

348+
if cur_id == 0 {
349+
return Some(0);
350+
}
351+
337352
match self.get(cur_id) {
338353
NodeItem(_) |
339354
NodeForeignItem(_) |
@@ -361,7 +376,7 @@ impl<'ast> Map<'ast> {
361376
pub fn get_foreign_abi(&self, id: NodeId) -> abi::Abi {
362377
let parent = self.get_parent(id);
363378
let abi = match self.find_entry(parent) {
364-
Some(EntryItem(_, _, i)) => {
379+
Some(EntryItem(_, i)) => {
365380
match i.node {
366381
ItemForeignMod(ref nm) => Some(nm.abi),
367382
_ => None
@@ -650,15 +665,15 @@ impl<'a, 'ast> Iterator for NodesMatchingSuffix<'a, 'ast> {
650665
return None;
651666
}
652667
self.idx += 1;
653-
let (p, name) = match self.map.find_entry(idx) {
654-
Some(EntryItem(p, _, n)) => (p, n.name()),
655-
Some(EntryForeignItem(p, _, n))=> (p, n.name()),
656-
Some(EntryTraitItem(p, _, n)) => (p, n.name()),
657-
Some(EntryImplItem(p, _, n)) => (p, n.name()),
658-
Some(EntryVariant(p, _, n)) => (p, n.name()),
668+
let name = match self.map.find_entry(idx) {
669+
Some(EntryItem(_, n)) => n.name(),
670+
Some(EntryForeignItem(_, n))=> n.name(),
671+
Some(EntryTraitItem(_, n)) => n.name(),
672+
Some(EntryImplItem(_, n)) => n.name(),
673+
Some(EntryVariant(_, n)) => n.name(),
659674
_ => continue,
660675
};
661-
if self.matches_names(p, name) {
676+
if self.matches_names(self.map.get_parent(idx), name) {
662677
return Some(idx)
663678
}
664679
}
@@ -707,8 +722,6 @@ impl<F: FoldOps> Folder for IdAndSpanUpdater<F> {
707722
/// A Visitor that walks over an AST and collects Node's into an AST Map.
708723
struct NodeCollector<'ast> {
709724
map: Vec<MapEntry<'ast>>,
710-
/// The node in which we are currently mapping (an item or a method).
711-
parent: NodeId,
712725
parent_node: NodeId,
713726
}
714727

@@ -723,7 +736,7 @@ impl<'ast> NodeCollector<'ast> {
723736
}
724737

725738
fn insert(&mut self, id: NodeId, node: Node<'ast>) {
726-
let entry = MapEntry::from_node(self.parent, self.parent_node, node);
739+
let entry = MapEntry::from_node(self.parent_node, node);
727740
self.insert_entry(id, entry);
728741
}
729742

@@ -737,10 +750,10 @@ impl<'ast> NodeCollector<'ast> {
737750
impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
738751
fn visit_item(&mut self, i: &'ast Item) {
739752
self.insert(i.id, NodeItem(i));
740-
let parent = self.parent;
741-
self.parent = i.id;
753+
742754
let parent_node = self.parent_node;
743755
self.parent_node = i.id;
756+
744757
match i.node {
745758
ItemImpl(_, _, _, _, _, ref impl_items) => {
746759
for ii in impl_items {
@@ -790,55 +803,51 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
790803
_ => {}
791804
}
792805
visit::walk_item(self, i);
793-
self.parent = parent;
794806
self.parent_node = parent_node;
795807
}
796808

797809
fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
798-
let parent = self.parent;
799-
self.parent = ti.id;
800810
let parent_node = self.parent_node;
801811
self.parent_node = ti.id;
802812
visit::walk_trait_item(self, ti);
803-
self.parent = parent;
804813
self.parent_node = parent_node;
805814
}
806815

807816
fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
808-
let parent = self.parent;
809-
self.parent = ii.id;
810817
let parent_node = self.parent_node;
811818
self.parent_node = ii.id;
819+
812820
visit::walk_impl_item(self, ii);
813-
self.parent = parent;
821+
814822
self.parent_node = parent_node;
815823
}
816824

817825
fn visit_pat(&mut self, pat: &'ast Pat) {
818-
let parent_node = self.parent_node;
819-
self.parent_node = pat.id;
820826
self.insert(pat.id, match pat.node {
821827
// Note: this is at least *potentially* a pattern...
822828
PatIdent(..) => NodeLocal(pat),
823829
_ => NodePat(pat)
824830
});
831+
832+
let parent_node = self.parent_node;
833+
self.parent_node = pat.id;
825834
visit::walk_pat(self, pat);
826835
self.parent_node = parent_node;
827836
}
828837

829838
fn visit_expr(&mut self, expr: &'ast Expr) {
839+
self.insert(expr.id, NodeExpr(expr));
830840
let parent_node = self.parent_node;
831841
self.parent_node = expr.id;
832-
self.insert(expr.id, NodeExpr(expr));
833842
visit::walk_expr(self, expr);
834843
self.parent_node = parent_node;
835844
}
836845

837846
fn visit_stmt(&mut self, stmt: &'ast Stmt) {
838847
let id = ast_util::stmt_id(stmt);
848+
self.insert(id, NodeStmt(stmt));
839849
let parent_node = self.parent_node;
840850
self.parent_node = id;
841-
self.insert(id, NodeStmt(stmt));
842851
visit::walk_stmt(self, stmt);
843852
self.parent_node = parent_node;
844853
}
@@ -866,18 +875,15 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
866875
}
867876

868877
fn visit_block(&mut self, block: &'ast Block) {
878+
self.insert(block.id, NodeBlock(block));
869879
let parent_node = self.parent_node;
870880
self.parent_node = block.id;
871-
self.insert(block.id, NodeBlock(block));
872881
visit::walk_block(self, block);
873882
self.parent_node = parent_node;
874883
}
875884

876885
fn visit_lifetime_ref(&mut self, lifetime: &'ast Lifetime) {
877-
let parent_node = self.parent_node;
878-
self.parent_node = lifetime.id;
879886
self.insert(lifetime.id, NodeLifetime(lifetime));
880-
self.parent_node = parent_node;
881887
}
882888

883889
fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
@@ -901,7 +907,6 @@ pub fn map_crate<'ast, F: FoldOps>(forest: &'ast mut Forest, fold_ops: F) -> Map
901907

902908
let mut collector = NodeCollector {
903909
map: vec![],
904-
parent: CRATE_NODE_ID,
905910
parent_node: CRATE_NODE_ID,
906911
};
907912
collector.insert_entry(CRATE_NODE_ID, RootCrate);
@@ -957,12 +962,11 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
957962
ii: ii
958963
});
959964

965+
let ii_parent_id = fld.new_id(DUMMY_NODE_ID);
960966
let mut collector = NodeCollector {
961967
map: mem::replace(&mut *map.map.borrow_mut(), vec![]),
962-
parent: fld.new_id(DUMMY_NODE_ID),
963-
parent_node: fld.new_id(DUMMY_NODE_ID),
968+
parent_node: ii_parent_id,
964969
};
965-
let ii_parent_id = collector.parent;
966970
collector.insert_entry(ii_parent_id, RootInlinedParent(ii_parent));
967971
visit::walk_inlined_item(&mut collector, &ii_parent.ii);
968972

0 commit comments

Comments
 (0)