@@ -97,6 +97,31 @@ impl<'ast> DefCollector<'ast> {
9797 f ( self ) ;
9898 self . parent_def = parent;
9999 }
100+
101+ fn visit_ast_const_integer ( & mut self , expr : & ' ast Expr ) {
102+ // Find the node which will be used after lowering.
103+ if let ExprKind :: Paren ( ref inner) = expr. node {
104+ return self . visit_ast_const_integer ( inner) ;
105+ }
106+
107+ // FIXME(eddyb) Closures should have separate
108+ // function definition IDs and expression IDs.
109+ if let ExprKind :: Closure ( ..) = expr. node {
110+ return ;
111+ }
112+
113+ self . create_def ( expr. id , DefPathData :: Initializer ) ;
114+ }
115+
116+ fn visit_hir_const_integer ( & mut self , expr : & ' ast hir:: Expr ) {
117+ // FIXME(eddyb) Closures should have separate
118+ // function definition IDs and expression IDs.
119+ if let hir:: ExprClosure ( ..) = expr. node {
120+ return ;
121+ }
122+
123+ self . create_def ( expr. id , DefPathData :: Initializer ) ;
124+ }
100125}
101126
102127impl < ' ast > visit:: Visitor < ' ast > for DefCollector < ' ast > {
@@ -126,14 +151,17 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
126151 let variant_def_index =
127152 this. create_def ( v. node . data . id ( ) ,
128153 DefPathData :: EnumVariant ( v. node . name . name ) ) ;
129-
130- for ( index, field) in v. node . data . fields ( ) . iter ( ) . enumerate ( ) {
131- let name = field. ident . map ( |ident| ident. name )
132- . unwrap_or ( token:: intern ( & index. to_string ( ) ) ) ;
133- this. create_def_with_parent ( Some ( variant_def_index) ,
134- field. id ,
135- DefPathData :: Field ( name) ) ;
136- }
154+ this. with_parent ( variant_def_index, |this| {
155+ for ( index, field) in v. node . data . fields ( ) . iter ( ) . enumerate ( ) {
156+ let name = field. ident . map ( |ident| ident. name )
157+ . unwrap_or_else ( || token:: intern ( & index. to_string ( ) ) ) ;
158+ this. create_def ( field. id , DefPathData :: Field ( name) ) ;
159+ }
160+
161+ if let Some ( ref expr) = v. node . disr_expr {
162+ this. visit_ast_const_integer ( expr) ;
163+ }
164+ } ) ;
137165 }
138166 }
139167 ItemKind :: Struct ( ref struct_def, _) => {
@@ -221,6 +249,10 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
221249 fn visit_expr ( & mut self , expr : & ' ast Expr ) {
222250 let parent_def = self . parent_def ;
223251
252+ if let ExprKind :: Repeat ( _, ref count) = expr. node {
253+ self . visit_ast_const_integer ( count) ;
254+ }
255+
224256 if let ExprKind :: Closure ( ..) = expr. node {
225257 let def = self . create_def ( expr. id , DefPathData :: ClosureExpr ) ;
226258 self . parent_def = Some ( def) ;
@@ -230,6 +262,13 @@ impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
230262 self . parent_def = parent_def;
231263 }
232264
265+ fn visit_ty ( & mut self , ty : & ' ast Ty ) {
266+ if let TyKind :: FixedLengthVec ( _, ref length) = ty. node {
267+ self . visit_ast_const_integer ( length) ;
268+ }
269+ visit:: walk_ty ( self , ty) ;
270+ }
271+
233272 fn visit_lifetime_def ( & mut self , def : & ' ast LifetimeDef ) {
234273 self . create_def ( def. lifetime . id , DefPathData :: LifetimeDef ( def. lifetime . name ) ) ;
235274 }
@@ -276,11 +315,15 @@ impl<'ast> intravisit::Visitor<'ast> for DefCollector<'ast> {
276315 this. create_def ( v. node . data . id ( ) ,
277316 DefPathData :: EnumVariant ( v. node . name ) ) ;
278317
279- for field in v. node . data . fields ( ) {
280- this. create_def_with_parent ( Some ( variant_def_index) ,
281- field. id ,
282- DefPathData :: Field ( field. name ) ) ;
283- }
318+ this. with_parent ( variant_def_index, |this| {
319+ for field in v. node . data . fields ( ) {
320+ this. create_def ( field. id ,
321+ DefPathData :: Field ( field. name ) ) ;
322+ }
323+ if let Some ( ref expr) = v. node . disr_expr {
324+ this. visit_hir_const_integer ( expr) ;
325+ }
326+ } ) ;
284327 }
285328 }
286329 hir:: ItemStruct ( ref struct_def, _) => {
@@ -365,6 +408,10 @@ impl<'ast> intravisit::Visitor<'ast> for DefCollector<'ast> {
365408 fn visit_expr ( & mut self , expr : & ' ast hir:: Expr ) {
366409 let parent_def = self . parent_def ;
367410
411+ if let hir:: ExprRepeat ( _, ref count) = expr. node {
412+ self . visit_hir_const_integer ( count) ;
413+ }
414+
368415 if let hir:: ExprClosure ( ..) = expr. node {
369416 let def = self . create_def ( expr. id , DefPathData :: ClosureExpr ) ;
370417 self . parent_def = Some ( def) ;
@@ -374,11 +421,18 @@ impl<'ast> intravisit::Visitor<'ast> for DefCollector<'ast> {
374421 self . parent_def = parent_def;
375422 }
376423
424+ fn visit_ty ( & mut self , ty : & ' ast hir:: Ty ) {
425+ if let hir:: TyFixedLengthVec ( _, ref length) = ty. node {
426+ self . visit_hir_const_integer ( length) ;
427+ }
428+ intravisit:: walk_ty ( self , ty) ;
429+ }
430+
377431 fn visit_lifetime_def ( & mut self , def : & ' ast hir:: LifetimeDef ) {
378432 self . create_def ( def. lifetime . id , DefPathData :: LifetimeDef ( def. lifetime . name ) ) ;
379433 }
380434
381435 fn visit_macro_def ( & mut self , macro_def : & ' ast hir:: MacroDef ) {
382436 self . create_def ( macro_def. id , DefPathData :: MacroDef ( macro_def. name ) ) ;
383437 }
384- }
438+ }
0 commit comments