1- // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
1+ // Copyright 2015-2016 The Rust Project Developers. See the COPYRIGHT
22// file at the top-level directory of this distribution and at
33// http://rust-lang.org/COPYRIGHT.
44//
@@ -13,10 +13,10 @@ use super::MapEntry::*;
1313
1414use hir:: * ;
1515use hir:: intravisit:: Visitor ;
16- use hir:: def_id:: { CRATE_DEF_INDEX , DefId , DefIndex } ;
16+ use hir:: def_id:: DefId ;
1717use middle:: cstore:: InlinedItem ;
1818use std:: iter:: repeat;
19- use syntax:: ast:: { NodeId , CRATE_NODE_ID , DUMMY_NODE_ID } ;
19+ use syntax:: ast:: { NodeId , CRATE_NODE_ID } ;
2020use syntax:: codemap:: Span ;
2121
2222/// A Visitor that walks over the HIR and collects Node's into a HIR map.
@@ -26,248 +26,6 @@ pub struct NodeCollector<'ast> {
2626 pub parent_node : NodeId ,
2727}
2828
29- pub struct DefCollector < ' ast > {
30- pub krate : & ' ast Crate ,
31- pub map : & ' ast [ MapEntry < ' ast > ] ,
32- pub definitions : Definitions ,
33- pub parent_def : Option < DefIndex > ,
34- }
35-
36- impl < ' ast > DefCollector < ' ast > {
37- pub fn root ( krate : & ' ast Crate , map : & ' ast [ MapEntry < ' ast > ] ) -> DefCollector < ' ast > {
38- let mut collector = DefCollector {
39- krate : krate,
40- map : map,
41- definitions : Definitions :: new ( ) ,
42- parent_def : None ,
43- } ;
44- let result = collector. create_def_with_parent ( None , CRATE_NODE_ID , DefPathData :: CrateRoot ) ;
45- assert_eq ! ( result, CRATE_DEF_INDEX ) ;
46-
47- collector. create_def_with_parent ( Some ( CRATE_DEF_INDEX ) , DUMMY_NODE_ID , DefPathData :: Misc ) ;
48-
49- collector
50- }
51-
52- pub fn extend ( krate : & ' ast Crate ,
53- parent_node : NodeId ,
54- parent_def_path : DefPath ,
55- parent_def_id : DefId ,
56- map : & ' ast [ MapEntry < ' ast > ] ,
57- definitions : Definitions )
58- -> DefCollector < ' ast > {
59- let mut collector = DefCollector {
60- krate : krate,
61- map : map,
62- parent_def : None ,
63- definitions : definitions,
64- } ;
65-
66- assert_eq ! ( parent_def_path. krate, parent_def_id. krate) ;
67- let root_path = Box :: new ( InlinedRootPath {
68- data : parent_def_path. data ,
69- def_id : parent_def_id,
70- } ) ;
71-
72- let def = collector. create_def ( parent_node, DefPathData :: InlinedRoot ( root_path) ) ;
73- collector. parent_def = Some ( def) ;
74-
75- collector
76- }
77-
78- fn parent_def ( & self ) -> Option < DefIndex > {
79- self . parent_def
80- }
81-
82- fn create_def ( & mut self , node_id : NodeId , data : DefPathData ) -> DefIndex {
83- let parent_def = self . parent_def ( ) ;
84- debug ! ( "create_def(node_id={:?}, data={:?}, parent_def={:?})" , node_id, data, parent_def) ;
85- self . definitions . create_def_with_parent ( parent_def, node_id, data)
86- }
87-
88- fn create_def_with_parent ( & mut self ,
89- parent : Option < DefIndex > ,
90- node_id : NodeId ,
91- data : DefPathData )
92- -> DefIndex {
93- self . definitions . create_def_with_parent ( parent, node_id, data)
94- }
95- }
96-
97- impl < ' ast > Visitor < ' ast > for DefCollector < ' ast > {
98- /// Because we want to track parent items and so forth, enable
99- /// deep walking so that we walk nested items in the context of
100- /// their outer items.
101- fn visit_nested_item ( & mut self , item : ItemId ) {
102- debug ! ( "visit_nested_item: {:?}" , item) ;
103- self . visit_item ( self . krate . item ( item. id ) )
104- }
105-
106- fn visit_item ( & mut self , i : & ' ast Item ) {
107- debug ! ( "visit_item: {:?}" , i) ;
108-
109- // Pick the def data. This need not be unique, but the more
110- // information we encapsulate into
111- let def_data = match i. node {
112- ItemDefaultImpl ( ..) | ItemImpl ( ..) =>
113- DefPathData :: Impl ,
114- ItemEnum ( ..) | ItemStruct ( ..) | ItemTrait ( ..) |
115- ItemExternCrate ( ..) | ItemForeignMod ( ..) | ItemTy ( ..) =>
116- DefPathData :: TypeNs ( i. name ) ,
117- ItemMod ( ..) =>
118- DefPathData :: Module ( i. name ) ,
119- ItemStatic ( ..) | ItemConst ( ..) | ItemFn ( ..) =>
120- DefPathData :: ValueNs ( i. name ) ,
121- ItemUse ( ..) =>
122- DefPathData :: Misc ,
123- } ;
124-
125- let def = self . create_def ( i. id , def_data) ;
126-
127- let parent_def = self . parent_def ;
128- self . parent_def = Some ( def) ;
129-
130- match i. node {
131- ItemEnum ( ref enum_definition, _) => {
132- for v in & enum_definition. variants {
133- let variant_def_index =
134- self . create_def ( v. node . data . id ( ) ,
135- DefPathData :: EnumVariant ( v. node . name ) ) ;
136-
137- for field in v. node . data . fields ( ) {
138- self . create_def_with_parent (
139- Some ( variant_def_index) ,
140- field. id ,
141- DefPathData :: Field ( field. name ) ) ;
142- }
143- }
144- }
145- ItemStruct ( ref struct_def, _) => {
146- // If this is a tuple-like struct, register the constructor.
147- if !struct_def. is_struct ( ) {
148- self . create_def ( struct_def. id ( ) ,
149- DefPathData :: StructCtor ) ;
150- }
151-
152- for field in struct_def. fields ( ) {
153- self . create_def ( field. id , DefPathData :: Field ( field. name ) ) ;
154- }
155- }
156- _ => { }
157- }
158- intravisit:: walk_item ( self , i) ;
159- self . parent_def = parent_def;
160- }
161-
162- fn visit_foreign_item ( & mut self , foreign_item : & ' ast ForeignItem ) {
163- let def = self . create_def ( foreign_item. id , DefPathData :: ValueNs ( foreign_item. name ) ) ;
164-
165- let parent_def = self . parent_def ;
166- self . parent_def = Some ( def) ;
167- intravisit:: walk_foreign_item ( self , foreign_item) ;
168- self . parent_def = parent_def;
169- }
170-
171- fn visit_generics ( & mut self , generics : & ' ast Generics ) {
172- for ty_param in generics. ty_params . iter ( ) {
173- self . create_def ( ty_param. id ,
174- DefPathData :: TypeParam ( ty_param. name ) ) ;
175- }
176-
177- intravisit:: walk_generics ( self , generics) ;
178- }
179-
180- fn visit_trait_item ( & mut self , ti : & ' ast TraitItem ) {
181- let def_data = match ti. node {
182- MethodTraitItem ( ..) | ConstTraitItem ( ..) => DefPathData :: ValueNs ( ti. name ) ,
183- TypeTraitItem ( ..) => DefPathData :: TypeNs ( ti. name ) ,
184- } ;
185-
186- let def = self . create_def ( ti. id , def_data) ;
187-
188- let parent_def = self . parent_def ;
189- self . parent_def = Some ( def) ;
190-
191- match ti. node {
192- ConstTraitItem ( _, Some ( ref expr) ) => {
193- self . create_def ( expr. id , DefPathData :: Initializer ) ;
194- }
195- _ => { }
196- }
197-
198- intravisit:: walk_trait_item ( self , ti) ;
199-
200- self . parent_def = parent_def;
201- }
202-
203- fn visit_impl_item ( & mut self , ii : & ' ast ImplItem ) {
204- let def_data = match ii. node {
205- ImplItemKind :: Method ( ..) | ImplItemKind :: Const ( ..) => DefPathData :: ValueNs ( ii. name ) ,
206- ImplItemKind :: Type ( ..) => DefPathData :: TypeNs ( ii. name ) ,
207- } ;
208-
209- let def = self . create_def ( ii. id , def_data) ;
210-
211- let parent_def = self . parent_def ;
212- self . parent_def = Some ( def) ;
213-
214- match ii. node {
215- ImplItemKind :: Const ( _, ref expr) => {
216- self . create_def ( expr. id , DefPathData :: Initializer ) ;
217- }
218- _ => { }
219- }
220-
221- intravisit:: walk_impl_item ( self , ii) ;
222-
223- self . parent_def = parent_def;
224- }
225-
226- fn visit_pat ( & mut self , pat : & ' ast Pat ) {
227- let maybe_binding = match pat. node {
228- PatKind :: Ident ( _, id, _) => Some ( id. node ) ,
229- _ => None
230- } ;
231-
232- let parent_def = self . parent_def ;
233- if let Some ( id) = maybe_binding {
234- let def = self . create_def ( pat. id , DefPathData :: Binding ( id. name ) ) ;
235- self . parent_def = Some ( def) ;
236- }
237-
238- intravisit:: walk_pat ( self , pat) ;
239- self . parent_def = parent_def;
240- }
241-
242- fn visit_expr ( & mut self , expr : & ' ast Expr ) {
243- let parent_def = self . parent_def ;
244-
245- if let ExprClosure ( ..) = expr. node {
246- let def = self . create_def ( expr. id , DefPathData :: ClosureExpr ) ;
247- self . parent_def = Some ( def) ;
248- }
249-
250- intravisit:: walk_expr ( self , expr) ;
251- self . parent_def = parent_def;
252- }
253-
254- fn visit_stmt ( & mut self , stmt : & ' ast Stmt ) {
255- intravisit:: walk_stmt ( self , stmt) ;
256- }
257-
258- fn visit_block ( & mut self , block : & ' ast Block ) {
259- intravisit:: walk_block ( self , block) ;
260- }
261-
262- fn visit_lifetime_def ( & mut self , def : & ' ast LifetimeDef ) {
263- self . create_def ( def. lifetime . id , DefPathData :: LifetimeDef ( def. lifetime . name ) ) ;
264- }
265-
266- fn visit_macro_def ( & mut self , macro_def : & ' ast MacroDef ) {
267- self . create_def ( macro_def. id , DefPathData :: MacroDef ( macro_def. name ) ) ;
268- }
269- }
270-
27129impl < ' ast > NodeCollector < ' ast > {
27230 pub fn root ( krate : & ' ast Crate ) -> NodeCollector < ' ast > {
27331 let mut collector = NodeCollector {
0 commit comments