Skip to content

Commit 62a39ed

Browse files
committed
Extract parent def handling for infer failure err
1 parent b9d9776 commit 62a39ed

File tree

1 file changed

+20
-35
lines changed

1 file changed

+20
-35
lines changed

compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs

+20-35
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_middle::hir::map::Map;
1010
use rustc_middle::infer::unify_key::ConstVariableOriginKind;
1111
use rustc_middle::ty::print::Print;
1212
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};
1414
use rustc_span::source_map::DesugaringKind;
1515
use rustc_span::symbol::kw;
1616
use 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.
289290
pub 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+
323338
impl 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

Comments
 (0)