Fix outline panel issues in a multi-worktree set-up (#24538)
Closes https://github.com/zed-industries/zed/issues/22993 Properly calculates depth and maintains worktree order, when displaying multiple worktrees in the outline panel. Release Notes: - Fixed outline panel issues in a multi-worktree set-up
This commit is contained in:
parent
8f1ff189cc
commit
cf74d653bd
1 changed files with 298 additions and 44 deletions
|
@ -2,6 +2,7 @@ mod outline_panel_settings;
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
cmp,
|
cmp,
|
||||||
|
collections::BTreeMap,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
ops::Range,
|
ops::Range,
|
||||||
path::{Path, PathBuf, MAIN_SEPARATOR_STR},
|
path::{Path, PathBuf, MAIN_SEPARATOR_STR},
|
||||||
|
@ -2626,7 +2627,7 @@ impl OutlinePanel {
|
||||||
.spawn(async move {
|
.spawn(async move {
|
||||||
let mut processed_external_buffers = HashSet::default();
|
let mut processed_external_buffers = HashSet::default();
|
||||||
let mut new_worktree_entries =
|
let mut new_worktree_entries =
|
||||||
HashMap::<WorktreeId, HashMap<ProjectEntryId, GitEntry>>::default();
|
BTreeMap::<WorktreeId, HashMap<ProjectEntryId, GitEntry>>::default();
|
||||||
let mut worktree_excerpts = HashMap::<
|
let mut worktree_excerpts = HashMap::<
|
||||||
WorktreeId,
|
WorktreeId,
|
||||||
HashMap<ProjectEntryId, (BufferId, Vec<ExcerptId>)>,
|
HashMap<ProjectEntryId, (BufferId, Vec<ExcerptId>)>,
|
||||||
|
@ -3492,7 +3493,8 @@ impl OutlinePanel {
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
while let Some(parent) = parent_dirs.last() {
|
while let Some(parent) = parent_dirs.last() {
|
||||||
if directory_entry.entry.path.starts_with(&parent.path) {
|
if !is_root && directory_entry.entry.path.starts_with(&parent.path)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
parent_dirs.pop();
|
parent_dirs.pop();
|
||||||
|
@ -5156,6 +5158,7 @@ mod tests {
|
||||||
use project::FakeFs;
|
use project::FakeFs;
|
||||||
use search::project_search::{self, perform_project_search};
|
use search::project_search::{self, perform_project_search};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
use workspace::OpenVisible;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
@ -5212,7 +5215,7 @@ mod tests {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
let all_matches = r#"/
|
let all_matches = r#"/rust-analyzer/
|
||||||
crates/
|
crates/
|
||||||
ide/src/
|
ide/src/
|
||||||
inlay_hints/
|
inlay_hints/
|
||||||
|
@ -5247,9 +5250,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches(
|
select_first_in_all_matches(
|
||||||
"search: match config.param_names_for_lifetime_elision_hints {"
|
"search: match config.param_names_for_lifetime_elision_hints {"
|
||||||
|
@ -5261,9 +5266,11 @@ mod tests {
|
||||||
outline_panel.select_parent(&SelectParent, window, cx);
|
outline_panel.select_parent(&SelectParent, window, cx);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches("fn_lifetime_fn.rs")
|
select_first_in_all_matches("fn_lifetime_fn.rs")
|
||||||
);
|
);
|
||||||
|
@ -5277,12 +5284,14 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
format!(
|
format!(
|
||||||
r#"/
|
r#"/rust-analyzer/
|
||||||
crates/
|
crates/
|
||||||
ide/src/
|
ide/src/
|
||||||
inlay_hints/
|
inlay_hints/
|
||||||
|
@ -5312,9 +5321,11 @@ mod tests {
|
||||||
outline_panel.select_parent(&SelectParent, window, cx);
|
outline_panel.select_parent(&SelectParent, window, cx);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches("inlay_hints/")
|
select_first_in_all_matches("inlay_hints/")
|
||||||
);
|
);
|
||||||
|
@ -5324,9 +5335,11 @@ mod tests {
|
||||||
outline_panel.select_parent(&SelectParent, window, cx);
|
outline_panel.select_parent(&SelectParent, window, cx);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches("ide/src/")
|
select_first_in_all_matches("ide/src/")
|
||||||
);
|
);
|
||||||
|
@ -5341,12 +5354,14 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
format!(
|
format!(
|
||||||
r#"/
|
r#"/rust-analyzer/
|
||||||
crates/
|
crates/
|
||||||
ide/src/{SELECTED_MARKER}
|
ide/src/{SELECTED_MARKER}
|
||||||
rust-analyzer/src/
|
rust-analyzer/src/
|
||||||
|
@ -5367,9 +5382,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches("ide/src/")
|
select_first_in_all_matches("ide/src/")
|
||||||
);
|
);
|
||||||
|
@ -5426,7 +5443,7 @@ mod tests {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let all_matches = r#"/
|
let all_matches = r#"/rust-analyzer/
|
||||||
crates/
|
crates/
|
||||||
ide/src/
|
ide/src/
|
||||||
inlay_hints/
|
inlay_hints/
|
||||||
|
@ -5453,9 +5470,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
None,
|
None,
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
all_matches,
|
all_matches,
|
||||||
);
|
);
|
||||||
|
@ -5474,12 +5493,15 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
None,
|
None,
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
all_matches
|
all_matches
|
||||||
.lines()
|
.lines()
|
||||||
|
.skip(1) // `/rust-analyzer/` is a root entry with path `` and it will be filtered out
|
||||||
.filter(|item| item.contains(filter_text))
|
.filter(|item| item.contains(filter_text))
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join("\n"),
|
.join("\n"),
|
||||||
|
@ -5497,9 +5519,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
None,
|
None,
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
all_matches,
|
all_matches,
|
||||||
);
|
);
|
||||||
|
@ -5556,7 +5580,7 @@ mod tests {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let all_matches = r#"/
|
let all_matches = r#"/rust-analyzer/
|
||||||
crates/
|
crates/
|
||||||
ide/src/
|
ide/src/
|
||||||
inlay_hints/
|
inlay_hints/
|
||||||
|
@ -5598,9 +5622,11 @@ mod tests {
|
||||||
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry(),
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches(initial_outline_selection)
|
select_first_in_all_matches(initial_outline_selection)
|
||||||
);
|
);
|
||||||
|
@ -5619,9 +5645,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry(),
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches(navigated_outline_selection)
|
select_first_in_all_matches(navigated_outline_selection)
|
||||||
);
|
);
|
||||||
|
@ -5655,9 +5683,11 @@ mod tests {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry(),
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
select_first_in_all_matches(next_navigated_outline_selection)
|
select_first_in_all_matches(next_navigated_outline_selection)
|
||||||
);
|
);
|
||||||
|
@ -5690,9 +5720,11 @@ mod tests {
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry(),
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
"fn_lifetime_fn.rs <==== selected"
|
"fn_lifetime_fn.rs <==== selected"
|
||||||
);
|
);
|
||||||
|
@ -5704,6 +5736,176 @@ mod tests {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_multiple_workrees(cx: &mut TestAppContext) {
|
||||||
|
init_test(cx);
|
||||||
|
|
||||||
|
let fs = FakeFs::new(cx.background_executor.clone());
|
||||||
|
fs.insert_tree(
|
||||||
|
"/root",
|
||||||
|
json!({
|
||||||
|
"one": {
|
||||||
|
"a.txt": "aaa aaa"
|
||||||
|
},
|
||||||
|
"two": {
|
||||||
|
"b.txt": "a aaa"
|
||||||
|
}
|
||||||
|
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
let project = Project::test(fs.clone(), [Path::new("/root/one")], cx).await;
|
||||||
|
let workspace = add_outline_panel(&project, cx).await;
|
||||||
|
let cx = &mut VisualTestContext::from_window(*workspace, cx);
|
||||||
|
let outline_panel = outline_panel(&workspace, cx);
|
||||||
|
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
||||||
|
outline_panel.set_active(true, window, cx)
|
||||||
|
});
|
||||||
|
|
||||||
|
let items = workspace
|
||||||
|
.update(cx, |workspace, window, cx| {
|
||||||
|
workspace.open_paths(
|
||||||
|
vec![PathBuf::from("/root/two")],
|
||||||
|
OpenVisible::OnlyDirectories,
|
||||||
|
None,
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
.await;
|
||||||
|
assert_eq!(items.len(), 1, "Were opening another worktree directory");
|
||||||
|
assert!(
|
||||||
|
items[0].is_none(),
|
||||||
|
"Directory should be opened successfully"
|
||||||
|
);
|
||||||
|
|
||||||
|
workspace
|
||||||
|
.update(cx, |workspace, window, cx| {
|
||||||
|
ProjectSearchView::deploy_search(
|
||||||
|
workspace,
|
||||||
|
&workspace::DeploySearch::default(),
|
||||||
|
window,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
let search_view = workspace
|
||||||
|
.update(cx, |workspace, _, cx| {
|
||||||
|
workspace
|
||||||
|
.active_pane()
|
||||||
|
.read(cx)
|
||||||
|
.items()
|
||||||
|
.find_map(|item| item.downcast::<ProjectSearchView>())
|
||||||
|
.expect("Project search view expected to appear after new search event trigger")
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let query = "aaa";
|
||||||
|
perform_project_search(&search_view, query, cx);
|
||||||
|
search_view.update(cx, |search_view, cx| {
|
||||||
|
search_view
|
||||||
|
.results_editor()
|
||||||
|
.update(cx, |results_editor, cx| {
|
||||||
|
assert_eq!(
|
||||||
|
results_editor.display_text(cx).match_indices(query).count(),
|
||||||
|
3
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
cx.executor()
|
||||||
|
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
|
||||||
|
cx.run_until_parked();
|
||||||
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
|
assert_eq!(
|
||||||
|
display_entries(
|
||||||
|
&project,
|
||||||
|
&snapshot(&outline_panel, cx),
|
||||||
|
&outline_panel.cached_entries,
|
||||||
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
|
r#"/root/one/
|
||||||
|
a.txt
|
||||||
|
search: aaa aaa <==== selected
|
||||||
|
search: aaa aaa
|
||||||
|
/root/two/
|
||||||
|
b.txt
|
||||||
|
search: a aaa"#
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
||||||
|
outline_panel.select_prev(&SelectPrev, window, cx);
|
||||||
|
outline_panel.open(&Open, window, cx);
|
||||||
|
});
|
||||||
|
cx.executor()
|
||||||
|
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
|
||||||
|
cx.run_until_parked();
|
||||||
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
|
assert_eq!(
|
||||||
|
display_entries(
|
||||||
|
&project,
|
||||||
|
&snapshot(&outline_panel, cx),
|
||||||
|
&outline_panel.cached_entries,
|
||||||
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
|
r#"/root/one/
|
||||||
|
a.txt <==== selected
|
||||||
|
/root/two/
|
||||||
|
b.txt
|
||||||
|
search: a aaa"#
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
||||||
|
outline_panel.select_next(&SelectNext, window, cx);
|
||||||
|
outline_panel.open(&Open, window, cx);
|
||||||
|
});
|
||||||
|
cx.executor()
|
||||||
|
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
|
||||||
|
cx.run_until_parked();
|
||||||
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
|
assert_eq!(
|
||||||
|
display_entries(
|
||||||
|
&project,
|
||||||
|
&snapshot(&outline_panel, cx),
|
||||||
|
&outline_panel.cached_entries,
|
||||||
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
|
r#"/root/one/
|
||||||
|
a.txt
|
||||||
|
/root/two/ <==== selected"#
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
outline_panel.update_in(cx, |outline_panel, window, cx| {
|
||||||
|
outline_panel.open(&Open, window, cx);
|
||||||
|
});
|
||||||
|
cx.executor()
|
||||||
|
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
|
||||||
|
cx.run_until_parked();
|
||||||
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
|
assert_eq!(
|
||||||
|
display_entries(
|
||||||
|
&project,
|
||||||
|
&snapshot(&outline_panel, cx),
|
||||||
|
&outline_panel.cached_entries,
|
||||||
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
|
),
|
||||||
|
r#"/root/one/
|
||||||
|
a.txt
|
||||||
|
/root/two/ <==== selected
|
||||||
|
b.txt
|
||||||
|
search: a aaa"#
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
async fn test_navigating_in_singleton(cx: &mut TestAppContext) {
|
async fn test_navigating_in_singleton(cx: &mut TestAppContext) {
|
||||||
init_test(cx);
|
init_test(cx);
|
||||||
|
@ -5769,9 +5971,11 @@ struct OutlineEntryExcerpt {
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5794,9 +5998,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5819,9 +6025,11 @@ outline: struct OutlineEntryExcerpt <==== selected
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5844,9 +6052,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5869,9 +6079,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5894,9 +6106,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5919,9 +6133,11 @@ outline: struct OutlineEntryExcerpt <==== selected
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5944,9 +6160,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5969,9 +6187,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -5994,9 +6214,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -6019,9 +6241,11 @@ outline: struct OutlineEntryExcerpt <==== selected
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
"
|
"
|
||||||
|
@ -6123,11 +6347,13 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
r#"/
|
r#"/frontend-project/
|
||||||
public/lottie/
|
public/lottie/
|
||||||
syntax-tree.json
|
syntax-tree.json
|
||||||
search: { "something": "static" } <==== selected
|
search: { "something": "static" } <==== selected
|
||||||
|
@ -6158,11 +6384,13 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
r#"/
|
r#"/frontend-project/
|
||||||
public/lottie/
|
public/lottie/
|
||||||
syntax-tree.json
|
syntax-tree.json
|
||||||
search: { "something": "static" }
|
search: { "something": "static" }
|
||||||
|
@ -6184,11 +6412,13 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
r#"/
|
r#"/frontend-project/
|
||||||
public/lottie/
|
public/lottie/
|
||||||
syntax-tree.json
|
syntax-tree.json
|
||||||
search: { "something": "static" }
|
search: { "something": "static" }
|
||||||
|
@ -6214,11 +6444,13 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
r#"/
|
r#"/frontend-project/
|
||||||
public/lottie/
|
public/lottie/
|
||||||
syntax-tree.json
|
syntax-tree.json
|
||||||
search: { "something": "static" }
|
search: { "something": "static" }
|
||||||
|
@ -6243,11 +6475,13 @@ outline: struct OutlineEntryExcerpt
|
||||||
outline_panel.update(cx, |outline_panel, cx| {
|
outline_panel.update(cx, |outline_panel, cx| {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
display_entries(
|
display_entries(
|
||||||
|
&project,
|
||||||
&snapshot(&outline_panel, cx),
|
&snapshot(&outline_panel, cx),
|
||||||
&outline_panel.cached_entries,
|
&outline_panel.cached_entries,
|
||||||
outline_panel.selected_entry()
|
outline_panel.selected_entry(),
|
||||||
|
cx,
|
||||||
),
|
),
|
||||||
r#"/
|
r#"/frontend-project/
|
||||||
public/lottie/
|
public/lottie/
|
||||||
syntax-tree.json
|
syntax-tree.json
|
||||||
search: { "something": "static" }
|
search: { "something": "static" }
|
||||||
|
@ -6294,9 +6528,11 @@ outline: struct OutlineEntryExcerpt
|
||||||
}
|
}
|
||||||
|
|
||||||
fn display_entries(
|
fn display_entries(
|
||||||
|
project: &Entity<Project>,
|
||||||
multi_buffer_snapshot: &MultiBufferSnapshot,
|
multi_buffer_snapshot: &MultiBufferSnapshot,
|
||||||
cached_entries: &[CachedEntry],
|
cached_entries: &[CachedEntry],
|
||||||
selected_entry: Option<&PanelEntry>,
|
selected_entry: Option<&PanelEntry>,
|
||||||
|
cx: &mut App,
|
||||||
) -> String {
|
) -> String {
|
||||||
let mut display_string = String::new();
|
let mut display_string = String::new();
|
||||||
for entry in cached_entries {
|
for entry in cached_entries {
|
||||||
|
@ -6311,15 +6547,33 @@ outline: struct OutlineEntryExcerpt
|
||||||
FsEntry::ExternalFile(_) => {
|
FsEntry::ExternalFile(_) => {
|
||||||
panic!("Did not cover external files with tests")
|
panic!("Did not cover external files with tests")
|
||||||
}
|
}
|
||||||
FsEntry::Directory(directory) => format!(
|
FsEntry::Directory(directory) => {
|
||||||
|
match project
|
||||||
|
.read(cx)
|
||||||
|
.worktree_for_id(directory.worktree_id, cx)
|
||||||
|
.and_then(|worktree| {
|
||||||
|
if worktree.read(cx).root_entry() == Some(&directory.entry.entry) {
|
||||||
|
Some(worktree.read(cx).abs_path())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
Some(root_path) => format!(
|
||||||
|
"{}/{}",
|
||||||
|
root_path.display(),
|
||||||
|
directory.entry.path.display(),
|
||||||
|
),
|
||||||
|
None => format!(
|
||||||
"{}/",
|
"{}/",
|
||||||
directory
|
directory
|
||||||
.entry
|
.entry
|
||||||
.path
|
.path
|
||||||
.file_name()
|
.file_name()
|
||||||
.map(|name| name.to_string_lossy().to_string())
|
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
|
.to_string_lossy()
|
||||||
),
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
FsEntry::File(file) => file
|
FsEntry::File(file) => file
|
||||||
.entry
|
.entry
|
||||||
.path
|
.path
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue