mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Unify long type name file and note in note_obligation_cause_code
This commit is contained in:
parent
c0ce0f3c3f
commit
a1dbb61c09
@ -16,6 +16,7 @@ use rustc_session::lint::builtin::UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES;
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
use rustc_span::Span;
|
||||
use std::iter;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::errors::{
|
||||
EmptyOnClauseInOnUnimplemented, InvalidOnClauseInOnUnimplemented, NoValueInOnUnimplemented,
|
||||
@ -111,6 +112,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||
obligation: &PredicateObligation<'tcx>,
|
||||
) -> OnUnimplementedNote {
|
||||
let mut long_ty_file = None;
|
||||
|
||||
let (def_id, args) = self
|
||||
.impl_similar_to(trait_ref, obligation)
|
||||
.unwrap_or_else(|| (trait_ref.def_id(), trait_ref.skip_binder().args));
|
||||
@ -265,7 +268,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}));
|
||||
|
||||
if let Ok(Some(command)) = OnUnimplementedDirective::of_item(self.tcx, def_id) {
|
||||
command.evaluate(self.tcx, trait_ref, &flags)
|
||||
command.evaluate(self.tcx, trait_ref, &flags, &mut long_ty_file)
|
||||
} else {
|
||||
OnUnimplementedNote::default()
|
||||
}
|
||||
@ -657,6 +660,7 @@ impl<'tcx> OnUnimplementedDirective {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
trait_ref: ty::TraitRef<'tcx>,
|
||||
options: &[(Symbol, Option<String>)],
|
||||
long_ty_file: &mut Option<PathBuf>,
|
||||
) -> OnUnimplementedNote {
|
||||
let mut message = None;
|
||||
let mut label = None;
|
||||
@ -681,7 +685,12 @@ impl<'tcx> OnUnimplementedDirective {
|
||||
span: cfg.span,
|
||||
is_diagnostic_namespace_variant: false
|
||||
}
|
||||
.format(tcx, trait_ref, &options_map)
|
||||
.format(
|
||||
tcx,
|
||||
trait_ref,
|
||||
&options_map,
|
||||
long_ty_file
|
||||
)
|
||||
)
|
||||
});
|
||||
|
||||
@ -710,10 +719,14 @@ impl<'tcx> OnUnimplementedDirective {
|
||||
}
|
||||
|
||||
OnUnimplementedNote {
|
||||
label: label.map(|l| l.format(tcx, trait_ref, &options_map)),
|
||||
message: message.map(|m| m.format(tcx, trait_ref, &options_map)),
|
||||
notes: notes.into_iter().map(|n| n.format(tcx, trait_ref, &options_map)).collect(),
|
||||
parent_label: parent_label.map(|e_s| e_s.format(tcx, trait_ref, &options_map)),
|
||||
label: label.map(|l| l.format(tcx, trait_ref, &options_map, long_ty_file)),
|
||||
message: message.map(|m| m.format(tcx, trait_ref, &options_map, long_ty_file)),
|
||||
notes: notes
|
||||
.into_iter()
|
||||
.map(|n| n.format(tcx, trait_ref, &options_map, long_ty_file))
|
||||
.collect(),
|
||||
parent_label: parent_label
|
||||
.map(|e_s| e_s.format(tcx, trait_ref, &options_map, long_ty_file)),
|
||||
append_const_msg,
|
||||
}
|
||||
}
|
||||
@ -815,6 +828,7 @@ impl<'tcx> OnUnimplementedFormatString {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
trait_ref: ty::TraitRef<'tcx>,
|
||||
options: &FxHashMap<Symbol, String>,
|
||||
long_ty_file: &mut Option<PathBuf>,
|
||||
) -> String {
|
||||
let name = tcx.item_name(trait_ref.def_id);
|
||||
let trait_str = tcx.def_path_str(trait_ref.def_id);
|
||||
@ -826,7 +840,7 @@ impl<'tcx> OnUnimplementedFormatString {
|
||||
let value = match param.kind {
|
||||
GenericParamDefKind::Type { .. } | GenericParamDefKind::Const { .. } => {
|
||||
if let Some(ty) = trait_ref.args[param.index as usize].as_type() {
|
||||
tcx.short_ty_string(ty, &mut None)
|
||||
tcx.short_ty_string(ty, long_ty_file)
|
||||
} else {
|
||||
trait_ref.args[param.index as usize].to_string()
|
||||
}
|
||||
|
@ -2676,6 +2676,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
) where
|
||||
T: ToPredicate<'tcx>,
|
||||
{
|
||||
let mut long_ty_file = None;
|
||||
|
||||
let tcx = self.tcx;
|
||||
let predicate = predicate.to_predicate(tcx);
|
||||
match *cause_code {
|
||||
@ -2858,21 +2860,13 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
}
|
||||
ObligationCauseCode::Coercion { source, target } => {
|
||||
let mut file = None;
|
||||
let source = tcx.short_ty_string(self.resolve_vars_if_possible(source), &mut file);
|
||||
let target = tcx.short_ty_string(self.resolve_vars_if_possible(target), &mut file);
|
||||
let source =
|
||||
tcx.short_ty_string(self.resolve_vars_if_possible(source), &mut long_ty_file);
|
||||
let target =
|
||||
tcx.short_ty_string(self.resolve_vars_if_possible(target), &mut long_ty_file);
|
||||
err.note(with_forced_trimmed_paths!(format!(
|
||||
"required for the cast from `{source}` to `{target}`",
|
||||
)));
|
||||
if let Some(file) = file {
|
||||
err.note(format!(
|
||||
"the full name for the type has been written to '{}'",
|
||||
file.display(),
|
||||
));
|
||||
err.note(
|
||||
"consider using `--verbose` to print the full type name to the console",
|
||||
);
|
||||
}
|
||||
}
|
||||
ObligationCauseCode::RepeatElementCopy {
|
||||
is_constable,
|
||||
@ -3175,8 +3169,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
// Don't print the tuple of capture types
|
||||
'print: {
|
||||
if !is_upvar_tys_infer_tuple {
|
||||
let mut file = None;
|
||||
let ty_str = tcx.short_ty_string(ty, &mut file);
|
||||
let ty_str = tcx.short_ty_string(ty, &mut long_ty_file);
|
||||
let msg = format!("required because it appears within the type `{ty_str}`");
|
||||
match ty.kind() {
|
||||
ty::Adt(def, _) => match tcx.opt_item_ident(def.did()) {
|
||||
@ -3274,9 +3267,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let mut parent_trait_pred =
|
||||
self.resolve_vars_if_possible(data.derived.parent_trait_pred);
|
||||
let parent_def_id = parent_trait_pred.def_id();
|
||||
let mut file = None;
|
||||
let self_ty_str =
|
||||
tcx.short_ty_string(parent_trait_pred.skip_binder().self_ty(), &mut file);
|
||||
let self_ty_str = tcx
|
||||
.short_ty_string(parent_trait_pred.skip_binder().self_ty(), &mut long_ty_file);
|
||||
let trait_name = parent_trait_pred.print_modifiers_and_trait_path().to_string();
|
||||
let msg = format!("required for `{self_ty_str}` to implement `{trait_name}`");
|
||||
let mut is_auto_trait = false;
|
||||
@ -3334,15 +3326,6 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(file) = file {
|
||||
err.note(format!(
|
||||
"the full type name has been written to '{}'",
|
||||
file.display(),
|
||||
));
|
||||
err.note(
|
||||
"consider using `--verbose` to print the full type name to the console",
|
||||
);
|
||||
}
|
||||
let mut parent_predicate = parent_trait_pred;
|
||||
let mut data = &data.derived;
|
||||
let mut count = 0;
|
||||
@ -3383,22 +3366,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
count,
|
||||
pluralize!(count)
|
||||
));
|
||||
let mut file = None;
|
||||
let self_ty =
|
||||
tcx.short_ty_string(parent_trait_pred.skip_binder().self_ty(), &mut file);
|
||||
let self_ty = tcx.short_ty_string(
|
||||
parent_trait_pred.skip_binder().self_ty(),
|
||||
&mut long_ty_file,
|
||||
);
|
||||
err.note(format!(
|
||||
"required for `{self_ty}` to implement `{}`",
|
||||
parent_trait_pred.print_modifiers_and_trait_path()
|
||||
));
|
||||
if let Some(file) = file {
|
||||
err.note(format!(
|
||||
"the full type name has been written to '{}'",
|
||||
file.display(),
|
||||
));
|
||||
err.note(
|
||||
"consider using `--verbose` to print the full type name to the console",
|
||||
);
|
||||
}
|
||||
}
|
||||
// #74711: avoid a stack overflow
|
||||
ensure_sufficient_stack(|| {
|
||||
@ -3507,8 +3482,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
ObligationCauseCode::OpaqueReturnType(expr_info) => {
|
||||
if let Some((expr_ty, expr_span)) = expr_info {
|
||||
let expr_ty =
|
||||
with_forced_trimmed_paths!(self.tcx.short_ty_string(expr_ty, &mut None));
|
||||
let expr_ty = self.tcx.short_ty_string(expr_ty, &mut long_ty_file);
|
||||
err.span_label(
|
||||
expr_span,
|
||||
with_forced_trimmed_paths!(format!(
|
||||
@ -3518,6 +3492,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(file) = long_ty_file {
|
||||
err.note(format!(
|
||||
"the full name for the type has been written to '{}'",
|
||||
file.display(),
|
||||
));
|
||||
err.note("consider using `--verbose` to print the full type name to the console");
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(
|
||||
|
@ -440,7 +440,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
)
|
||||
})
|
||||
.unwrap_or_default();
|
||||
let file_note = file.map(|file| format!(
|
||||
let file_note = file.as_ref().map(|file| format!(
|
||||
"the full trait has been written to '{}'",
|
||||
file.display(),
|
||||
));
|
||||
|
@ -15,6 +15,8 @@ LL | | )))))))))))
|
||||
|
|
||||
= help: the trait `std::fmt::Display` is not implemented for `Option<Option<Option<...>>>`
|
||||
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/traits/on_unimplemented_long_types/on_unimplemented_long_types.long-type-hash.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user