mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Rollup merge of #128852 - folkertdev:multipart-suggestion-stable-sort, r=compiler-errors
use stable sort to sort multipart diagnostics I think a stable sort should be used to sort the different parts of a multipart selection. The current unstable sort uses the text of the suggestion as a tie-breaker. That just doesn't seem right, and the order of the input is a better choice I think, because it gives the diagnostic author more control. This came up when I was building a suggestion where ```rust fn foo() {} ``` must be turned into an unsafe function, and an attribute must be added ```rust #[target_feature(enable = "...")] unsafe fn foo() {} ``` In this example, the two suggestions occur at the same position, but the order is extremely important: unsafe must come after the attribute. But the situation changes if there is a pub/pub(crate), and if the unsafe is already present. It just out that because of the suggestion text, there is no way for me to order the suggestions correctly. This change probably should be tested, but are there tests of the diagnostics code itself in the tests? r? ```@estebank```
This commit is contained in:
commit
2066002b86
@ -1124,8 +1124,8 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
||||
err.multipart_suggestion(
|
||||
"consider moving the expression out of the loop so it is only moved once",
|
||||
vec![
|
||||
(parent.span, "value".to_string()),
|
||||
(span.shrink_to_lo(), format!("let mut value = {value};{indent}")),
|
||||
(parent.span, "value".to_string()),
|
||||
],
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
|
@ -920,8 +920,8 @@ impl<'a, G: EmissionGuarantee> Diag<'a, G> {
|
||||
applicability: Applicability,
|
||||
style: SuggestionStyle,
|
||||
) -> &mut Self {
|
||||
suggestion.sort_unstable();
|
||||
suggestion.dedup_by(|(s1, m1), (s2, m2)| s1.source_equal(*s2) && m1 == m2);
|
||||
let mut seen = crate::FxHashSet::default();
|
||||
suggestion.retain(|(span, msg)| seen.insert((span.lo(), span.hi(), msg.clone())));
|
||||
|
||||
let parts = suggestion
|
||||
.into_iter()
|
||||
|
Loading…
Reference in New Issue
Block a user