@@ -10,7 +10,7 @@ use rustc_middle::hir::map::Map;
10
10
use rustc_middle:: infer:: unify_key:: ConstVariableOriginKind ;
11
11
use rustc_middle:: ty:: print:: Print ;
12
12
use rustc_middle:: ty:: subst:: { GenericArg , GenericArgKind } ;
13
- use rustc_middle:: ty:: { self , DefIdTree , InferConst , Ty } ;
13
+ use rustc_middle:: ty:: { self , DefIdTree , InferConst , Ty , TyCtxt } ;
14
14
use rustc_span:: source_map:: DesugaringKind ;
15
15
use rustc_span:: symbol:: kw;
16
16
use rustc_span:: Span ;
@@ -286,6 +286,7 @@ pub struct InferenceDiagnosticsData {
286
286
pub parent : Option < InferenceDiagnosticsParentData > ,
287
287
}
288
288
289
+ /// Data on the parent definition where a generic argument was declared.
289
290
pub struct InferenceDiagnosticsParentData {
290
291
pub prefix : & ' static str ,
291
292
pub name : String ,
@@ -320,6 +321,20 @@ impl InferenceDiagnosticsData {
320
321
}
321
322
}
322
323
324
+ impl InferenceDiagnosticsParentData {
325
+ fn for_def_id ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> Option < InferenceDiagnosticsParentData > {
326
+ let parent_def_id = tcx. parent ( def_id) ?;
327
+
328
+ let parent_name =
329
+ tcx. def_key ( parent_def_id) . disambiguated_data . data . get_opt_name ( ) ?. to_string ( ) ;
330
+
331
+ Some ( InferenceDiagnosticsParentData {
332
+ prefix : tcx. def_kind ( parent_def_id) . descr ( parent_def_id) ,
333
+ name : parent_name,
334
+ } )
335
+ }
336
+ }
337
+
323
338
impl UnderspecifiedArgKind {
324
339
fn prefix_string ( & self ) -> Cow < ' static , str > {
325
340
match self {
@@ -347,31 +362,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
347
362
if let TypeVariableOriginKind :: TypeParameterDefinition ( name, def_id) =
348
363
var_origin. kind
349
364
{
350
- let parent_data = def_id
351
- . and_then ( |def_id| self . tcx . parent ( def_id) )
352
- . and_then ( |parent_def_id| {
353
- let parent_name = self
354
- . tcx
355
- . def_key ( parent_def_id)
356
- . disambiguated_data
357
- . data
358
- . get_opt_name ( ) ?
359
- . to_string ( ) ;
360
-
361
- Some ( InferenceDiagnosticsParentData {
362
- prefix : self . tcx . def_kind ( parent_def_id) . descr ( parent_def_id) ,
363
- name : parent_name,
364
- } )
365
- } ) ;
366
-
367
365
if name != kw:: SelfUpper {
368
366
return InferenceDiagnosticsData {
369
367
name : name. to_string ( ) ,
370
368
span : Some ( var_origin. span ) ,
371
369
kind : UnderspecifiedArgKind :: Type {
372
370
prefix : "type parameter" . into ( ) ,
373
371
} ,
374
- parent : parent_data,
372
+ parent : def_id. and_then ( |def_id| {
373
+ InferenceDiagnosticsParentData :: for_def_id ( self . tcx , def_id)
374
+ } ) ,
375
375
} ;
376
376
}
377
377
}
@@ -397,26 +397,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
397
397
if let ConstVariableOriginKind :: ConstParameterDefinition ( name, def_id) =
398
398
origin. kind
399
399
{
400
- let parent_data = self . tcx . parent ( def_id) . and_then ( |parent_def_id| {
401
- let parent_name = self
402
- . tcx
403
- . def_key ( parent_def_id)
404
- . disambiguated_data
405
- . data
406
- . get_opt_name ( ) ?
407
- . to_string ( ) ;
408
-
409
- Some ( InferenceDiagnosticsParentData {
410
- prefix : self . tcx . def_kind ( parent_def_id) . descr ( parent_def_id) ,
411
- name : parent_name,
412
- } )
413
- } ) ;
414
-
415
400
return InferenceDiagnosticsData {
416
401
name : name. to_string ( ) ,
417
402
span : Some ( origin. span ) ,
418
403
kind : UnderspecifiedArgKind :: Const { is_parameter : true } ,
419
- parent : parent_data ,
404
+ parent : InferenceDiagnosticsParentData :: for_def_id ( self . tcx , def_id ) ,
420
405
} ;
421
406
}
422
407
0 commit comments