10
10
11
11
use super :: * ;
12
12
13
- use hir:: * ;
14
- use hir:: intravisit:: Visitor ;
15
13
use hir:: def_id:: { CRATE_DEF_INDEX , DefId , DefIndex } ;
16
- use syntax:: ast:: { NodeId , CRATE_NODE_ID , DUMMY_NODE_ID } ;
14
+
15
+ use syntax:: ast:: * ;
16
+ use syntax:: visit;
17
17
18
18
/// Creates def ids for nodes in the HIR.
19
19
pub struct DefCollector < ' ast > {
@@ -80,31 +80,23 @@ impl<'ast> DefCollector<'ast> {
80
80
}
81
81
}
82
82
83
- impl < ' ast > Visitor < ' ast > for DefCollector < ' ast > {
84
- /// Because we want to track parent items and so forth, enable
85
- /// deep walking so that we walk nested items in the context of
86
- /// their outer items.
87
- fn visit_nested_item ( & mut self , item : ItemId ) {
88
- debug ! ( "visit_nested_item: {:?}" , item) ;
89
- self . visit_item ( self . krate . item ( item. id ) )
90
- }
91
-
83
+ impl < ' ast > visit:: Visitor < ' ast > for DefCollector < ' ast > {
92
84
fn visit_item ( & mut self , i : & ' ast Item ) {
93
85
debug ! ( "visit_item: {:?}" , i) ;
94
86
95
87
// Pick the def data. This need not be unique, but the more
96
88
// information we encapsulate into
97
89
let def_data = match i. node {
98
- ItemDefaultImpl ( ..) | ItemImpl ( ..) =>
90
+ ItemKind :: DefaultImpl ( ..) | ItemKind :: Impl ( ..) =>
99
91
DefPathData :: Impl ,
100
- ItemEnum ( ..) | ItemStruct ( ..) | ItemTrait ( ..) |
101
- ItemExternCrate ( ..) | ItemMod ( ..) | ItemForeignMod ( ..) |
102
- ItemTy ( ..) =>
103
- DefPathData :: TypeNs ( i. name ) ,
104
- ItemStatic ( ..) | ItemConst ( ..) | ItemFn ( ..) =>
105
- DefPathData :: ValueNs ( i. name ) ,
106
- ItemUse ( ..) =>
107
- DefPathData :: Misc ,
92
+ ItemKind :: Enum ( ..) | ItemKind :: Struct ( ..) | ItemKind :: Trait ( ..) |
93
+ ItemKind :: ExternCrate ( ..) | ItemKind :: Mod ( ..) | ItemKind :: ForeignMod ( ..) |
94
+ ItemKind :: Ty ( ..) =>
95
+ DefPathData :: TypeNs ( i. ident . name ) ,
96
+ ItemKind :: Static ( ..) | ItemKind :: Const ( ..) | ItemKind :: Fn ( ..) =>
97
+ DefPathData :: ValueNs ( i. ident . name ) ,
98
+ ItemKind :: Mac ( ..) => DefPathData :: MacroDef ( i . ident . name ) ,
99
+ ItemKind :: Use ( .. ) => DefPathData :: Misc ,
108
100
} ;
109
101
110
102
let def = self . create_def ( i. id , def_data) ;
@@ -113,59 +105,63 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
113
105
self . parent_def = Some ( def) ;
114
106
115
107
match i. node {
116
- ItemEnum ( ref enum_definition, _) => {
108
+ ItemKind :: Enum ( ref enum_definition, _) => {
117
109
for v in & enum_definition. variants {
118
110
let variant_def_index =
119
111
self . create_def ( v. node . data . id ( ) ,
120
- DefPathData :: EnumVariant ( v. node . name ) ) ;
112
+ DefPathData :: EnumVariant ( v. node . name . name ) ) ;
121
113
122
114
for field in v. node . data . fields ( ) {
123
- self . create_def_with_parent (
124
- Some ( variant_def_index) ,
125
- field. id ,
126
- DefPathData :: Field ( field. name ) ) ;
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 ) ) ;
119
+ }
127
120
}
128
121
}
129
122
}
130
- ItemStruct ( ref struct_def, _) => {
123
+ ItemKind :: Struct ( ref struct_def, _) => {
131
124
// If this is a tuple-like struct, register the constructor.
132
125
if !struct_def. is_struct ( ) {
133
126
self . create_def ( struct_def. id ( ) ,
134
127
DefPathData :: StructCtor ) ;
135
128
}
136
129
137
130
for field in struct_def. fields ( ) {
138
- self . create_def ( field. id , DefPathData :: Field ( field. name ) ) ;
131
+ if let Some ( ident) = field. ident {
132
+ self . create_def ( field. id , DefPathData :: Field ( ident. name ) ) ;
133
+ }
139
134
}
140
135
}
141
136
_ => { }
142
137
}
143
- intravisit :: walk_item ( self , i) ;
138
+ visit :: walk_item ( self , i) ;
144
139
self . parent_def = parent_def;
145
140
}
146
141
147
142
fn visit_foreign_item ( & mut self , foreign_item : & ' ast ForeignItem ) {
148
- let def = self . create_def ( foreign_item. id , DefPathData :: ValueNs ( foreign_item. name ) ) ;
143
+ let def = self . create_def ( foreign_item. id , DefPathData :: ValueNs ( foreign_item. ident . name ) ) ;
149
144
150
145
let parent_def = self . parent_def ;
151
146
self . parent_def = Some ( def) ;
152
- intravisit :: walk_foreign_item ( self , foreign_item) ;
147
+ visit :: walk_foreign_item ( self , foreign_item) ;
153
148
self . parent_def = parent_def;
154
149
}
155
150
156
151
fn visit_generics ( & mut self , generics : & ' ast Generics ) {
157
152
for ty_param in generics. ty_params . iter ( ) {
158
153
self . create_def ( ty_param. id ,
159
- DefPathData :: TypeParam ( ty_param. name ) ) ;
154
+ DefPathData :: TypeParam ( ty_param. ident . name ) ) ;
160
155
}
161
156
162
- intravisit :: walk_generics ( self , generics) ;
157
+ visit :: walk_generics ( self , generics) ;
163
158
}
164
159
165
160
fn visit_trait_item ( & mut self , ti : & ' ast TraitItem ) {
166
161
let def_data = match ti. node {
167
- MethodTraitItem ( ..) | ConstTraitItem ( ..) => DefPathData :: ValueNs ( ti. name ) ,
168
- TypeTraitItem ( ..) => DefPathData :: TypeNs ( ti. name ) ,
162
+ TraitItemKind :: Method ( ..) | TraitItemKind :: Const ( ..) =>
163
+ DefPathData :: ValueNs ( ti. ident . name ) ,
164
+ TraitItemKind :: Type ( ..) => DefPathData :: TypeNs ( ti. ident . name ) ,
169
165
} ;
170
166
171
167
let def = self . create_def ( ti. id , def_data) ;
@@ -174,21 +170,23 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
174
170
self . parent_def = Some ( def) ;
175
171
176
172
match ti. node {
177
- ConstTraitItem ( _, Some ( ref expr) ) => {
173
+ TraitItemKind :: Const ( _, Some ( ref expr) ) => {
178
174
self . create_def ( expr. id , DefPathData :: Initializer ) ;
179
175
}
180
176
_ => { }
181
177
}
182
178
183
- intravisit :: walk_trait_item ( self , ti) ;
179
+ visit :: walk_trait_item ( self , ti) ;
184
180
185
181
self . parent_def = parent_def;
186
182
}
187
183
188
184
fn visit_impl_item ( & mut self , ii : & ' ast ImplItem ) {
189
185
let def_data = match ii. node {
190
- ImplItemKind :: Method ( ..) | ImplItemKind :: Const ( ..) => DefPathData :: ValueNs ( ii. name ) ,
191
- ImplItemKind :: Type ( ..) => DefPathData :: TypeNs ( ii. name ) ,
186
+ ImplItemKind :: Method ( ..) | ImplItemKind :: Const ( ..) =>
187
+ DefPathData :: ValueNs ( ii. ident . name ) ,
188
+ ImplItemKind :: Type ( ..) => DefPathData :: TypeNs ( ii. ident . name ) ,
189
+ ImplItemKind :: Macro ( ..) => DefPathData :: MacroDef ( ii. ident . name ) ,
192
190
} ;
193
191
194
192
let def = self . create_def ( ii. id , def_data) ;
@@ -203,7 +201,7 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
203
201
_ => { }
204
202
}
205
203
206
- intravisit :: walk_impl_item ( self , ii) ;
204
+ visit :: walk_impl_item ( self , ii) ;
207
205
208
206
self . parent_def = parent_def;
209
207
}
@@ -220,35 +218,35 @@ impl<'ast> Visitor<'ast> for DefCollector<'ast> {
220
218
self . parent_def = Some ( def) ;
221
219
}
222
220
223
- intravisit :: walk_pat ( self , pat) ;
221
+ visit :: walk_pat ( self , pat) ;
224
222
self . parent_def = parent_def;
225
223
}
226
224
227
225
fn visit_expr ( & mut self , expr : & ' ast Expr ) {
228
226
let parent_def = self . parent_def ;
229
227
230
- if let ExprClosure ( ..) = expr. node {
228
+ if let ExprKind :: Closure ( ..) = expr. node {
231
229
let def = self . create_def ( expr. id , DefPathData :: ClosureExpr ) ;
232
230
self . parent_def = Some ( def) ;
233
231
}
234
232
235
- intravisit :: walk_expr ( self , expr) ;
233
+ visit :: walk_expr ( self , expr) ;
236
234
self . parent_def = parent_def;
237
235
}
238
236
239
237
fn visit_stmt ( & mut self , stmt : & ' ast Stmt ) {
240
- intravisit :: walk_stmt ( self , stmt) ;
238
+ visit :: walk_stmt ( self , stmt) ;
241
239
}
242
240
243
241
fn visit_block ( & mut self , block : & ' ast Block ) {
244
- intravisit :: walk_block ( self , block) ;
242
+ visit :: walk_block ( self , block) ;
245
243
}
246
244
247
245
fn visit_lifetime_def ( & mut self , def : & ' ast LifetimeDef ) {
248
246
self . create_def ( def. lifetime . id , DefPathData :: LifetimeDef ( def. lifetime . name ) ) ;
249
247
}
250
248
251
249
fn visit_macro_def ( & mut self , macro_def : & ' ast MacroDef ) {
252
- self . create_def ( macro_def. id , DefPathData :: MacroDef ( macro_def. name ) ) ;
250
+ self . create_def ( macro_def. id , DefPathData :: MacroDef ( macro_def. ident . name ) ) ;
253
251
}
254
252
}
0 commit comments