@@ -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