diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 5f7dd97049..857c0a063f 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -2346,7 +2346,7 @@ impl BufferSnapshot { Some(items) } - /// Returns bracket range pairs overlapping `range` + /// Returns bracket range pairs overlapping or adjacent to `range` pub fn bracket_ranges<'a, T: ToOffset>( &'a self, range: Range, @@ -2355,7 +2355,7 @@ impl BufferSnapshot { let range = range.start.to_offset(self).saturating_sub(1) ..self.len().min(range.end.to_offset(self) + 1); - let mut matches = self.syntax.matches(range, &self.text, |grammar| { + let mut matches = self.syntax.matches(range.clone(), &self.text, |grammar| { grammar.brackets_config.as_ref().map(|c| &c.query) }); let configs = matches @@ -2380,6 +2380,12 @@ impl BufferSnapshot { matches.advance(); let Some((open, close)) = open.zip(close) else { continue }; + + let bracket_range = open.start..=close.end; + if !bracket_range.contains(&range.start) && !bracket_range.contains(&range.end) { + continue; + } + return Some((open, close)); } None diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index a24c7e227f..e6e7544763 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -578,7 +578,7 @@ async fn test_symbols_containing(cx: &mut gpui::TestAppContext) { #[gpui::test] fn test_enclosing_bracket_ranges(cx: &mut MutableAppContext) { let mut assert = |selection_text, range_markers| { - assert_enclosing_bracket_pairs(selection_text, range_markers, rust_lang(), cx) + assert_bracket_pairs(selection_text, range_markers, rust_lang(), cx) }; assert( @@ -696,7 +696,7 @@ fn test_enclosing_bracket_ranges_where_brackets_are_not_outermost_children( cx: &mut MutableAppContext, ) { let mut assert = |selection_text, bracket_pair_texts| { - assert_enclosing_bracket_pairs(selection_text, bracket_pair_texts, javascript_lang(), cx) + assert_bracket_pairs(selection_text, bracket_pair_texts, javascript_lang(), cx) }; assert( @@ -710,6 +710,7 @@ fn test_enclosing_bracket_ranges_where_brackets_are_not_outermost_children( }"}], ); + eprintln!("-----------------------"); // Regression test: even though the parent node of the parentheses (the for loop) does // intersect the given range, the parentheses themselves do not contain the range, so // they should not be returned. Only the curly braces contain the range. @@ -2047,7 +2048,7 @@ fn get_tree_sexp(buffer: &ModelHandle, cx: &gpui::TestAppContext) -> Str } // Assert that the enclosing bracket ranges around the selection match the pairs indicated by the marked text in `range_markers` -fn assert_enclosing_bracket_pairs( +fn assert_bracket_pairs( selection_text: &'static str, bracket_pair_texts: Vec<&'static str>, language: Language, diff --git a/crates/util/Cargo.toml b/crates/util/Cargo.toml index 4cbaa382e8..e8c158b637 100644 --- a/crates/util/Cargo.toml +++ b/crates/util/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" publish = false [lib] +path = "src/util.rs" doctest = false [features] @@ -22,7 +23,6 @@ serde_json = { version = "1.0", features = ["preserve_order"], optional = true } git2 = { version = "0.15", default-features = false, optional = true } dirs = "3.0" - [dev-dependencies] tempdir = { version = "0.3.7" } serde_json = { version = "1.0", features = ["preserve_order"] } diff --git a/crates/util/src/lib.rs b/crates/util/src/util.rs similarity index 100% rename from crates/util/src/lib.rs rename to crates/util/src/util.rs diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 8d81ae7f2e..95969de6b0 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -101,6 +101,7 @@ actions!( NewTerminal, NewSearch, Feedback, + Restart ] ); @@ -1329,7 +1330,19 @@ impl Workspace { focus_item: bool, cx: &mut ViewContext, ) -> Task, anyhow::Error>> { - let pane = pane.unwrap_or_else(|| self.active_pane().downgrade()); + let pane = pane.unwrap_or_else(|| { + if !self.dock_active() { + self.active_pane().downgrade() + } else { + self.last_active_center_pane.clone().unwrap_or_else(|| { + self.panes + .first() + .expect("There must be an active pane") + .downgrade() + }) + } + }); + let task = self.load_path(path.into(), cx); cx.spawn(|this, mut cx| async move { let (project_entry_id, build_item) = task.await?; @@ -1636,6 +1649,10 @@ impl Workspace { self.dock.pane() } + fn dock_active(&self) -> bool { + &self.active_pane == self.dock.pane() + } + fn project_remote_id_changed(&mut self, remote_id: Option, cx: &mut ViewContext) { if let Some(remote_id) = remote_id { self.remote_entity_subscription =