@@ -10,7 +10,7 @@ use rustc_middle::hir::map::Map;
1010use rustc_middle:: infer:: unify_key:: ConstVariableOriginKind ;
1111use rustc_middle:: ty:: print:: Print ;
1212use 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 } ;
1414use rustc_span:: source_map:: DesugaringKind ;
1515use rustc_span:: symbol:: kw;
1616use rustc_span:: Span ;
@@ -286,6 +286,7 @@ pub struct InferenceDiagnosticsData {
286286 pub parent : Option < InferenceDiagnosticsParentData > ,
287287}
288288
289+ /// Data on the parent definition where a generic argument was declared.
289290pub struct InferenceDiagnosticsParentData {
290291 pub prefix : & ' static str ,
291292 pub name : String ,
@@ -320,6 +321,20 @@ impl InferenceDiagnosticsData {
320321 }
321322}
322323
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+
323338impl UnderspecifiedArgKind {
324339 fn prefix_string ( & self ) -> Cow < ' static , str > {
325340 match self {
@@ -347,31 +362,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
347362 if let TypeVariableOriginKind :: TypeParameterDefinition ( name, def_id) =
348363 var_origin. kind
349364 {
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-
367365 if name != kw:: SelfUpper {
368366 return InferenceDiagnosticsData {
369367 name : name. to_string ( ) ,
370368 span : Some ( var_origin. span ) ,
371369 kind : UnderspecifiedArgKind :: Type {
372370 prefix : "type parameter" . into ( ) ,
373371 } ,
374- parent : parent_data,
372+ parent : def_id. and_then ( |def_id| {
373+ InferenceDiagnosticsParentData :: for_def_id ( self . tcx , def_id)
374+ } ) ,
375375 } ;
376376 }
377377 }
@@ -397,26 +397,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
397397 if let ConstVariableOriginKind :: ConstParameterDefinition ( name, def_id) =
398398 origin. kind
399399 {
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-
415400 return InferenceDiagnosticsData {
416401 name : name. to_string ( ) ,
417402 span : Some ( origin. span ) ,
418403 kind : UnderspecifiedArgKind :: Const { is_parameter : true } ,
419- parent : parent_data ,
404+ parent : InferenceDiagnosticsParentData :: for_def_id ( self . tcx , def_id ) ,
420405 } ;
421406 }
422407
0 commit comments