1
- // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
1
+ // Copyright 2015-2016 The Rust Project Developers. See the COPYRIGHT
2
2
// file at the top-level directory of this distribution and at
3
3
// http://rust-lang.org/COPYRIGHT.
4
4
//
@@ -13,10 +13,10 @@ use super::MapEntry::*;
13
13
14
14
use hir:: * ;
15
15
use hir:: intravisit:: Visitor ;
16
- use hir:: def_id:: { CRATE_DEF_INDEX , DefId , DefIndex } ;
16
+ use hir:: def_id:: DefId ;
17
17
use middle:: cstore:: InlinedItem ;
18
18
use std:: iter:: repeat;
19
- use syntax:: ast:: { NodeId , CRATE_NODE_ID , DUMMY_NODE_ID } ;
19
+ use syntax:: ast:: { NodeId , CRATE_NODE_ID } ;
20
20
use syntax:: codemap:: Span ;
21
21
22
22
/// A Visitor that walks over the HIR and collects Node's into a HIR map.
@@ -26,248 +26,6 @@ pub struct NodeCollector<'ast> {
26
26
pub parent_node : NodeId ,
27
27
}
28
28
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
-
271
29
impl < ' ast > NodeCollector < ' ast > {
272
30
pub fn root ( krate : & ' ast Crate ) -> NodeCollector < ' ast > {
273
31
let mut collector = NodeCollector {
0 commit comments