@@ -216,93 +216,87 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
216
216
| Node :: Expr ( & Expr { kind : ExprKind :: Path ( _) , .. } )
217
217
| Node :: TraitRef ( ..) => {
218
218
let path = match parent_node {
219
- Node :: Ty ( & Ty {
220
- kind : TyKind :: Path ( QPath :: Resolved ( _, ref path) ) , ..
221
- } )
219
+ Node :: Ty ( & Ty { kind : TyKind :: Path ( QPath :: Resolved ( _, path) ) , .. } )
222
220
| Node :: Expr ( & Expr {
223
- kind : ExprKind :: Path ( QPath :: Resolved ( _, ref path) ) ,
221
+ kind :
222
+ ExprKind :: Path ( QPath :: Resolved ( _, path) )
223
+ | ExprKind :: Struct ( & QPath :: Resolved ( _, path) , ..) ,
224
224
..
225
- } ) => Some ( & * * path) ,
226
- Node :: Expr ( & Expr { kind : ExprKind :: Struct ( ref path, ..) , .. } ) => {
227
- if let QPath :: Resolved ( _, ref path) = * * path {
228
- Some ( & * * path)
229
- } else {
230
- None
231
- }
225
+ } )
226
+ | Node :: TraitRef ( & TraitRef { path, .. } ) => & * path,
227
+ _ => {
228
+ tcx. sess . delay_span_bug (
229
+ DUMMY_SP ,
230
+ & format ! ( "unexpected const parent path {:?}" , parent_node) ,
231
+ ) ;
232
+ return tcx. types . err ;
232
233
}
233
- Node :: TraitRef ( & TraitRef { ref path, .. } ) => Some ( & * * path) ,
234
- _ => None ,
235
234
} ;
236
235
237
- if let Some ( path) = path {
238
- // We've encountered an `AnonConst` in some path, so we need to
239
- // figure out which generic parameter it corresponds to and return
240
- // the relevant type.
241
-
242
- let ( arg_index, segment) = path
243
- . segments
244
- . iter ( )
245
- . filter_map ( |seg| seg. args . as_ref ( ) . map ( |args| ( args. args , seg) ) )
246
- . find_map ( |( args, seg) | {
247
- args. iter ( )
248
- . filter ( |arg| arg. is_const ( ) )
249
- . enumerate ( )
250
- . filter ( |( _, arg) | arg. id ( ) == hir_id)
251
- . map ( |( index, _) | ( index, seg) )
252
- . next ( )
253
- } )
254
- . unwrap_or_else ( || {
255
- bug ! ( "no arg matching AnonConst in path" ) ;
256
- } ) ;
257
-
258
- // Try to use the segment resolution if it is valid, otherwise we
259
- // default to the path resolution.
260
- let res = segment. res . filter ( |& r| r != Res :: Err ) . unwrap_or ( path. res ) ;
261
- let generics = match res {
262
- Res :: Def ( DefKind :: Ctor ( ..) , def_id) => {
263
- tcx. generics_of ( tcx. parent ( def_id) . unwrap ( ) )
264
- }
265
- Res :: Def ( _, def_id) => tcx. generics_of ( def_id) ,
266
- res => {
267
- tcx. sess . delay_span_bug (
268
- DUMMY_SP ,
269
- & format ! (
270
- "unexpected anon const res {:?} in path: {:?}" ,
271
- res, path,
272
- ) ,
273
- ) ;
274
- return tcx. types . err ;
236
+ // We've encountered an `AnonConst` in some path, so we need to
237
+ // figure out which generic parameter it corresponds to and return
238
+ // the relevant type.
239
+
240
+ let ( arg_index, segment) = path
241
+ . segments
242
+ . iter ( )
243
+ . filter_map ( |seg| seg. args . as_ref ( ) . map ( |args| ( args. args , seg) ) )
244
+ . find_map ( |( args, seg) | {
245
+ args. iter ( )
246
+ . filter ( |arg| arg. is_const ( ) )
247
+ . enumerate ( )
248
+ . filter ( |( _, arg) | arg. id ( ) == hir_id)
249
+ . map ( |( index, _) | ( index, seg) )
250
+ . next ( )
251
+ } )
252
+ . unwrap_or_else ( || {
253
+ bug ! ( "no arg matching AnonConst in path" ) ;
254
+ } ) ;
255
+
256
+ // Try to use the segment resolution if it is valid, otherwise we
257
+ // default to the path resolution.
258
+ let res = segment. res . filter ( |& r| r != Res :: Err ) . unwrap_or ( path. res ) ;
259
+ let generics = match res {
260
+ Res :: Def ( DefKind :: Ctor ( ..) , def_id) => {
261
+ tcx. generics_of ( tcx. parent ( def_id) . unwrap ( ) )
262
+ }
263
+ Res :: Def ( _, def_id) => tcx. generics_of ( def_id) ,
264
+ res => {
265
+ tcx. sess . delay_span_bug (
266
+ DUMMY_SP ,
267
+ & format ! (
268
+ "unexpected anon const res {:?} in path: {:?}" ,
269
+ res, path,
270
+ ) ,
271
+ ) ;
272
+ return tcx. types . err ;
273
+ }
274
+ } ;
275
+
276
+ let ty = generics
277
+ . params
278
+ . iter ( )
279
+ . filter ( |param| {
280
+ if let ty:: GenericParamDefKind :: Const = param. kind {
281
+ true
282
+ } else {
283
+ false
275
284
}
276
- } ;
285
+ } )
286
+ . nth ( arg_index)
287
+ . map ( |param| tcx. type_of ( param. def_id ) ) ;
277
288
278
- generics
279
- . params
280
- . iter ( )
281
- . filter ( |param| {
282
- if let ty:: GenericParamDefKind :: Const = param. kind {
283
- true
284
- } else {
285
- false
286
- }
287
- } )
288
- . nth ( arg_index)
289
- . map ( |param| tcx. type_of ( param. def_id ) )
290
- // This is no generic parameter associated with the arg. This is
291
- // probably from an extra arg where one is not needed.
292
- . unwrap_or_else ( || {
293
- tcx. sess . delay_span_bug (
294
- DUMMY_SP ,
295
- & format ! (
296
- "missing generic parameter for `AnonConst`, parent: {:?}, res: {:?}" ,
297
- parent_node, res
298
- ) ,
299
- ) ;
300
- tcx. types . err
301
- } )
289
+ if let Some ( ty) = ty {
290
+ ty
302
291
} else {
292
+ // This is no generic parameter associated with the arg. This is
293
+ // probably from an extra arg where one is not needed.
303
294
tcx. sess . delay_span_bug (
304
295
DUMMY_SP ,
305
- & format ! ( "unexpected const parent path {:?}" , parent_node, ) ,
296
+ & format ! (
297
+ "missing generic parameter for `AnonConst`, parent: {:?}, res: {:?}" ,
298
+ parent_node, res
299
+ ) ,
306
300
) ;
307
301
tcx. types . err
308
302
}
0 commit comments