Rollup merge of #146403 - cyrgani:array-sugg-sorting, r=fee1-dead
sort array trait implementation suggestions correctly Fixes rust-lang/rust#135098. Previously tried in rust-lang/rust#137428.
This commit is contained in:
@@ -27,8 +27,8 @@ use rustc_middle::ty::print::{
|
|||||||
with_forced_trimmed_paths,
|
with_forced_trimmed_paths,
|
||||||
};
|
};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, TraitRef, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
|
self, GenericArgKind, TraitRef, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable,
|
||||||
Upcast,
|
TypeVisitableExt, Upcast,
|
||||||
};
|
};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::{BytePos, DUMMY_SP, STDLIB_STABLE_CRATES, Span, Symbol, sym};
|
use rustc_span::{BytePos, DUMMY_SP, STDLIB_STABLE_CRATES, Span, Symbol, sym};
|
||||||
@@ -2316,7 +2316,19 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||||||
cand
|
cand
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
impl_candidates.sort_by_key(|cand| (cand.similarity, cand.trait_ref.to_string()));
|
impl_candidates.sort_by_key(|cand| {
|
||||||
|
// When suggesting array types, sort them by the length of the array, not lexicographically (#135098)
|
||||||
|
let len = if let GenericArgKind::Type(ty) = cand.trait_ref.args[0].kind()
|
||||||
|
&& let ty::Array(_, len) = ty.kind()
|
||||||
|
{
|
||||||
|
// Deprioritize suggestions for parameterized arrays.
|
||||||
|
len.try_to_target_usize(self.tcx).unwrap_or(u64::MAX)
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
(cand.similarity, len, cand.trait_ref.to_string())
|
||||||
|
});
|
||||||
let mut impl_candidates: Vec<_> =
|
let mut impl_candidates: Vec<_> =
|
||||||
impl_candidates.into_iter().map(|cand| cand.trait_ref).collect();
|
impl_candidates.into_iter().map(|cand| cand.trait_ref).collect();
|
||||||
impl_candidates.dedup();
|
impl_candidates.dedup();
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ LL | <[X; 35] as Default>::default();
|
|||||||
&[T]
|
&[T]
|
||||||
&mut [T]
|
&mut [T]
|
||||||
[T; 0]
|
[T; 0]
|
||||||
[T; 10]
|
[T; 1]
|
||||||
[T; 11]
|
[T; 2]
|
||||||
[T; 12]
|
[T; 3]
|
||||||
[T; 13]
|
[T; 4]
|
||||||
[T; 14]
|
[T; 5]
|
||||||
and 27 others
|
and 27 others
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ LL | let _: &[i8] = data.into();
|
|||||||
| ^^^^ the trait `From<&[u8]>` is not implemented for `&[i8]`
|
| ^^^^ the trait `From<&[u8]>` is not implemented for `&[i8]`
|
||||||
|
|
|
|
||||||
= help: the following other types implement trait `From<T>`:
|
= help: the following other types implement trait `From<T>`:
|
||||||
`[T; 10]` implements `From<(T, T, T, T, T, T, T, T, T, T)>`
|
|
||||||
`[T; 11]` implements `From<(T, T, T, T, T, T, T, T, T, T, T)>`
|
|
||||||
`[T; 12]` implements `From<(T, T, T, T, T, T, T, T, T, T, T, T)>`
|
|
||||||
`[T; 1]` implements `From<(T,)>`
|
`[T; 1]` implements `From<(T,)>`
|
||||||
`[T; 2]` implements `From<(T, T)>`
|
`[T; 2]` implements `From<(T, T)>`
|
||||||
`[T; 3]` implements `From<(T, T, T)>`
|
`[T; 3]` implements `From<(T, T, T)>`
|
||||||
`[T; 4]` implements `From<(T, T, T, T)>`
|
`[T; 4]` implements `From<(T, T, T, T)>`
|
||||||
`[T; 5]` implements `From<(T, T, T, T, T)>`
|
`[T; 5]` implements `From<(T, T, T, T, T)>`
|
||||||
|
`[T; 6]` implements `From<(T, T, T, T, T, T)>`
|
||||||
|
`[T; 7]` implements `From<(T, T, T, T, T, T, T)>`
|
||||||
|
`[T; 8]` implements `From<(T, T, T, T, T, T, T, T)>`
|
||||||
and 6 others
|
and 6 others
|
||||||
= note: required for `&[u8]` to implement `Into<&[i8]>`
|
= note: required for `&[u8]` to implement `Into<&[i8]>`
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user