feat(project): Jump to Source in the project view menu; hide deleted files from Recent Files (#167)

The project view context menu gains Jump to Source (F4) for files. Recent Files
no longer lists files deleted since they were opened, including files removed
while the IDE was closed; virtual documents stay listed.
Цей коміт міститься в:
l0ng-ai authored and GitHub committed 2026-10-29 03:49:34 +08:00
1 джерело 097169cefc
коміт 2ec7f5d630
4 files changed
+27 -3

No files matched your search

+4 -2
Переглянути файл
@@ -218,9 +218,11 @@ impl ProjectIndex {
self.shared.enqueue(Job::SaveRecent);
}
/// Recently opened files, most recent first.
/// Recently opened files, most recent first; files deleted since (also while
/// the IDE was closed) are left out. Virtual documents are always listed.
pub fn recent_files(&self) -> Vec<PathBuf> {
self.shared.recent.lock().clone()
let recent = self.shared.recent.lock().clone();
recent.into_iter().filter(|p| p.to_str().is_some_and(ide_core::text::is_virtual_uri) || p.exists()).collect()
}
/// Blocks until the initial scan and every queued update has been applied
+13
Переглянути файл
@@ -178,6 +178,19 @@ fn symbol_ranking_is_idea_like() {
assert!(idx.find_symbols("", SymbolFilter::All, 5).is_empty());
}
#[test]
fn recent_files_skip_deleted_files_but_keep_virtual_documents() {
let fx = sample();
let idx = fx.open();
let app = fx.root.join("web/app.py");
let virt = PathBuf::from("jdt://contents/rt.jar/java.lang/String.class");
idx.mark_recent(&app);
idx.mark_recent(&virt);
assert_eq!(idx.recent_files(), vec![virt.clone(), app.clone()]);
std::fs::remove_file(&app).unwrap();
assert_eq!(idx.recent_files(), vec![virt]);
}
#[test]
fn persistence_skips_unchanged_files_on_reopen() {
let fx = sample();
+1
Переглянути файл
@@ -84,6 +84,7 @@ describe("project view context menu", () => {
"Copy Path/Reference…",
"Paste",
"-",
"Jump to Source",
"Find Usages",
"Find in Files…",
"Replace in Files…",
+9 -1
Переглянути файл
@@ -20,6 +20,7 @@ import {
findFileUsages,
folderOf,
openCopyDialog,
openFile,
openMoveDialog,
openRenameDialog,
paste,
@@ -196,8 +197,15 @@ export function contextMenuItems(nodes: ProjectNode[]): MenuItem[] {
{ kind: "separator" },
);
// Find Usages / Find in Files… / Replace in Files…
// Jump to Source / Find Usages / Find in Files… / Replace in Files…
push(
files.length > 0 && {
id: "jumpToSource",
label: "Jump to Source",
icon: "edit",
shortcut: keyLabel("project.open"),
run: () => files.forEach((f) => void openFile(f.path)),
},
inProject &&
singleFile && {
id: "findUsages",