Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #19161 from Veykril/push-prmuyxlnxzxo
fix: Improve sort order of runnables
Lukas Wirth 2025-02-16
parent 7128701 · parent e0d1fba · commit b332a05
-rw-r--r--crates/ide/src/annotations.rs74
-rw-r--r--crates/ide/src/runnables.rs4
2 files changed, 45 insertions, 33 deletions
diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs
index 006e6e8246..a0add4741f 100644
--- a/crates/ide/src/annotations.rs
+++ b/crates/ide/src/annotations.rs
@@ -1,6 +1,6 @@
use hir::{HasSource, InFile, InRealFile, Semantics};
use ide_db::{
- defs::Definition, helpers::visit_file_defs, FileId, FilePosition, FileRange, FxHashSet,
+ defs::Definition, helpers::visit_file_defs, FileId, FilePosition, FileRange, FxIndexSet,
RootDatabase,
};
use itertools::Itertools;
@@ -55,7 +55,7 @@ pub(crate) fn annotations(
config: &AnnotationConfig,
file_id: FileId,
) -> Vec<Annotation> {
- let mut annotations = FxHashSet::default();
+ let mut annotations = FxIndexSet::default();
if config.annotate_runnables {
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 {
@@ -537,6 +549,20 @@ fn main() {
},
Annotation {
range: 69..73,
+ kind: HasReferences {
+ pos: FilePositionWrapper {
+ file_id: FileId(
+ 0,
+ ),
+ offset: 69,
+ },
+ data: Some(
+ [],
+ ),
+ },
+ },
+ Annotation {
+ range: 69..73,
kind: Runnable(
Runnable {
use_name_in_title: false,
@@ -559,20 +585,6 @@ fn main() {
},
),
},
- Annotation {
- range: 69..73,
- kind: HasReferences {
- pos: FilePositionWrapper {
- file_id: FileId(
- 0,
- ),
- offset: 69,
- },
- data: Some(
- [],
- ),
- },
- },
]
"#]],
);
@@ -719,6 +731,20 @@ fn main() {
},
Annotation {
range: 61..65,
+ kind: HasReferences {
+ pos: FilePositionWrapper {
+ file_id: FileId(
+ 0,
+ ),
+ offset: 61,
+ },
+ data: Some(
+ [],
+ ),
+ },
+ },
+ Annotation {
+ range: 61..65,
kind: Runnable(
Runnable {
use_name_in_title: false,
@@ -741,20 +767,6 @@ fn main() {
},
),
},
- Annotation {
- range: 61..65,
- kind: HasReferences {
- pos: FilePositionWrapper {
- file_id: FileId(
- 0,
- ),
- offset: 61,
- },
- data: Some(
- [],
- ),
- },
- },
]
"#]],
);
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs
index 78c9f2309a..16dd039eab 100644
--- a/crates/ide/src/runnables.rs
+++ b/crates/ide/src/runnables.rs
@@ -13,7 +13,7 @@ use ide_db::{
documentation::docs_from_attrs,
helpers::visit_file_defs,
search::{FileReferenceNode, SearchScope},
- FilePosition, FxHashMap, FxHashSet, RootDatabase, SymbolKind,
+ FilePosition, FxHashMap, FxHashSet, FxIndexMap, RootDatabase, SymbolKind,
};
use itertools::Itertools;
use smallvec::SmallVec;
@@ -130,7 +130,7 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
let mut res = Vec::new();
// 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.
- 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| {
if let Some(runnable) = runnable.filter(|runnable| runnable.nav.file_id == file_id) {
if let Some(def) = def {