fix: Stabilize sort order of runnables

This commit is contained in:
Lukas Wirth 2025-02-16 12:20:41 +01:00
parent fb8bc313ff
commit e0d1fba739
2 changed files with 45 additions and 33 deletions

View File

@ -1,6 +1,6 @@
use hir::{HasSource, InFile, InRealFile, Semantics}; use hir::{HasSource, InFile, InRealFile, Semantics};
use ide_db::{ use ide_db::{
defs::Definition, helpers::visit_file_defs, FileId, FilePosition, FileRange, FxHashSet, defs::Definition, helpers::visit_file_defs, FileId, FilePosition, FileRange, FxIndexSet,
RootDatabase, RootDatabase,
}; };
use itertools::Itertools; use itertools::Itertools;
@ -55,7 +55,7 @@ pub(crate) fn annotations(
config: &AnnotationConfig, config: &AnnotationConfig,
file_id: FileId, file_id: FileId,
) -> Vec<Annotation> { ) -> Vec<Annotation> {
let mut annotations = FxHashSet::default(); let mut annotations = FxIndexSet::default();
if config.annotate_runnables { if config.annotate_runnables {
for runnable in runnables(db, file_id) { for runnable in runnables(db, file_id) {
@ -170,7 +170,19 @@ pub(crate) fn annotations(
})); }));
} }
annotations.into_iter().sorted_by_key(|a| (a.range.start(), a.range.end())).collect() annotations
.into_iter()
.sorted_by_key(|a| {
(
a.range.start(),
a.range.end(),
match &a.kind {
AnnotationKind::Runnable(runnable) => Some(runnable.nav.name.clone()),
_ => None,
},
)
})
.collect()
} }
pub(crate) fn resolve_annotation(db: &RootDatabase, mut annotation: Annotation) -> Annotation { pub(crate) fn resolve_annotation(db: &RootDatabase, mut annotation: Annotation) -> Annotation {
@ -535,6 +547,20 @@ fn main() {
), ),
}, },
}, },
Annotation {
range: 69..73,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 69,
},
data: Some(
[],
),
},
},
Annotation { Annotation {
range: 69..73, range: 69..73,
kind: Runnable( kind: Runnable(
@ -559,20 +585,6 @@ fn main() {
}, },
), ),
}, },
Annotation {
range: 69..73,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 69,
},
data: Some(
[],
),
},
},
] ]
"#]], "#]],
); );
@ -717,6 +729,20 @@ fn main() {
), ),
}, },
}, },
Annotation {
range: 61..65,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 61,
},
data: Some(
[],
),
},
},
Annotation { Annotation {
range: 61..65, range: 61..65,
kind: Runnable( kind: Runnable(
@ -741,20 +767,6 @@ fn main() {
}, },
), ),
}, },
Annotation {
range: 61..65,
kind: HasReferences {
pos: FilePositionWrapper {
file_id: FileId(
0,
),
offset: 61,
},
data: Some(
[],
),
},
},
] ]
"#]], "#]],
); );

View File

@ -13,7 +13,7 @@ use ide_db::{
documentation::docs_from_attrs, documentation::docs_from_attrs,
helpers::visit_file_defs, helpers::visit_file_defs,
search::{FileReferenceNode, SearchScope}, search::{FileReferenceNode, SearchScope},
FilePosition, FxHashMap, FxHashSet, RootDatabase, SymbolKind, FilePosition, FxHashMap, FxHashSet, FxIndexMap, RootDatabase, SymbolKind,
}; };
use itertools::Itertools; use itertools::Itertools;
use smallvec::SmallVec; use smallvec::SmallVec;
@ -130,7 +130,7 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
let mut res = Vec::new(); let mut res = Vec::new();
// Record all runnables that come from macro expansions here instead. // Record all runnables that come from macro expansions here instead.
// In case an expansion creates multiple runnables we want to name them to avoid emitting a bunch of equally named runnables. // In case an expansion creates multiple runnables we want to name them to avoid emitting a bunch of equally named runnables.
let mut in_macro_expansion = FxHashMap::<hir::HirFileId, Vec<Runnable>>::default(); let mut in_macro_expansion = FxIndexMap::<hir::HirFileId, Vec<Runnable>>::default();
let mut add_opt = |runnable: Option<Runnable>, def| { let mut add_opt = |runnable: Option<Runnable>, def| {
if let Some(runnable) = runnable.filter(|runnable| runnable.nav.file_id == file_id) { if let Some(runnable) = runnable.filter(|runnable| runnable.nav.file_id == file_id) {
if let Some(def) = def { if let Some(def) = def {