pretty: trim paths of unique symbols
If a symbol name can only be imported from one place for a type, and as long as it was not glob-imported anywhere in the current crate, we can trim its printed path and print only the name. This has wide implications on error messages with types, for example, shortening `std::vec::Vec` to just `Vec`, as long as there is no other `Vec` importable anywhere. This adds a new '-Z trim-diagnostic-paths=false' option to control this feature. On the good path, with no diagnosis printed, we should try to avoid issuing this query, so we need to prevent trimmed_def_paths query on several cases. This change also relies on a previous commit that differentiates between `Debug` and `Display` on various rustc types, where the latter is trimmed and presented to the user and the former is not.
This commit is contained in:
parent
7b2deb5628
commit
07e7823c01
1325 changed files with 4806 additions and 4546 deletions
|
@ -31,6 +31,7 @@ use rustc_middle::lint::LintDiagnosticBuilder;
|
|||
use rustc_middle::middle::privacy::AccessLevels;
|
||||
use rustc_middle::middle::stability;
|
||||
use rustc_middle::ty::layout::{LayoutError, TyAndLayout};
|
||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||
use rustc_middle::ty::{self, print::Printer, subst::GenericArg, Ty, TyCtxt};
|
||||
use rustc_session::lint::{add_elided_lifetime_in_path_suggestion, BuiltinLintDiagnostics};
|
||||
use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId};
|
||||
|
@ -795,10 +796,12 @@ impl<'tcx> LateContext<'tcx> {
|
|||
}
|
||||
|
||||
// This shouldn't ever be needed, but just in case:
|
||||
Ok(vec![match trait_ref {
|
||||
Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)),
|
||||
None => Symbol::intern(&format!("<{}>", self_ty)),
|
||||
}])
|
||||
with_no_trimmed_paths(|| {
|
||||
Ok(vec![match trait_ref {
|
||||
Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)),
|
||||
None => Symbol::intern(&format!("<{}>", self_ty)),
|
||||
}])
|
||||
})
|
||||
}
|
||||
|
||||
fn path_append_impl(
|
||||
|
@ -812,12 +815,16 @@ impl<'tcx> LateContext<'tcx> {
|
|||
|
||||
// This shouldn't ever be needed, but just in case:
|
||||
path.push(match trait_ref {
|
||||
Some(trait_ref) => Symbol::intern(&format!(
|
||||
"<impl {} for {}>",
|
||||
trait_ref.print_only_trait_path(),
|
||||
self_ty
|
||||
)),
|
||||
None => Symbol::intern(&format!("<impl {}>", self_ty)),
|
||||
Some(trait_ref) => with_no_trimmed_paths(|| {
|
||||
Symbol::intern(&format!(
|
||||
"<impl {} for {}>",
|
||||
trait_ref.print_only_trait_path(),
|
||||
self_ty
|
||||
))
|
||||
}),
|
||||
None => {
|
||||
with_no_trimmed_paths(|| Symbol::intern(&format!("<impl {}>", self_ty)))
|
||||
}
|
||||
});
|
||||
|
||||
Ok(path)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue